Sh,Docker 运维好帮手,一招通过 sh 脚本批量快速启动和重启多个Docker 容器

前言

这里教大家用 sh脚本 实现多 Docker WEB容器的启动或重启 

ps:小白、简单、高效

常用场景

 版本更新的时候 同一个镜像要启动10个容器 要求是 每个容器名 是我输入的容器名 +1 +2 依次类推,

监听的端口号 也是比如 第一个是80, 第二个是81  依次类推

脚本内容

#!/bin/bash


STRING_REGEX=".+"
NUMBER_REGEX="^[0-9]+$"

# 确保用户输入不为空并且符合给定的正则表达式
ensure_valid_input() {
    local prompt="$1" # 提示信息
    local regex="$2" # 正则表达式,用于验证输入格式
    local default="$3" # 默认值
    local input
    while true; do
        echo -n "$prompt" >&2
        read input
        if [[ -z "$input" ]]; then
            if ! [[ -z "$default" ]]; then
               echo "$default"
               return
            fi
        echo "输入不能为空,请重新输入!" >&2
        elif ! [[ $input =~ $regex ]]; then
            echo "输入格式不正确,请重新输入!" >&2
        else
            break
        fi
    done

    echo "$input"
}

# 开始或重启操作
while true; do
  echo -n "请输入需要的操作指令 (启动 start 重启容器 restart): "
  read action
  if [[ "$action" == "start" || "$action" == "restart" ]]; then
    break
  else
    echo "无效输入,请输入 start 或 restart !"
  fi
done

if [[ "$action" == "start" ]]; then
    container_count=$(ensure_valid_input "输入要启动的容器数量 (默认 1): " $NUMBER_REGEX 1)
    if [[ "$container_count" -eq 0 ]] || [[ "$container_count" -gt 100 ]]; then
        echo "容器数量输入无效!最大 100"; exit
    fi

    image_name=$(ensure_valid_input "输入需要启动容器镜像的名称: " $STRING_REGEX)
    version=$(ensure_valid_input "输入容器镜像的版本号(默认 latest):" $STRING_REGEX latest)
    base_name=$(ensure_valid_input "输入容器的基础名称 (前缀): " $STRING_REGEX)
    volume_name=$(ensure_valid_input "输入容器的挂载卷(默认 \$PWD:/app): " $STRING_REGEX "$PWD:/app")
    starting_host_port=$(ensure_valid_input "请输入宿主机监听的端口号:(默认 81) " $NUMBER_REGEX 81)
    container_port=$(ensure_valid_input "请输入容器的监听端口号 (默认 8081): " $NUMBER_REGEX 8081)

    for ((i=1; i<=container_count; i++)); do
        container_name="${base_name}-${i}"
        host_port=$((starting_host_port + i - 1))

        # 检查容器是否已经在运行,如果运行则删除容器
        if docker ps -a --format "{{.Names}}" | grep -q "^${container_name}$"; then
            echo "停止并删除已存在的容器 ${container_name}..."
            docker stop ${container_name} &> /dev/null
            docker rm ${container_name} &> /dev/null
        fi

        # 构建并运行容器的命令
        if [[ "$version" == "latest" ]]; then
            docker_command="docker run -d -v ${volume_name} -p ${host_port}:${container_port} --name ${container_name} --restart=always ${image_name}"
        else
            docker_command="docker run -d -v ${volume_name} -p ${host_port}:${container_port} --name ${container_name} --restart=always ${image_name}:${version}"
        fi
        echo "运行命令:$docker_command"
        eval $docker_command
    done
elif [[ "$action" == "restart" ]]; then
    container_name=$(ensure_valid_input "请输入容器完整名称或容器名称前缀: " $STRING_REGEX)

    # 列出所有容器(包括停止的容器),筛选出符合条件的容器
    containers=$(docker ps -a --format "{{.Names}}" | grep "^${container_name}")

    if [ -z "$containers" ]; then
        echo "没有找到匹配的容器 ${container_name} ..."
    else
        for container in $containers; do
            # 检查容器是否已经在运行,如果运行则先停止容器
            if docker ps --format "{{.Names}}" | grep -q "^${container}$"; then
                echo "停止容器 ${container}..."
                docker stop ${container} &> /dev/null
            fi
            echo "正在重启容器 ${container}"
            docker restart ${container}
        done
    fi
fi

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摔倒的红烧肉850

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值