文章目录
- 导出和导入容器
- 慎用docker commit
- 使用dockerfile定制镜像
- 参考
导出和导入容器
- 导出:
docker export ${容器id} > ${文件名}.tar
eg. docker export 7691a814370e > ubuntu.tar
- 导入容器快照:
docker import ${文件名}.tar [可选:仓库名:tag]
eg. docker import ubuntu.tar test/ubuntu:v1.0
注:既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。因此,为了避免容器体积过大,还是保存容器吧。
慎用docker commit
- 使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
- docker comit不仅仅是保存了我们想要保存的操作,而且很多文件会被改动或添加。增加的是大量的无关内容,这会导致镜像极为臃肿。
- 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体的操作。这种黑箱镜像的维护工作是非常痛苦的。
- 镜像使用的是分层存储的概念,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。
使用dockerfile定制镜像
- 从docker commit 可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
- Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
以定制 nginx 镜像为例,这次我们使用 Dockerfile 来定制。在一个空白目录中,建立一个文本文件,并命名为 Dockerfile。里面的内容是:
FROM nginx RUN \
echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
- 在 Dockerfile 文件所在目录执行:
docker build -t nginx:v3 .
docker bulid的格式是:docker build [选项] <上下文路径/URL/->
在这里我们指定了最终镜像的名称 -t nginx:v3
参考