插件窝 干货文章 docker创建镜像有几种方法

docker创建镜像有几种方法

镜像 Docker 构建 Dockerfile 491    来源:    2025-04-27

在 Docker 中创建镜像主要有以下几种方法,每种方法适用于不同的场景:


1. docker commit(基于容器创建镜像)

适用场景:快速保存容器的当前状态为镜像(常用于临时调试或实验,但生产环境不推荐)。
步骤

# 启动一个容器并修改内容(例如安装软件)
docker run -it ubuntu /bin/bash
apt update && apt install -y curl  # 示例修改

# 在另一个终端执行提交(容器ID通过`docker ps`查看)
docker commit <容器ID> 新镜像名:标签

缺点:镜像臃肿、无构建记录、难以维护。


2. 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)。
- 分层构建,缓存提升效率。
- 清晰记录镜像构建过程。


3. docker import(从归档文件创建镜像)

适用场景:将系统根文件系统(如 .tar.tar.gz)导入为镜像。
示例

docker import ubuntu-rootfs.tar ubuntu:custom

注意:与 docker load 不同,import 不保留镜像历史层和元数据。


4. docker save/docker load(镜像导出与导入)

适用场景:迁移或分享镜像(非构建,而是镜像的导出/导入)。
步骤

# 导出镜像为.tar文件
docker save -o ubuntu.tar ubuntu:20.04

# 从.tar文件加载镜像
docker load -i ubuntu.tar

5. 多阶段构建(Multi-stage Build)

适用场景:优化镜像大小(如编译环境与运行时分离)。
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"]

6. 使用 BuildKit 或 Buildx(高级构建工具)

适用场景:支持多平台构建(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 和多阶段构建,确保可维护性和效率。