Docker 镜像跨环境推送与 K8s 部署完整教程
适用场景:本地 Windows 开发环境构建好镜像后,需经中间服务器推送到镜像仓库,再由另一台服务器的 K8s 前端可视化平台拉取部署。
一、整体流程概览
二、前置条件
| 环境 | 要求 |
|---|---|
| 本地 Windows | 已安装 Docker Desktop,镜像已构建完成 |
| 中间服务器 | 已安装 Docker,能访问外网或镜像仓库内网地址 |
| 镜像仓库 | 已注册账号并拥有推送权限(Docker Hub / 阿里云 ACR / Harbor 等) |
| K8s 集群 | 已部署前端可视化平台(如 Rancher、KubeSphere、OpenShift),节点能访问镜像仓库 |
三、详细操作步骤
Step 1:本地 Windows 导出镜像
在 PowerShell 或 CMD 中执行:
# 查看本地镜像列表,确认镜像名称和标签
docker images
# 导出镜像为 tar 压缩包(推荐 gzip 压缩,减少传输体积)
docker save -o myapp-v1.0.tar myapp:latest
# 或者导出并压缩(Windows 需先安装 7-Zip 或 tar 命令)
docker save myapp:latest | gzip > myapp-v1.0.tar.gz
说明:
-o指定输出文件名;如果镜像较大,建议先用 gzip 压缩,能节省 50% 以上体积。
Step 2:通过 SSH/SCP 上传到中间服务器
方式 A:使用 SCP 命令(推荐)
# 上传 tar 包到服务器 /data/images 目录(替换为你的实际路径)
scp myapp-v1.0.tar.gz root@192.168.1.100:/data/images/
# 如果服务器使用非默认 22 端口
scp -P 2222 myapp-v1.0.tar.gz root@192.168.1.100:/data/images/
方式 B:使用 SFTP 工具(如 WinSCP / MobaXterm / FinalShell)
- 打开 WinSCP,连接到你的中间服务器
- 在左侧本地目录找到
myapp-v1.0.tar.gz - 拖拽到右侧服务器的
/data/images/目录 - 等待传输完成
提示:如果文件超过 1GB,建议在网络稳定时传输,或先分割文件:
split -b 500M myapp-v1.0.tar.gz myapp-part-
Step 3:中间服务器加载镜像并推送到仓库
SSH 登录到中间服务器,依次执行:
# 1. 进入存放目录
cd /data/images
# 2. 如果是 gzip 压缩的,先解压
gunzip myapp-v1.0.tar.gz
# 或直接管道加载(推荐,省磁盘空间):
# gunzip -c myapp-v1.0.tar.gz | docker load
# 3. 加载镜像到本地 Docker
docker load -i myapp-v1.0.tar
# 4. 确认镜像已加载
docker images | grep myapp
# 5. 登录镜像仓库(以阿里云 ACR 为例)
docker login --username=your_aliyun_name registry.cn-hangzhou.aliyuncs.com
# 如果是 Docker Hub:
# docker login -u your_dockerhub_username
# 6. 给镜像打仓库标签(命名空间/仓库名:版本号)
docker tag myapp:latest registry.cn-hangzhou.aliyuncs.com/your-namespace/myapp:v1.0
# 7. 推送到仓库
docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/myapp:v1.0
# 8. (可选)清理本地 tar 包节省空间
rm -f myapp-v1.0.tar
命名规范:
registry.cn-hangzhou.aliyuncs.com/命名空间/仓库名:标签
- 命名空间:相当于项目或团队名称
- 仓库名:应用名称
- 标签:版本号,如
v1.0、20260713、latest
Step 4:K8s 前端可视化界面拉取镜像并部署
以下以常见平台为例说明操作路径:
4.1 通用操作流程
4.2 各平台具体操作
Rancher 示例:
-
登录 Rancher UI → 选择集群 → 进入目标命名空间(Namespace)
-
左侧菜单 工作负载 → 部署
-
点击 创建
-
在 容器镜像 处填写完整地址:
registry.cn-hangzhou.aliyuncs.com/your-namespace/myapp:v1.0 -
如果仓库是私有的,在 镜像拉取凭证 中选择或创建
imagePullSecret -
配置端口映射、环境变量、存储卷等
-
点击 启动
-
在 Pod 列表中查看状态变为 Running 即表示成功
KubeSphere 示例:
- 登录 KubeSphere → 进入项目(Project)
- 应用工作负载 → 工作负载 → 创建
- 选择 自定义资源 或 容器镜像
- 填写镜像地址,勾选 镜像仓库密钥(如没有则先创建)
- 完成向导并创建
4.3 镜像拉取密钥(imagePullSecret)创建
如果镜像仓库是私有的,K8s 节点拉取前需要配置凭证:
# 在 K8s 集群中执行(或在前端界面操作)
kubectl create secret docker-registry aliyun-registry-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=your_aliyun_name \
--docker-password=your_password \
--docker-email=your_email \
-n your-namespace
然后在部署时引用该 Secret 即可。
四、时序图(完整交互过程)
五、常见问题速查
| 问题 | 原因 | 解决方案 |
|---|---|---|
docker push 报 denied |
未登录或权限不足 | 执行 docker login,确认账号有推送权限 |
docker load 报 archive/tar: invalid tar header |
tar 包传输过程中损坏 | 重新上传,或加 gzip 压缩后校验 MD5 |
K8s Pod 报 ImagePullBackOff |
镜像地址错误或拉取凭证缺失 | 检查镜像地址拼写;创建 imagePullSecret |
K8s Pod 报 ErrImagePull |
节点无法访问镜像仓库 | 检查 K8s 节点网络连通性;内网仓库需配置 DNS/Hosts |
| SCP 传输大文件失败 | 网络不稳定或超时 | 使用 rsync -P 断点续传,或分割文件 |
镜像标签用了 latest |
不利于版本回滚和追溯 | 始终使用语义化版本标签,如 v1.0.0、20260713 |
六、命令速查表
# ===== 本地 Windows =====
docker images # 查看镜像
docker save -o app.tar app:v1 # 导出镜像
docker save app:v1 | gzip > app.tar.gz # 导出并压缩
# ===== 传输 =====
scp app.tar.gz user@server:/data/ # SCP 上传
rsync -avP app.tar.gz user@server:/data/ # rsync 断点续传
# ===== 中间服务器 =====
docker load -i app.tar.gz # 加载镜像(gunzip 会自动识别)
docker tag app:v1 registry/namespace/app:v1 # 打标签
docker login registry.cn-hangzhou.aliyuncs.com # 登录仓库
docker push registry/namespace/app:v1 # 推送镜像
# ===== K8s 集群 =====
kubectl create secret docker-registry ... # 创建拉取凭证
kubectl get pods -n <namespace> # 查看 Pod 状态
kubectl describe pod <pod-name> -n <ns> # 查看拉取详情/报错
七、最佳实践建议
-
标签管理:不要用
latest作为生产标签,使用v1.0.0或日期标签,方便回滚。 -
分层推送:如果镜像层没有变化,Docker 会自动跳过已存在的层,推送更快。
-
清理策略:中间服务器定期清理旧 tar 包和无用镜像,避免磁盘占满:
docker system prune -f -
安全传输:生产环境建议使用
rsync或sftp替代明文scp,并配置 SSH 密钥免密登录。 -
仓库选择:国内环境优先使用 阿里云 ACR 或 腾讯云 TCR,避免 Docker Hub 网络不稳定。
文档版本:v1.0
适用环境:Windows + Linux 服务器 + Docker + Kubernetes
维护建议:根据实际使用的镜像仓库和 K8s 平台替换示例中的地址和名称。

浙公网安备 33010602011771号