Docker-镜像以及容器管理

First Post:

Last Update:

Word Count:
1.3k

Read Time:
4 min

Docker - 镜像以及容器管理

Docker将容器打包成镜像,体积远小于其他虚拟化软件,可以更快的分发部署,轻量级的容器和镜像结构发挥了巨大作用。

一、保存容器更改

Docker镜像的本质是多个基于UnionFS的镜像层依次挂载的结果,而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。

基于镜像结构,Docker提供了将容器中的这个可读可写的沙盒环境持久化为一个镜像层的方法。能够很轻松的在Docker里将容器内的修改记录下来,保存为一个新的镜像。

通过docker commit命令,可以将容器修改的内容保存为镜像,由于镜像的结构很像代码仓库里的修改记录,而记录容器修改的过程又像是在提交代码,所以可以更形象的称之为提交容器的更改。

1
2
docker commit webapp
sha256:0bc42f7ff218029c6c4199ab5c75ab83aeaaed3b5c731f715a3e807dda61d19e

Docker将容器内沙盒文件系统记录成镜像层的时候,会先暂停容器的运行,以保证容器内的文件系统处于一个相对稳定的状态,确保数据的一致性。

提交镜像更新后,可以得到Docker创建的新镜像的ID,可以本地镜像列表中找到它。

1
2
3
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 0bc42f7ff218 3 seconds ago 372MB

类似通过Git提交代码一样,还能在提交容器更改时附加提交信息,方便以后查询。

1
docker commit -m "configured" webapp

二、镜像命名

提交容器更新后产生的镜像并没REPOSITORYTAG内容,新的镜像还没有名字。

通过docker tag命令,能够为未命名的镜像指定镜像名,也能够对已有的镜像创建一个新的命名。

1
2
docker tag 0bc42f7ff218 webapp:1.0
docker tag webapp:1.0 webapp:latest

对未命名的镜像进行命名后,Docker就不会在镜像列表里继续显示这个镜像,取而代之的是新的命名。

1
2
3
4
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
webapp 1.0 0bc42f7ff218 29 minutes ago 372MB
webapp latest 0bc42f7ff218 29 minutes ago 372MB

由于镜像是对镜像层的引用记录,所以对镜像进行命名后,能够在镜像列表里同时看到新老两个镜像,实质是它们其实引用着相同的镜像层,这个能够从镜像ID中看得出来。

除了使用docker tag在容器提交为新的镜像后为镜像命名这种方式外,还可以直接在docker commit命令里指定新的镜像名,这种方式在使用容器提交时更加方便。

1
docker commit -m "upgrade" webapp webapp:2.0

三、镜像迁移

将更新导出为镜像后,就可以开始镜像迁移。

由于Docker以集中的方式管理镜像的,所以在迁移之前,需要先从Docker中取出镜像。docker save命令可以将镜像输出,提供了保存镜像到Docker外部的方式。

1
docker save webapp:1.0 > webapp-1.0.tar

默认定义下,docker save命令会将镜像内容放入输出流中,这种用法有时不太友好,docker save命令还提供了**-o**选项,用来指定输出文件,使用这个选项可以让命令更具有统一性。

1
docker save -o ./webapp-1.0.tar webapp:1.0

镜像导出之后可以找到已经存储镜像内容的webapp-1.0.tar文件。通过解压软件查看其中的内容,会看到里面就是镜像所基于的几个镜像层的记录文件。

四、导入镜像

可以通过很多种方式将导出的镜像文件复制到另一台机器上,之后将镜像导入到新机器中运行的Docker中。使用与docker save相对的docker load命令即可。

1
docker load < webapp-1.0.tar

docker load从输入流中读取镜像的数据,也能够使用**-i**选项指定输入文件。

1
docker load -i webapp-1.0.tar

镜像导入后,就可以通过docker images看到,导入的镜像会延用原有的镜像名称。

五、批量迁移

通过docker save和docker load命令还能够批量迁移镜像,只要在docker save中传入多个镜像名作为参数,它就能够将这些镜像都打成一个包,便于一次性迁移多个镜像。

1
docker save -o ./images.tar webapp:1.0 nginx:1.12 mysql:5.7

装有多个镜像的包可以直接被docker load识别和读取,将这个包导入后,其中所有镜像都会被导入到Docker之中。

六、导出和导入容器

提交镜像修改,再导出镜像进行迁移的方法还不够效率,使用docker export命令可以直接导出容器,把它简单的理解为docker commit与docker save的结合体。

1
docker export -o ./webapp.tar webapp

相对的,使用docker export导出的容器包,需要使用docker import导入,导入的结果还是一个镜像,而不是容器。

打赏点小钱
支付宝 | Alipay
微信 | WeChat