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,清晰区分迭代版本
相关推荐
zzz_23683 分钟前
智慧社区项目全维度测试报告:功能、接口、自动化与性能验证
运维·自动化
Brilliantwxx4 分钟前
【Linux】基础指令
linux·运维·服务器
ZhemgLee23 分钟前
在Linux上使用Claude Code 并使用本地VS Code SSH远程访问的完整指南
linux·运维·服务器·ssh
chen_ke_hao36 分钟前
K8s 高可用集群部署
java·docker·kubernetes
Geek-Chow1 小时前
Kubernetes HPA Behavior When Deployment Is Scaled to 0
云原生·容器·kubernetes
Yiiz.3 小时前
虚拟机网络设置
运维
乐维_lwops10 小时前
2026年如何实现多分支机构全网设备统一运维监控一
运维·cmdb·运维监控·网管·agent ops
视觉AI11 小时前
VS Code Remote-SSH 连接Jetson踩坑完整解决记录(网段不通+主机密钥变更双重故障)
运维·网络·人工智能·windows·ssh·边缘计算
银河麒麟操作系统11 小时前
闸机高效稳跑,通勤提速升级!银河麒麟赋能北京轨交新基建
运维·服务器·安全·交通物流
六点_dn11 小时前
Linux学习笔记-printf命令
linux·运维·算法