Docker 镜像的构建、打包、变更、再次打包全流程

核心概念先理清:

  • 镜像(Image):静态的安装包(只读)
  • 容器(Container):镜像运行起来的实例(可读写)
  • 生成:把代码/环境做成镜像
  • 打包:把镜像导出成文件/推送到仓库
  • 修改:基于旧镜像运行容器,改完再生成新镜像

一、Docker 镜像生成(2种方式,优先用第1种)

方式1:Dockerfile 构建(✅ 生产标准、可复用、可追溯)

这是官方推荐的方式,通过文本文件Dockerfile定义镜像内容,一步构建。

实操步骤:

  1. 创建工作目录 ,新建一个名为 Dockerfile 的文件(无后缀名)
  2. 编写 Dockerfile(以最常用的 Nginx 为例)
dockerfile 复制代码
# 基础镜像(必须第一行):从官方nginx镜像继承
FROM nginx:latest

# 作者信息(可选)
MAINTAINER myname <xxx@qq.com>

# 镜像操作:修改nginx首页(示例修改)
RUN echo "<h1>我的第一个Docker镜像</h1>" > /usr/share/nginx/html/index.html

# 暴露端口(可选)
EXPOSE 80
  1. 构建镜像(在Dockerfile所在目录执行)
bash 复制代码
# 格式:docker build -t 镜像名:版本号 .
docker build -t my-nginx:v1.0 .
  • -t:给镜像打标签(名字+版本)
  • .:指定Dockerfile所在的当前目录
  1. 查看生成的镜像
bash 复制代码
docker images

✅ 完成:my-nginx:v1.0 就是你生成的第一个镜像


方式2:容器直接提交生成(🔸 临时快速、无文档,不推荐生产)

直接运行一个基础容器,手动修改后,打包成新镜像。

bash 复制代码
# 1. 运行官方nginx容器(命名为tmp-nginx)
docker run --name tmp-nginx -d nginx:latest

# 2. 进入容器内部修改(交互终端)
docker exec -it tmp-nginx /bin/bash

# 3. 容器内执行修改(示例:改首页)
echo "<h1>临时修改的镜像</h1>" > /usr/share/nginx/html/index.html

# 4. 退出容器
exit

# 5. 把修改后的容器 提交为新镜像
docker commit tmp-nginx my-nginx:v1.0-tmp

✅ 完成:同样生成了镜像,但无法追溯修改记录,仅适合测试


二、Docker 镜像打包(2种场景:离线传输 / 云端共享)

镜像生成后,需要打包迁移,分两种常用方式:

场景1:本地打包为tar文件(离线传输、U盘拷贝)

打包镜像(导出)

bash 复制代码
# 格式:docker save -o 保存文件名.tar 镜像名:版本
docker save -o my-nginx-v1.0.tar my-nginx:v1.0
  • 生成 my-nginx-v1.0.tar 文件,可直接拷贝到其他服务器

其他服务器加载打包好的镜像

bash 复制代码
docker load -i my-nginx-v1.0.tar

场景2:推送到Docker仓库(团队共享、云端存储)

  1. 注册 Docker Hub 账号
  2. 本地登录Docker
bash 复制代码
docker login
  1. 给镜像打标签(必须匹配你的仓库名)
bash 复制代码
docker tag my-nginx:v1.0 你的用户名/my-nginx:v1.0
  1. 推送镜像到云端
bash 复制代码
docker push 你的用户名/my-nginx:v1.0

三、基于旧镜像修改 → 重新打包新版本(核心需求)

这是你最关心的:在已有的镜像基础上修改,生成v2.0新版本

推荐方案快速方案,任选其一。


方案1:✅ 推荐(Dockerfile 继承旧镜像,生产用)

直接在旧镜像基础上,写新的Dockerfile,可维护、可重复构建

实操:基于 my-nginx:v1.0 生成 v2.0

  1. 新建Dockerfile(内容更简单,直接继承旧镜像)
dockerfile 复制代码
# 核心:FROM 你的旧镜像名:版本
FROM my-nginx:v1.0

# 新增修改:比如添加新页面、安装工具
RUN echo "<h1>版本2.0:修改后的新镜像</h1>" > /usr/share/nginx/html/index.html
RUN apt-get update && apt-get install -y curl
  1. 构建新版本镜像
bash 复制代码
docker build -t my-nginx:v2.0 .
  1. 查看新版本
bash 复制代码
docker images

✅ 完成:my-nginx:v2.0 就是修改后的新版镜像


方案2:🔸 快速(容器修改后提交,测试用)

直接运行旧镜像,手动改完提交为新版本,无需写Dockerfile。

实操步骤:

bash 复制代码
# 1. 运行旧镜像 v1.0
docker run --name tmp-nginx-v2 -d my-nginx:v1.0

# 2. 进入容器修改内容
docker exec -it tmp-nginx-v2 /bin/bash

# 3. 容器内执行你的修改(示例)
echo "<h1>版本2.0</h1>" > /usr/share/nginx/html/index.html

# 4. 退出容器
exit

# 5. 提交为新版本镜像 v2.0
docker commit tmp-nginx-v2 my-nginx:v2.0

✅ 完成:直接生成修改后的新版镜像


最后:新版镜像再次打包

修改生成 v2.0 后,打包方式和之前完全一致

bash 复制代码
# 1. 本地打包tar
docker save -o my-nginx-v2.0.tar my-nginx:v2.0

# 2. 或推送到云端
docker tag my-nginx:v2.0 你的用户名/my-nginx:v2.0
docker push 你的用户名/my-nginx:v2.0

四、完整流程总结(一句话记忆)

  1. 生成Dockerfile + docker build(标准)
  2. 打包docker save(离线)/ docker push(云端)
  3. 修改 :运行旧容器 → 修改 → docker commit 或 新Dockerfile构建
  4. 新版打包:重复打包命令

关键最佳实践

  • 生产环境必须用 Dockerfile(可追溯、可复用、团队协作)
  • 🔸 docker commit 仅适合临时测试、快速修改
  • 镜像版本号规范:v1.0/v2.0,清晰区分迭代版本
相关推荐
wdfk_prog17 分钟前
ROS教程10:从 gtest 到 rostest——Unit Test、Node 集成测试、rosbag 与 rqt 验证闭环
运维·缓存·docker·容器·ros
吴声子夜歌38 分钟前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
Huangjin007_2 小时前
【Linux 系统篇(二十一)】进程(九):进程等待 wait/waitpid、status状态参数
linux·运维·服务器
cnkeysky2 小时前
docker 运行 nacos
docker·nacos
螺蛳粉 螺蛳粉2 小时前
mysql的备份与恢复
linux·运维·数据库·mysql
可乐鸡翅yeah_2 小时前
混合内容 Mixed‑Content 安全策略,HLS HTTPS 页面加载 HTTP 资源排错实战
运维·ffmpeg·音视频·媒体·m3u8
曦夜日长3 小时前
Linux系统篇,进程概念(四):内核链表的深度理解、进程优先级的底层理解
linux·运维·服务器·php
itCatface4 小时前
Linux离线部署Dify+Vllm(Qwen2.5-7b)
docker·ai·dify
安易算力4 小时前
昇腾生态开发深度实践:CANN算子库架构解析与MindSpore模型优化
网络·容器·架构·kubernetes·vllm
闲云自留地4 小时前
不用 docker!containerd 镜像 crctl 命令一把梭
容器