R / Richie全部文章 ↑

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。

参考