Docker 镜像跨环境推送与 K8s 部署完整教程

适用场景:本地 Windows 开发环境构建好镜像后,需经中间服务器推送到镜像仓库,再由另一台服务器的 K8s 前端可视化平台拉取部署。


一、整体流程概览

flowchart LR subgraph A["本地 Windows"] A1["构建/拥有镜像"] A2["docker save 导出 tar"] end subgraph B["传输通道"] B1["SCP / SFTP / rsync"] end subgraph C["中间服务器"] C1["docker load 加载"] C2["docker tag 打标签"] C3["docker push 推送"] end subgraph D["镜像仓库"] D1["Docker Hub / 阿里云 ACR / Harbor"] end subgraph E["目标 K8s 集群"] E1["前端可视化界面<br/>(如 Rancher / KubeSphere / Dashboard)"] E2["Pod 拉取镜像并运行"] end A1 --> A2 --> B1 --> C1 --> C2 --> C3 --> D1 --> E1 --> E2

二、前置条件

环境 要求
本地 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)

  1. 打开 WinSCP,连接到你的中间服务器
  2. 在左侧本地目录找到 myapp-v1.0.tar.gz
  3. 拖拽到右侧服务器的 /data/images/ 目录
  4. 等待传输完成

提示:如果文件超过 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.020260713latest

Step 4:K8s 前端可视化界面拉取镜像并部署

以下以常见平台为例说明操作路径:

4.1 通用操作流程

flowchart TD A["登录 K8s 可视化平台"] --> B["进入 工作负载/Deployment 页面"] B --> C["点击 创建/部署新应用"] C --> D["填写容器镜像地址"] D --> E["配置镜像拉取密钥 imagePullSecret"] E --> F["设置资源限制、端口、环境变量"] F --> G["点击 创建/部署"] G --> H["查看 Pod 状态是否为 Running"]

4.2 各平台具体操作

Rancher 示例

  1. 登录 Rancher UI → 选择集群 → 进入目标命名空间(Namespace)

  2. 左侧菜单 工作负载 → 部署

  3. 点击 创建

  4. 容器镜像 处填写完整地址:

    registry.cn-hangzhou.aliyuncs.com/your-namespace/myapp:v1.0
    
  5. 如果仓库是私有的,在 镜像拉取凭证 中选择或创建 imagePullSecret

  6. 配置端口映射、环境变量、存储卷等

  7. 点击 启动

  8. Pod 列表中查看状态变为 Running 即表示成功

KubeSphere 示例

  1. 登录 KubeSphere → 进入项目(Project)
  2. 应用工作负载 → 工作负载 → 创建
  3. 选择 自定义资源容器镜像
  4. 填写镜像地址,勾选 镜像仓库密钥(如没有则先创建)
  5. 完成向导并创建

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 即可。


四、时序图(完整交互过程)

sequenceDiagram autonumber participant Win as 本地 Windows participant Srv as 中间服务器 participant Reg as 镜像仓库 participant K8s as K8s 集群 participant UI as 前端可视化界面 Win->>Win: docker build / docker save Win->>Srv: SCP/SFTP 上传 tar 包 Srv->>Srv: docker load / docker tag Srv->>Reg: docker login + docker push Reg-->>Srv: 推送成功 UI->>K8s: 用户填写镜像地址并创建 Deployment K8s->>Reg: kubelet 拉取镜像(带 imagePullSecret) Reg-->>K8s: 返回镜像层 K8s->>K8s: 创建 Pod 并运行容器 K8s-->>UI: 状态更新为 Running UI-->>UI: 用户查看日志/监控确认正常

五、常见问题速查

问题 原因 解决方案
docker pushdenied 未登录或权限不足 执行 docker login,确认账号有推送权限
docker loadarchive/tar: invalid tar header tar 包传输过程中损坏 重新上传,或加 gzip 压缩后校验 MD5
K8s Pod 报 ImagePullBackOff 镜像地址错误或拉取凭证缺失 检查镜像地址拼写;创建 imagePullSecret
K8s Pod 报 ErrImagePull 节点无法访问镜像仓库 检查 K8s 节点网络连通性;内网仓库需配置 DNS/Hosts
SCP 传输大文件失败 网络不稳定或超时 使用 rsync -P 断点续传,或分割文件
镜像标签用了 latest 不利于版本回滚和追溯 始终使用语义化版本标签,如 v1.0.020260713

六、命令速查表

# ===== 本地 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>       # 查看拉取详情/报错

七、最佳实践建议

  1. 标签管理:不要用 latest 作为生产标签,使用 v1.0.0 或日期标签,方便回滚。

  2. 分层推送:如果镜像层没有变化,Docker 会自动跳过已存在的层,推送更快。

  3. 清理策略:中间服务器定期清理旧 tar 包和无用镜像,避免磁盘占满:

    docker system prune -f
    
  4. 安全传输:生产环境建议使用 rsyncsftp 替代明文 scp,并配置 SSH 密钥免密登录。

  5. 仓库选择:国内环境优先使用 阿里云 ACR腾讯云 TCR,避免 Docker Hub 网络不稳定。


文档版本:v1.0
适用环境:Windows + Linux 服务器 + Docker + Kubernetes
维护建议:根据实际使用的镜像仓库和 K8s 平台替换示例中的地址和名称。

posted @ 2026-07-13 18:26  RK5123153  阅读(36)  评论(0)    收藏  举报