从现有容器创建新镜像。这里有几种"复制"或创建新镜像的方法:
方法一:docker commit(从容器创建镜像)
这是最直接的"复制"方式,将运行中容器的状态保存为新镜像:
bash
复制
# 1. 先运行一个容器(可以是已存在的) docker run -it --name my_container ubuntu bash # 在容器内做一些修改,比如安装软件 # 2. 提交容器为新镜像(类似"复制") docker commit my_container my_new_image:latest # 3. 查看新镜像 docker images | grep my_new_image带元数据的提交:
bash
复制
docker commit \ -a "作者名字" \ -m "安装了nginx和vim" \ my_container \ myapp:version2.0方法二:docker tag(镜像打标签)
给现有镜像创建一个新名称/标签(快速"复制"引用):
bash
复制
# 给现有镜像打新标签(类似文件系统的硬链接) docker tag myapp:latest myrepo/myapp:backup-20241218 # 效果:两个标签指向同一个镜像ID docker images # REPOSITORY TAG IMAGE ID # myapp latest abc123... # myrepo/myapp backup-20241218 abc123... ← 同一个ID方法三:Dockerfile +COPY指令
标准做法:通过Dockerfile构建新镜像:
dockerfile
复制
# Dockerfile FROM myapp:latest COPY ./config.yml /app/config.yml RUN apt-get update && apt-get install -y vimbash
复制
docker build -t myapp:customized .方法四:docker export+import(容器快照)
导出容器文件系统并作为新镜像导入(会丢失历史和元数据):
bash
复制
# 1. 导出容器(不是镜像!)为tar包 docker export -o container.tar my_container # 2. 导入为新镜像(只有一层,无历史) docker import container.tar my_new_image:imported方法五:docker save+load(镜像迁移)
备份镜像并在其他地方恢复:
bash
复制
# 1. 保存镜像到文件 docker save -o myapp.tar myapp:latest # 2. 在另一台机器上加载(仍是同一个镜像) docker load -i myapp.tar对比与选择
表格
复制
| 方法 | 用途 | 保留历史层 | 推荐度 |
|---|---|---|---|
docker commit | 快速保存容器状态 | ✅ 是 | ⭐⭐⭐ 调试用 |
docker tag | 创建别名/版本 | ✅ 是 | ⭐⭐⭐⭐⭐ 必备 |
Dockerfile build | 标准化构建 | ✅ 是 | ⭐⭐⭐⭐⭐最佳实践 |
export/import | 容器迁移 | ❌ 否 | ⭐⭐ 特殊场景 |
save/load | 镜像备份迁移 | ✅ 是 | ⭐⭐⭐⭐ 常用 |
重要警告
⚠️不要滥用docker commit!
这会创建"黑盒"镜像,无法追溯构建过程。生产环境应始终使用Dockerfile:
bash
复制
# 不推荐(难以维护) docker run ubuntu apt-get install -y nginx docker commit <container_id> mynginx:manual # 推荐(可追踪、可重复) # Dockerfile: # FROM ubuntu # RUN apt-get install -y nginx docker build -t mynginx:automated .总结:
快速复制 →
docker tag保存调试状态 →
docker commit正规流程 →
Dockerfile+docker build