docker commit 笔记

本文介绍如何使用Docker创建和修改容器,通过实例演示如何构建新的Docker镜像并记录修改内容。同时探讨了使用docker commit命令的利弊及可能带来的镜像臃肿问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 命令适用于一些特殊的应用场合,比如被入侵后保存现场等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值