背景

在开发和生产环境中,有时服务器所在的网络环境或者 Docker Registry 的网络连接速度可能较慢,导致直接在服务器上拉取 Docker 镜像非常耗时。为了解决这个问题,我们可以在本地机器上先下载所需的 Docker 镜像,然后通过 SSH 将镜像文件传输到目标服务器上,并在目标服务器上加载这些镜像,从而大大缩短部署时间。

批处理脚本示例

以下是一个完整的批处理脚本示例,用于自动化拉取、保存、传输和加载 Docker 镜像:

@echo off
REM 设置变量
set IMAGE_NAME=xiebinn/dotnet:6.0-aspnetcore-runtime-with-ghostscript
set SAVE_FILE=aspnetcore6_image.tar
set TARGET_USER=root
set TARGET_HOST=192.168.1.125
set TARGET_PATH=/appwork2/images

REM 拉取 Docker 镜像
echo 正在拉取 Docker 镜像 %IMAGE_NAME%...
docker pull %IMAGE_NAME%

REM 保存 Docker 镜像为 tar 文件(在脚本所在目录)
echo 正在保存 Docker 镜像为 %SAVE_FILE%...
docker save -o "%SAVE_FILE%" %IMAGE_NAME%

REM 传输 tar 文件到目标机器
echo 正在传输 Docker 镜像到目标服务器 %TARGET_HOST%:%TARGET_PATH%...
REM 请确保你已经设置好了 SSH 密钥认证,避免每次输入密码
scp "%SAVE_FILE%" %TARGET_USER%@%TARGET_HOST%:%TARGET_PATH%

REM 在目标机器上加载镜像
echo 正在在目标服务器上加载 Docker 镜像 %IMAGE_NAME%...
ssh %TARGET_USER%@%TARGET_HOST% "docker load -i %TARGET_PATH%/%SAVE_FILE%"

echo Docker 镜像已成功传输并加载到目标机器上。
pause

如何使用这个脚本

  1. 修改变量:根据你的实际情况修改脚本中的变量。
    • IMAGE_NAME:指定要部署的 Docker 镜像名称。
    • TARGET_HOST:目标服务器的 IP 地址或域名。
    • TARGET_PATH:目标服务器上用于存放镜像文件的路径。
  2. 运行脚本:将脚本保存为 .bat 文件,然后在本地运行它。脚本会自动执行拉取镜像、保存为 tar 文件、传输到目标服务器并加载的操作。

  3. 检查结果:脚本执行完成后,会输出成功信息。你可以登录到目标服务器上,确认镜像是否成功加载,并继续进行后续的部署或运行操作。

注意事项

  • SSH 密钥认证:确保你的本地机器和目标服务器之间已经设置好了 SSH 密钥认证,以免每次传输和加载时需要手动输入密码。

  • 网络和权限问题:在实际使用中,可能会遇到网络连接问题、权限问题或者目标服务器上 Docker 环境配置不当等情况。在脚本中添加适当的错误处理和调试输出可以帮助你快速定位和解决问题。

通过这篇文章,你学会了如何使用批处理脚本自动化部署 Docker 镜像到目标服务器,并优化了部署过程中因镜像下载速度慢而导致的等待时间,提升了部署效率和可靠性。