1、启动一个nginx容器,将其命名为commit_test,并映射到外部的80端口
$ docker run --name commit_test -d -p 80:80 nginx
a65c4f56cb0f18568d328d5fa8e9f14255c201b158f84811145c56716c1e696c
2、通过浏览器访问:http:localhost:80访问
3、进入“commit_test”容器,修改“/usr/share/nginx/html/index.html”
$ docker exec -it commit_test bash
root@a65c4f56cb0f:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@a65c4f56cb0f:/# exit
exit
4、刷新浏览器
注:修改了容器的文件,也就是修改了容器的存储层。可以通过docker diff查看具体的改动
docker@docker-ubuntu:~$ docker diff commit_test
C /root
A /root/.bash_history
C /run
A /run/nginx.pid
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
当容器在运行时(没有挂载数据卷),在容器里面做的任何修改都会被记录在容器的存储层里面。Docker commit 命令,会在原有镜像的基础上,再叠加上容器的存储层,并构成一个新的镜像。
Docker Commit的语法格式:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
5、用docker commit构建一个新的镜像
docker@docker-ubuntu:~$ docker commit --author “luojun”\
--message "修改了默认网页"\
commmit_test nginx:v2
sha256:818ba2acb6828cae5f734164dec5606a9e36ff5ae8e5b44b1830dfab3a837e14
--author 是指定修改的作者, --message 则是记录本次修改的内容。
6、查看本地镜像:
docker@docker-ubuntu:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 818ba2acb682 About a minute ago 109MB
nginx latest 958a7ae9e569 4 weeks ago 109MB
7、使用docker history 查看镜像内的历史记录
通过比较nginx:v2和nginx:latest可以发现新增了一层“818ba2acb682”
8、运行新镜像
docker@docker-ubuntu:~$ docker run --name web2 -d -p 81:80 nginx:v2
43a99e485d3063378ee11e2a508c1b7381028704846eae79c1a9d29a88782d74
通过http://localhost:81访问web2的主页
注:
如果仔细观察之前的 docker diff webserver 的结果,你会发现除了真
正想要修改的 /usr/share/nginx/html/index.html 文件外,由于命令的执
行,还有很多文件被改动或添加了。这还仅仅是最简单的操作,如果是安装软件
包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜
像极为臃肿。
此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜
像也被称为黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎
么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间
后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,
但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦
的。
而且,回顾之前提及的镜像所使用的分层存储的概念,除当前层外,之前的每一层
都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添
加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期
修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢
失,会一直如影随形的跟着这个镜像这会让镜像更加臃肿。
docker commit 命令适用于一些特殊的应用场合,比如被入侵后保存现场等