Docker-镜像以及容器管理
Last Update:
Word Count:
Read Time:
Docker - 镜像以及容器管理
Docker将容器打包成镜像,体积远小于其他虚拟化软件,可以更快的分发部署,轻量级的容器和镜像结构发挥了巨大作用。
一、保存容器更改
Docker镜像的本质是多个基于UnionFS的镜像层依次挂载的结果,而容器的文件系统则是在以只读方式挂载镜像后增加的一个可读可写的沙盒环境。
基于镜像结构,Docker提供了将容器中的这个可读可写的沙盒环境持久化为一个镜像层的方法。能够很轻松的在Docker里将容器内的修改记录下来,保存为一个新的镜像。
通过docker commit命令,可以将容器修改的内容保存为镜像,由于镜像的结构很像代码仓库里的修改记录,而记录容器修改的过程又像是在提交代码,所以可以更形象的称之为提交容器的更改。
1 |
|
Docker将容器内沙盒文件系统记录成镜像层的时候,会先暂停容器的运行,以保证容器内的文件系统处于一个相对稳定的状态,确保数据的一致性。
提交镜像更新后,可以得到Docker创建的新镜像的ID,可以本地镜像列表中找到它。
1 |
|
类似通过Git提交代码一样,还能在提交容器更改时附加提交信息,方便以后查询。
1 |
|
二、镜像命名
提交容器更新后产生的镜像并没REPOSITORY和TAG内容,新的镜像还没有名字。
通过docker tag命令,能够为未命名的镜像指定镜像名,也能够对已有的镜像创建一个新的命名。
1 |
|
对未命名的镜像进行命名后,Docker就不会在镜像列表里继续显示这个镜像,取而代之的是新的命名。
1 |
|
由于镜像是对镜像层的引用记录,所以对镜像进行命名后,能够在镜像列表里同时看到新老两个镜像,实质是它们其实引用着相同的镜像层,这个能够从镜像ID中看得出来。
除了使用docker tag在容器提交为新的镜像后为镜像命名这种方式外,还可以直接在docker commit命令里指定新的镜像名,这种方式在使用容器提交时更加方便。
1 |
|
三、镜像迁移
将更新导出为镜像后,就可以开始镜像迁移。
由于Docker以集中的方式管理镜像的,所以在迁移之前,需要先从Docker中取出镜像。docker save命令可以将镜像输出,提供了保存镜像到Docker外部的方式。
1 |
|
默认定义下,docker save命令会将镜像内容放入输出流中,这种用法有时不太友好,docker save命令还提供了**-o**选项,用来指定输出文件,使用这个选项可以让命令更具有统一性。
1 |
|
镜像导出之后可以找到已经存储镜像内容的webapp-1.0.tar文件。通过解压软件查看其中的内容,会看到里面就是镜像所基于的几个镜像层的记录文件。
四、导入镜像
可以通过很多种方式将导出的镜像文件复制到另一台机器上,之后将镜像导入到新机器中运行的Docker中。使用与docker save相对的docker load命令即可。
1 |
|
docker load从输入流中读取镜像的数据,也能够使用**-i**选项指定输入文件。
1 |
|
镜像导入后,就可以通过docker images看到,导入的镜像会延用原有的镜像名称。
五、批量迁移
通过docker save和docker load命令还能够批量迁移镜像,只要在docker save中传入多个镜像名作为参数,它就能够将这些镜像都打成一个包,便于一次性迁移多个镜像。
1 |
|
装有多个镜像的包可以直接被docker load识别和读取,将这个包导入后,其中所有镜像都会被导入到Docker之中。
六、导出和导入容器
提交镜像修改,再导出镜像进行迁移的方法还不够效率,使用docker export命令可以直接导出容器,把它简单的理解为docker commit与docker save的结合体。
1 |
|
相对的,使用docker export导出的容器包,需要使用docker import导入,导入的结果还是一个镜像,而不是容器。