Shell脚本批量升级Docker需标准化“登录→版本检查→下载安装→停旧服务→启新服务→验证”流程,要求目标服务器统一发行版、SSH免密、root权限及网络可达;脚本通过循环逐台执行阿里云镜像源安装指定版本(如24.0.7),并校验版本生效,支持超时控制、并发加速与回滚记录,输出日志便于排查。

用 Shell 脚本批量升级 Docker,核心是把“登录→检查版本→下载安装包→停止旧服务→安装新包→启动验证”这一流程标准化,并通过 SSH 在多台服务器上串行或并行执行。
准备清单:统一环境与权限
确保所有目标服务器满足以下条件,否则脚本会中途失败:
- SSH 免密登录已配置(用
ssh-copy-id user@host提前部署) - 目标机器使用相同发行版(如全为 Ubuntu 22.04 或全为 CentOS 7),因 Docker 官方安装方式依赖系统包管理器
- root 权限可用(脚本中用
sudo或直接以 root 执行) - 网络可访问
download.docker.com(国内建议提前替换为阿里云镜像源)
编写主升级脚本(upgrade_docker.sh)
这个脚本读取服务器列表,逐台执行升级逻辑。关键点在于错误捕获和版本校验,避免“看似成功实则未生效”:
#!/bin/bash
SERVERS=("192.168.1.10" "192.168.1.11" "192.168.1.12")
DOCKER_VERSION="24.0.7" # 指定目标版本,避免拉最新不稳定版
<p>for host in "${SERVERS[@]}"; do
echo "=== 升级 $host ==="</p><h1>1. 检查当前版本并记录</h1><p>ssh "$host" 'docker --version 2>/dev/null || echo "Docker 未安装"' </p><h1>2. 下载并安装指定版本(以 Ubuntu 为例)</h1><p>ssh "$host" "
set -e</p><h1>添加 Docker 官方 GPG 密钥(或用阿里云源)</h1><pre class="brush:php;toolbar:false;">curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 配置源(适配系统)
echo 'deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable' | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
# 安装指定版本(防止自动升级到非预期版)
sudo apt-get install -y docker-ce=$DOCKER_VERSION\* docker-ce-cli=$DOCKER_VERSION\* containerd.io
sudo systemctl enable docker
sudo systemctl restart docker"
3. 验证安装结果
if ssh "$host" "docker version | grep 'Version:' | head -1 | grep -q '$DOCKER_VERSION'"; then echo "✅ $host 升级成功" else echo "❌ $host 升级失败,请手动检查" fi done
增强健壮性的实用技巧
生产环境建议加入这些细节,减少人工干预:
-
超时控制:在 ssh 命令中加
-o ConnectTimeout=10 -o BatchMode=yes,避免卡死 -
并发执行:用
parallel替代 for 循环(需提前安装:apt install parallel),加快大批量操作 -
回滚预留:升级前用
dpkg -l | grep docker(Debian/Ubuntu)或rpm -qa | grep docker(RHEL/CentOS)记录旧版本,存入日志文件 -
容器兼容性提醒:Docker 24+ 默认启用
containerdv2,若运行老版本 Kubernetes 或自定义 runtime,需同步更新 containerd
执行与日志管理
运行脚本时重定向输出,便于事后排查:
chmod +x upgrade_docker.sh ./upgrade_docker.sh 2>&1 | tee upgrade_$(date +%Y%m%d).log
日志中会包含每台机器的完整执行过程,失败时能快速定位是网络、权限还是包依赖问题。











