🍁博客主页:
👉@不会压弯的小飞侠
✨欢迎关注:
👉
点赞
👍
收藏
⭐
留言
✒
✨系列专栏:
👉Docker学习专栏
✨学习社区:
👉不会压弯的小飞侠
✨知足上进,不负野心。
🔥
欢迎大佬指正,一起学习!一起加油!
目录
Docker 相比于其他虚拟化软件更快的环境迁移和部署,在这件事情上,轻量级的容器和镜像结构的设计无疑发挥了巨大的作用。通过将容器打包成镜像,再利用体积远小于其他虚拟化软件的 Docker 镜像,可以更快的将它们复制到其他的机器上。
🍁提交容器更改
Docker 镜像的本质是多个基于 UnionFS 的镜像层依次挂载的结果,而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。
基于这样的结构,Docker 中为我们提供了将容器中的这个可读可写的沙盒环境持久化为一个镜像层的方法。更浅显的说,能够很轻松的在 Docker 里将容器内的修改记录下来,保存为一个新的镜像。
将容器修改的内容保存为镜像的命令是 docker commit,由于镜像的结构很像代码仓库里的修改记录,而记录容器修改的过程又像是在提交代码,所以这里更形象的称之为提交容器的更改。
$ sudo docker commit webapp
sha256:0bc42f7ff218029c6c4199ab5c75ab83aeaaed3b5c731f715a3e807dda61d19e
Docker 执行将容器内沙盒文件系统记录成镜像层的时候,会先暂停容器的运行,以保证容器内的文件系统处于一个相对稳定的状态,确保数据的一致性。
在使用 docker commit 提交镜像更新后,可以得到 Docker 创建的新镜像的 ID,之后也能够从本地镜像列表中找到它。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 0bc42f7ff218 3 seconds ago 372MB
## ......
像通过 Git 等代码仓库软件提交代码一样,还能在提交容器更改的时候给出一个提交信息,方便以后查询。
$ sudo docker commit -m "Configured" webapp
🍁为镜像命名
提交容器更新后产生的镜像并没 REPOSITORY 和 TAG 的内容,也就是说,这个新的镜像还没有名字。使用没有名字的镜像并不是很好的选择,因为无法直观的看到我们正在使用什么。好在 Docker 提供了一个为镜像取名的命令,也就是 docker tag 命令。
$ sudo docker tag 0bc42f7ff218 webapp:1.0
使用 docker tag 能够为未命名的镜像指定镜像名,也能够对已有的镜像创建一个新的命名。
$ sudo docker tag webapp:1.0 webapp:latest
当对未命名的镜像进行命名后,Docker 就不会在镜像列表里继续显示这个镜像,取而代之的是新的命名。而如果对以后镜像使用 docker tag,旧的镜像依然会存在于镜像列表中。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
webapp 1.0 0bc42f7ff218 29 minutes ago 372MB
webapp latest 0bc42f7ff218 29 minutes ago 372MB
## ......
由于镜像是对镜像层的引用记录,所以对镜像进行命名后,虽然能够在镜像列表里同时看到新老两个镜像,实质是它们其实引用着相同的镜像层,这个能够从镜像 ID 中看得出来 ( 因为镜像 ID 就是最上层镜像层的 ID )。正是这个原因,虽然创建了新的镜像,但对物理存储的占用空间却不是镜像大小直接翻倍,并且创建也在霎那之间。
除了使用 docker tag 在容器提交为新的镜像后为镜像命名这种方式外,还可以直接在 docker commit 命令里指定新的镜像名,这种方式在使用容器提交时会更加方便。
$ sudo docker commit -m "Upgrade" webapp webapp:2.0
版权归原作者 不会压弯的小飞侠 所有, 如有侵权,请联系我们删除。