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,清晰区分迭代版本
相关推荐
Harvy_没救了2 小时前
【Linux】Nginx - 反向代理
linux·运维·nginx
代码中介商2 小时前
Linux 静态库与共享库完全指南:从制作到使用
linux·运维·服务器
Zhu7583 小时前
【软件部署】docker环境部署domino
运维·docker·容器
IT 行者3 小时前
FastDFS 防盗链详解:Token验证+Nginx白名单保姆级配置指南
运维·nginx
YIN_尹3 小时前
【Linux系统编程】进程控制(一)
linux·运维·服务器
.柒宇.3 小时前
共享文件服务NFS服务器:NFS实战详解
linux·运维·服务器
一叶之秋14123 小时前
通信之道:解锁Linux进程间通信的无限可能(三)
linux·运维·服务器
闻道且行之4 小时前
frp+Nginx 内网穿透详细配置教程
运维·网络·nginx·frp·内网穿透