核心概念先理清:
- 镜像(Image):静态的安装包(只读)
- 容器(Container):镜像运行起来的实例(可读写)
- 生成:把代码/环境做成镜像
- 打包:把镜像导出成文件/推送到仓库
- 修改:基于旧镜像运行容器,改完再生成新镜像
一、Docker 镜像生成(2种方式,优先用第1种)
方式1:Dockerfile 构建(✅ 生产标准、可复用、可追溯)
这是官方推荐的方式,通过文本文件Dockerfile定义镜像内容,一步构建。
实操步骤:
- 创建工作目录 ,新建一个名为
Dockerfile的文件(无后缀名) - 编写 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
- 构建镜像(在Dockerfile所在目录执行)
bash
# 格式:docker build -t 镜像名:版本号 .
docker build -t my-nginx:v1.0 .
-t:给镜像打标签(名字+版本).:指定Dockerfile所在的当前目录
- 查看生成的镜像
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仓库(团队共享、云端存储)
- 注册 Docker Hub 账号
- 本地登录Docker
bash
docker login
- 给镜像打标签(必须匹配你的仓库名)
bash
docker tag my-nginx:v1.0 你的用户名/my-nginx:v1.0
- 推送镜像到云端
bash
docker push 你的用户名/my-nginx:v1.0
三、基于旧镜像修改 → 重新打包新版本(核心需求)
这是你最关心的:在已有的镜像基础上修改,生成v2.0新版本
分 推荐方案 和 快速方案,任选其一。
方案1:✅ 推荐(Dockerfile 继承旧镜像,生产用)
直接在旧镜像基础上,写新的Dockerfile,可维护、可重复构建。
实操:基于 my-nginx:v1.0 生成 v2.0
- 新建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
- 构建新版本镜像
bash
docker build -t my-nginx:v2.0 .
- 查看新版本
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
四、完整流程总结(一句话记忆)
- 生成 :
Dockerfile + docker build(标准) - 打包 :
docker save(离线)/docker push(云端) - 修改 :运行旧容器 → 修改 →
docker commit或 新Dockerfile构建 - 新版打包:重复打包命令
关键最佳实践
- ✅ 生产环境必须用 Dockerfile(可追溯、可复用、团队协作)
- 🔸
docker commit仅适合临时测试、快速修改 - 镜像版本号规范:
v1.0/v2.0,清晰区分迭代版本