【docker】镜像制作
一. 前言
将本地环境或应用程序打包成 Docker 镜像,主要有两种核心方式:使用 Dockerfile 构建和使用 docker commit
命令创建。下面是一个快速对比,帮助你根据场景选择。
特性 | Dockerfile 构建 | docker commit 创建 |
---|---|---|
核心原理 | 通过文本文件(Dockerfile)定义一系列指令,自动化、可重复地构建镜像 | 将某个正在运行或已停止的容器的当前状态(包括所有文件改动、环境变量等)直接保存为一个新镜像 |
可追溯性 | ✅ 高(Dockerfile 本身是文本文件,易于版本管理和审查) | ❌ 低(难以清晰追溯镜像中包含的所有变更来源) |
可重复性 | ✅ 高(只要 Dockerfile 和上下文不变,每次构建结果一致) | ❌ 低(严重依赖执行 commit 时容器的特定状态) |
镜像体积 | ✅ 通常更小(可通过优化指令如合并RUN语句、使用多阶段构建等有效控制) | ❌ 通常较大(容易包含不必要的中间文件、缓存等) |
自动化集成 | ✅ 高(天然适合 CI/CD 流程) | ❌ 低(主要为手动操作) |
推荐场景 | 🏭 生产环境构建、🔁 需要重复和自动化构建、📦 需要小型且高效的镜像、👥 团队协作与共享 | 🐛 临时性调试或实验(保存现场)、🚧 对现有容器进行少量临时修改且暂无Dockerfile、⏩ 快速创建测试镜像 |
二. 基本使用
方式一:使用 Dockerfile 构建(推荐)
这是最标准、最受推荐的方法,尤其适合生产环境和需要重复构建的场景。
-
编写 Dockerfile:创建一个名为
Dockerfile
的文本文件。# 指定基础镜像 FROM python:3.8-slim # 设置工作目录 WORKDIR /app # 将本地文件复制到镜像中 COPY . /app # 安装依赖 RUN pip install --no-cache-dir -r requirements.txt # 暴露端口 EXPOSE 5000 # 设置容器启动命令 CMD ["python", "app.py"]
-
构建镜像:在
Dockerfile
所在目录执行命令。docker build -t my-python-app:latest . # -t 为镜像命名和打标签 # . 指定构建上下文(包含 Dockerfile 的目录)
-
优化技巧:
- 使用
.dockerignore
:排除不需要的文件(如本地配置文件、日志文件等)进入镜像,减少镜像大小和提高构建速度。 - 合并
RUN
指令:减少镜像层数,有助于减小镜像体积。RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*
- 多阶段构建:特别适用于需要编译的程序,可以只将编译后的结果复制到最终镜像,抛弃编译环境和中间文件,显著减小镜像体积。
# 第一阶段:构建 FROM golang:1.18 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 第二阶段:运行 FROM alpine:latest WORKDIR /app COPY --from=builder /app/myapp . CMD ["./myapp"]
- 使用
方式二:使用 docker commit
创建
这种方法基于一个已存在的容器创建镜像,适合临时保存容器的当前状态用于测试或调试。
-
操作步骤:
# 1. 启动一个容器(如果还没有的话) docker run -it --name my-container ubuntu:20.04 /bin/bash # 2. (在容器内进行修改,如安装软件、修改配置) # 3. 退出容器后,使用 commit 命令创建新镜像 docker commit \--author "Your Name <email@example.com>" \ # 指定作者--message "Installed Nginx and configured it" \ # 提交信息my-container \ # 容器名或IDmy-custom-image:v1.0 # 新镜像的名称和标签
-
注意:
docker commit
通常不推荐用于生产环境的镜像构建。因为它缺乏可重复性,难以追溯变更历史,且容易导致镜像臃肿。
方式三:镜像的导出、导入与推送
制作好的镜像可以方便地分享和部署。
-
导出镜像到文件:便于迁移或备份。
docker save -o my-python-app.tar my-python-app:latest # -o 指定输出的文件名
-
从文件加载镜像:在另一台机器上导入。
docker load -i my-python-app.tar
-
推送到镜像仓库:便于团队共享和自动化部署(如 Docker Hub、Harbor)。
# 1. 给镜像打上符合仓库规范的标签 docker tag my-python-app:latest yourusername/your-repo:tag # 2. 登录仓库 docker login # 3. 推送 docker push yourusername/your-repo:tag
💡 如何选择与建议
- 绝大多数场景下,请使用
Dockerfile
:它是自动化、可重复且易于维护的最佳实践,尤其适用于开发、测试和生产环境的标准化交付。 - 谨慎使用
docker commit
:仅将其用于临时性的调试或实验目的。如果修改是持久的,强烈建议将修改过程翻译成Dockerfile
中的指令,然后重新构建镜像。 - 优化是关键:无论用哪种方法,都请注意镜像体积优化,选择更小的基础镜像(如 Alpine Linux),并清理不必要的缓存和临时文件。
三. 镜像源(加速器)配置
✅ 一、配置 Docker 镜像源(加速器)
1. 创建或编辑 Docker 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
}
EOF
📌 上述配置使用了中科大、网易和百度的公共镜像源,无需注册,适合大多数用户。
2. 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 验证是否配置成功
docker info
在输出中查找 Registry Mirrors
,应该能看到类似:
Registry Mirrors:https://docker.mirrors.ustc.edu.cn/https://hub-mirror.c.163.com/https://mirror.baidubce.com/
✅ 二、拉取 Python 镜像示例
配置好镜像源后,拉取 Python 镜像会更快:
# 拉取 Python 3.9 官方镜像
docker pull python:3.9# 或者拉取更小的 slim 版本
docker pull python:3.9-slim
✅ 三、运行一个 Python 容器(可选)
验证镜像是否正常运行:
# 启动一个交互式 Python 容器
docker run -it python:3.9 python3
你将进入 Python 解释器,输入 print("Hello Docker")
测试即可。
✅ 四、进阶:使用阿里云镜像加速器(推荐)
阿里云提供专属加速地址,速度更快更稳定。
1. 登录阿里云控制台
访问:https://cr.console.aliyun.com/
2. 获取你的专属镜像加速地址
路径:容器镜像服务 > 镜像工具 > 镜像加速器
你会看到类似:
https://xxxxxx.mirror.aliyuncs.com
3. 替换 daemon.json
中的内容
{"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
4. 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
✅ 五、验证加速效果
time docker pull python:3.11-slim
你会看到明显加速(从几分钟缩短到几十秒)。
✅ 四. 总结
步骤 | 操作 |
---|---|
✅ 1 | 编辑 /etc/docker/daemon.json 添加镜像源 |
✅ 2 | 重启 Docker 服务 |
✅ 3 | 拉取镜像:docker pull python:3.9 |
✅ 4(推荐) | 使用阿里云专属加速地址 |
🚀 配置完成后,所有
docker pull
操作都会自动走加速通道,大幅提升下载速度。
希望这份详细的指南能帮助你更好地制作和管理 Docker 镜像。