04. 利用commit理解镜像构成
2025-02-17
简介
Docker 镜像采用分层存储架构,每一层都基于前一层进行增量修改。通过 docker commit 命令,我们可以:
- 理解镜像的分层结构
- 将容器的修改保存为新镜像
- 了解镜像构建的基本原理
注意: 实际环境中应该使用 Dockerfile 来构建镜像,而不是 commit 命令。
镜像构成
Docker 镜像和容器都采用分层存储结构:
- 镜像层: 只读层,用于存储应用程序和依赖
- 容器层: 可写层,运行时的文件变更都记录在这里
下面通过定制一个 Web 服务器镜像来理解这个过程:
docker run --name webserver -d -p 80:80 nginx
# 启动 Nginx 容器
docker container ls #查看正在运行的容器访问说明:
- 本机运行: 访问 http://localhost
- 虚拟机/云服务器: 使用对应的 IP 地址
修改容器内容
使用 docker exec 命令进入容器并修改内容:
docker exec -it webserver bash
echo '<h1>Welcome you come in my wanglh</h1>' > /usr/share/nginx/html/index.html #修改主页内容
exit
# 查看修改内容
docker diff webserver命令说明:
-i: 保持标准输入打开-t: 分配伪终端bash: 指定要运行的命令
文件变更:
C: 表示文件被修改A: 表示新增文件D: 表示删除文件
保存为新镜像
使用 docker commit 命令将修改后的容器保存为新镜像:
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]docker commit \
--author "To wanglh <wlh_richard@163.com>" \
--message "修改默认主页内容" \
webserver \
nginx:v2 #回车
# 查看新镜像
docker image ls
# 查看镜像历史
docker history nginx:v2参数说明:
--author: 指定作者信息--message: 记录修改说明webserver: 容器名nginx:v2: 新镜像的名称和标签
使用新镜像
基于新镜像启动容器:
docker run --name web2 -d -p 81:80 nginx:v2commit 命令的局限性
1. 黑箱操作
使用 commit 方式构建镜像的问题:
- 操作过程不透明
- 无法重现完整的构建过程
- 维护困难,容易导致镜像不一致
2. 镜像臃肿
容易导致镜像臃肿的原因:
- 所有操作都会产生新的层
- 即使删除文件也会增加层大小
- 临时文件和缓存也会被保存
最佳实践
使用 Dockerfile
- 使用 Dockerfile 构建镜像
- 保证构建过程可重复
- 便于版本控制和维护
commit 的适用场景
- 调试环境保存
- 事故现场保存
- 临时测试用途