利用 docker commit 理解镜像分层构建
当我们运行一个容器的时候(如果不使用卷的话),我们做的任何文件修改都会被记录于容器存储层里。而 Docker 提供了一个 docker commit
命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit
命令的语法格式如下:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
我们来演示下该命令的使用。
首先,我们启动一个 nginx
容器,并将其命名为 webserver
:
docker run --name webserver -d -p 80:80 nginx
接下来,我们就可以通过 http://localhost
访问 nginx
容器的欢迎首页:
下面,我们通过 docker exec
进入容器,并修改 nginx 默认首页:
然后退出容器并通过 docker commit
提交此次更改:
docker commit --author "学院君<yaojinbu@163.com>" --message "修改了默认网页" webserver nginx
重新启动 nginx
容器:
docker run --name web2 -d -p 81:80 nginx
再次访问首页,就可以看到新的修改后的欢迎页面了:
慎用 docker commit
使用 docker commit
命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用,原因如下:
- 除了真正修改的文件之外,还有很多其他文件被修改或添加,对于更复杂的操作,会导致镜像臃肿;
- 使用
docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为黑箱镜像,维护困难; - 任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层,也会导致镜像臃肿。
那么实际环境中我们怎么通过分层来构建镜像呢,这就是我们下一篇要介绍的 Dockerfile
。
No Comments