利用 docker commit 理解镜像分层构建


当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

docker commit 命令的语法格式如下:

docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

我们来演示下该命令的使用。

首先,我们启动一个 nginx 容器,并将其命名为 webserver

docker run --name webserver -d -p 80:80 nginx

接下来,我们就可以通过 http://localhost 访问 nginx 容器的欢迎首页:

nginx默认首页

下面,我们通过 docker exec 进入容器,并修改 nginx 默认首页:

进入nginx容器修改内容

然后退出容器并通过 docker commit 提交此次更改:

docker commit --author "学院君<yaojinbu@163.com>" --message "修改了默认网页" webserver nginx

重新启动 nginx 容器:

docker run --name web2 -d -p 81:80 nginx

再次访问首页,就可以看到新的修改后的欢迎页面了:

修改后的nginx欢迎页面

慎用 docker commit

使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用,原因如下:

  • 除了真正修改的文件之外,还有很多其他文件被修改或添加,对于更复杂的操作,会导致镜像臃肿;
  • 使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,维护困难;
  • 任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层,也会导致镜像臃肿。

那么实际环境中我们怎么通过分层来构建镜像呢,这就是我们下一篇要介绍的 Dockerfile


Vote Vote Cancel Collect Collect Cancel

<< 上一篇: 镜像的基本使用

>> 下一篇: 使用 Dockerfile 定制镜像