Docker 提供了两种构建镜像的方法:
docker commit 命令
过程:运行容器——修改容器——保存为新的镜像
docker commit oldname newname
Dockerfile 构建镜像
Dockerfile 是一个文本文件,记录了镜像构建的所有步骤。
1.当前目录为/root
2.编写Dockerfile文件
3.编译镜像
docker build -t ubuntu-with-vi-dockerfile .
运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。
从这步开始就是镜像真正的构建过程。 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。
Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。
所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。
Step 1:执行 FROM,将 ubuntu 作为 base 镜像。
ubuntu 镜像 ID 为20c44cd7596f。
Step 2:执行 RUN,安装 vim。启动 ID 为09888f68d9e3 的临时容器,在容器中通过 apt-get 安装 vim。
安装成功后,将容器保存为镜像,其 ID 为 4cffcab53eda.
删除临时容器 09888f68d9e3 ,镜像构建成功。
查看镜像分层结构
ubuntu-with-vi-dockerfile 是通过在 base 镜像的顶部添加一个新的镜像层而得到的。
这个新镜像层的内容由 RUN apt-get update && apt-get install -y vim 生成。这一点我们可以通过 docker history 命令验证。
docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程。
镜像的缓存特性
之前已经运行过相同的 RUN 指令,这次直接使用缓存中的镜像层 4cffcab53eda。
在 ubuntu-with-vi-dockerfile 镜像上直接添加一层就得到了新的镜像 ubuntu-with-vi-dockerfile-2。
调试 Dockerfile
Dockerfile 中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。
也就是说,如果我们改变 Dockerfile 指令的执行顺序,或者修改或添加指令,都会使缓存失效。
可通过docker run -it 出错镜像id 进行调试