在 Docker 中创建镜像主要有以下几种方法,每种方法适用于不同的场景:
docker commit
(基于容器创建镜像)适用场景:快速保存容器的当前状态为镜像(常用于临时调试或实验,但生产环境不推荐)。
步骤:
# 启动一个容器并修改内容(例如安装软件)
docker run -it ubuntu /bin/bash
apt update && apt install -y curl # 示例修改
# 在另一个终端执行提交(容器ID通过`docker ps`查看)
docker commit <容器ID> 新镜像名:标签
缺点:镜像臃肿、无构建记录、难以维护。
Dockerfile
+ docker build
(推荐方式)适用场景:标准化、可复现的镜像构建(生产环境首选)。
步骤:
1. 编写 Dockerfile
(示例):
dockerfile
FROM ubuntu:20.04
RUN apt update && apt install -y curl
CMD ["curl", "https://example.com"]
2. 构建镜像:
bash
docker build -t 镜像名:标签 .
优点:
- 可版本化管理(Dockerfile 纳入 Git)。
- 分层构建,缓存提升效率。
- 清晰记录镜像构建过程。
docker import
(从归档文件创建镜像)适用场景:将系统根文件系统(如 .tar
、.tar.gz
)导入为镜像。
示例:
docker import ubuntu-rootfs.tar ubuntu:custom
注意:与 docker load
不同,import
不保留镜像历史层和元数据。
docker save
/docker load
(镜像导出与导入)适用场景:迁移或分享镜像(非构建,而是镜像的导出/导入)。
步骤:
# 导出镜像为.tar文件
docker save -o ubuntu.tar ubuntu:20.04
# 从.tar文件加载镜像
docker load -i ubuntu.tar
适用场景:优化镜像大小(如编译环境与运行时分离)。
Dockerfile 示例:
# 阶段1:编译环境
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 阶段2:运行时镜像(仅复制二进制文件)
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]
适用场景:支持多平台构建(ARM/x86)、缓存优化等。
示例:
# 启用BuildKit(Docker 18.09+)
DOCKER_BUILDKIT=1 docker build --platform linux/amd64,linux/arm64 .
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
docker commit |
临时保存容器状态 | 简单快速 | 不可维护、臃肿 |
Dockerfile |
生产环境标准化构建 | 可版本化、分层缓存 | 需编写Dockerfile |
docker import |
从根文件系统创建镜像 | 兼容外部系统 | 无构建历史 |
save/load |
镜像迁移 | 完整保留镜像 | 非构建方法 |
多阶段构建 | 优化镜像大小 | 减少最终镜像体积 | 需设计多阶段 |
BuildKit/Buildx | 多平台、高级构建 | 跨平台、性能优化 | 需新版本Docker |
推荐:生产环境优先使用 Dockerfile
和多阶段构建,确保可维护性和效率。