ubuntu 在多台主机上批量安装加载并运行 docker 镜像
前提:
- 主机之间可以相互通信
- 所有主机开放 ssh root 用户远程连接权限
- 所有主机 root 用户密码相同
- 所有主机开放22端口,或者指定端口
1.安装sshpass
sudo apt update
sudo apt install sshpass
2.准备主机列表文件
创建一个名为 hosts.txt
的文件:
nano hosts.txt
格式如下:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
如果没有指定用户名,下面的脚本会默认使用 root 用户。
3.创建一个批处理脚本
该脚本会在指定的主机上同时安装、加载并运行 docker 镜像,每台主机上创建一个日志文件,保存在 /tmp
目录下的 talimu_deploy.remote.log
文件中。此外,该脚本还会持续监控每台主机的部署状态,并输出到终端。完成所有主机部署后,会输出最终的部署统计结果。并且,还会把每台主机在部署过程中产生的日志文件保存到 远程主机日志
目录下,并以每台主机的 ip
命名。
其中的 install_big_box_env.sh
脚本是自定义的安装 docker 的前置环境的脚本,包括离线安装 docker 、nvidia-container-toolkit 和加载本地镜像等操作。
#!/bin/bash
# 声明关联数组
declare -A hosts_status
# 配置参数
HOSTS_FILE="hosts.txt"
PASSWORD="Qwer1234!"
SSH_PORT="22"
REMOTE_LOGS_DIR="远程主机日志"
mkdir -p "$REMOTE_LOGS_DIR"
# 定义要执行的命令
COMMANDS="cd /home/yy/talimu/talimu && \
echo '开始执行安装脚本...' && \
bash install_big_box_env.sh && \
# 停止并删除旧容器
echo '正在停止并删除旧容器...' && \
docker stop talimu1.0 || true && \
docker rm -f talimu1.0 || true && \
# 启动新容器
echo '正在启动新容器...' && \
docker run --gpus all -d --network host \
--device=/dev/snd \
-v /etc/asound.conf:/etc/asound.conf \
-v ~/.asoundrc:/root/.asoundrc \
-v /app:/app \
-v /voice_models:/voice_models \
-v /db:/db \
-p 81:81 \
--name talimu1.0 \
--restart always \
talimu:1.0 python3 app.py --logfile=output.log && \
echo '容器启动完成'"
# 定义颜色
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# execute_remote_command 函数
execute_remote_command() {
local username=$1
local host=$2
local commands=$3
local log_prefix=$4
local log_file="${REMOTE_LOGS_DIR}/${host}.log"
# 创建或清空日志文件
echo "==================== 部署日志 ====================" > "$log_file"
echo "开始时间: $(date '+%Y-%m-%d %H:%M:%S')" >> "$log_file"
echo "部署主机: $username@$host" >> "$log_file"
echo "================================================" >> "$log_file"
echo "" >> "$log_file"
echo "开始执行远程命令 - $username@$host" | tee -a "$log_file"
# 执行远程命令
sshpass -p "$PASSWORD" ssh -p $SSH_PORT -o StrictHostKeyChecking=no "$username@$host" \
"nohup bash -c '$commands' > $log_prefix.remote.log 2>&1 &" 2>&1 | tee -a "$log_file"
sleep 5
# 检查命令是否成功启动
if sshpass -p "$PASSWORD" ssh -p $SSH_PORT "$username@