Linux · 2 分钟阅读
04. 用 commit 理解镜像构成
提醒:
docker commit只在调试时偶尔用,生产永远走 Dockerfile。
分层回顾
- 镜像层:只读
- 容器层:可写,容器删了它就没了
docker run --name web -d -p 80:80 nginx:1.27
docker exec -it web bash
echo '<h1>Hello</h1>' > /usr/share/nginx/html/index.html
exit
docker diff web
docker diff 输出:
| 标记 | 含义 |
|---|---|
A |
新增 |
C |
修改 |
D |
删除 |
commit 保存
docker commit \
--author "you <you@example.com>" \
--message "改首页" \
web \
myrepo/nginx:v2
docker history myrepo/nginx:v2
docker history 能看到每一层的指令(commit 出来的层是 USER 之外没法用 Dockerfile 复现的"黑盒")。
commit 的问题
- 构建过程不可复现
- 镜像臃肿(每改一次多一层)
- 临时文件、缓存也写进层
- 审查困难
正确做法:Dockerfile
FROM nginx:1.27
RUN echo '<h1>Hello</h1>' > /usr/share/nginx/html/index.html
docker build -t myrepo/nginx:v2 .
何时用 commit
- 现场调试保存"事故现场"
- 把现有容器转成镜像做迁移
- 临时测试
别把 commit 镜像推到生产 registry。