当前位置: 首页 > news >正文

【docker】镜像制作

一. 前言

将本地环境或应用程序打包成 Docker 镜像,主要有两种核心方式:使用 Dockerfile 构建使用 docker commit 命令创建。下面是一个快速对比,帮助你根据场景选择。

特性Dockerfile 构建docker commit 创建
核心原理通过文本文件(Dockerfile)定义一系列指令,自动化、可重复地构建镜像将某个正在运行或已停止的容器的当前状态(包括所有文件改动、环境变量等)直接保存为一个新镜像
可追溯性✅ 高(Dockerfile 本身是文本文件,易于版本管理和审查)❌ 低(难以清晰追溯镜像中包含的所有变更来源)
可重复性✅ 高(只要 Dockerfile 和上下文不变,每次构建结果一致)❌ 低(严重依赖执行 commit 时容器的特定状态)
镜像体积✅ 通常更小(可通过优化指令如合并RUN语句、使用多阶段构建等有效控制)❌ 通常较大(容易包含不必要的中间文件、缓存等)
自动化集成✅ 高(天然适合 CI/CD 流程)❌ 低(主要为手动操作)
推荐场景🏭 生产环境构建、🔁 需要重复和自动化构建、📦 需要小型且高效的镜像、👥 团队协作与共享🐛 临时性调试或实验(保存现场)、🚧 对现有容器进行少量临时修改且暂无Dockerfile、⏩ 快速创建测试镜像

二. 基本使用

方式一:使用 Dockerfile 构建(推荐)

这是最标准、最受推荐的方法,尤其适合生产环境需要重复构建的场景。

  1. 编写 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"]
    
  2. 构建镜像:在 Dockerfile 所在目录执行命令。

    docker build -t my-python-app:latest .
    # -t 为镜像命名和打标签
    # . 指定构建上下文(包含 Dockerfile 的目录)
    
  3. 优化技巧

    • 使用 .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. 操作步骤

    # 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  # 新镜像的名称和标签
  2. 注意docker commit 通常不推荐用于生产环境的镜像构建。因为它缺乏可重复性,难以追溯变更历史,且容易导致镜像臃肿。

方式三:镜像的导出、导入与推送

制作好的镜像可以方便地分享和部署。

  1. 导出镜像到文件:便于迁移或备份。

    docker save -o my-python-app.tar my-python-app:latest
    # -o 指定输出的文件名
    
  2. 从文件加载镜像:在另一台机器上导入。

    docker load -i my-python-app.tar
    
  3. 推送到镜像仓库:便于团队共享和自动化部署(如 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 镜像。


文章转载自:

http://9SgVu4lW.xgqbL.cn
http://CoGl5yZb.xgqbL.cn
http://gyA4ImNf.xgqbL.cn
http://o372iwuL.xgqbL.cn
http://LEyWXAcZ.xgqbL.cn
http://gz5XruXu.xgqbL.cn
http://6PPTxVAo.xgqbL.cn
http://Bp91Gr7a.xgqbL.cn
http://v77outPL.xgqbL.cn
http://iICQr7rO.xgqbL.cn
http://CtLC2nIS.xgqbL.cn
http://TE91WOAy.xgqbL.cn
http://l3HiNrU4.xgqbL.cn
http://pUZ8cxqy.xgqbL.cn
http://ppO1okEl.xgqbL.cn
http://QzRxGK4x.xgqbL.cn
http://j6OPnl1F.xgqbL.cn
http://eY3c5Xxf.xgqbL.cn
http://cECb2muo.xgqbL.cn
http://3OUgRK2M.xgqbL.cn
http://Hq42B8t2.xgqbL.cn
http://jebf4KRR.xgqbL.cn
http://sudpRFVz.xgqbL.cn
http://BnqAm2NV.xgqbL.cn
http://lp7pQPRz.xgqbL.cn
http://xrUr3FZF.xgqbL.cn
http://zKBZdh6f.xgqbL.cn
http://3K0R0fXL.xgqbL.cn
http://u3suc0JT.xgqbL.cn
http://rOzyLnuE.xgqbL.cn
http://www.dtcms.com/a/374202.html

相关文章:

  • 前端安全攻防:XSS, CSRF 等防范与检测
  • Unity鱼眼特效
  • MySQL表结构优化:安全删除字段(DROP COLUMN)的完整指南与避坑手册
  • Java全栈技术选型指南
  • Leptos框架深度解析:用Rust构建高性能Web应用的未来
  • 嵌入式学习day45-硬件—汇编
  • Gazebo1: gz命令工具理解与掌握
  • 电路运行的核心-RTC
  • 高并发下的锁选择:乐观锁 vs 悲观锁全面对比
  • 本地部署大模型和知识库实现问答AI
  • python编程:一文掌握pypiserver的详细使用
  • 【人工智能99问】开源项目RAGflow_by_infiniflow介绍(37/99)
  • Qt C++ 复杂界面处理:巧用覆盖层突破复杂界面处理难题​之一
  • 一种高效绘制余晖波形的方法Qt/C++
  • 本地部署的Qwen3,测试不同数量并发请求的吞吐量
  • 【从零开始java学习|第十三篇】字符串究极知识总结
  • Linux内核进程管理子系统有什么第四十六回 —— 进程主结构详解(42)
  • Kafka 与 RocketMQ 核心概念与架构对比
  • 【检索通知】2025年IEEE第二届深度学习与计算机视觉国际会议检索
  • 2025年AC-DC电源模块选购指南与应用方案解析
  • LeetCode 面试经典 150 题:删除有序数组中的重复项 II(最多保留 2 次 + 通用 k 次解法详解)
  • 在OpenHarmony上适配图形显示【2】——调试display hdi的技巧
  • 在 JavaScript 中轻松实现 AES 加密与解密:从原理到实战
  • Mockoon:开源免费的本地Mock服务工具,提升前后端联调效率
  • C/C++圣诞树②
  • segYolo添加界面
  • 初学Transformer核心——注意力机制
  • 第9篇:Freqtrade量化交易之config.json 基础入门与初始化
  • 推荐系统学习笔记(十六)LHUC(PPNet)
  • 前端开发实战 主流前端开发工具对比与最佳实践