docker启动rabbitmq配置账号密码以及固定访问ip

docker启动rabbitmq命令:

复制代码
#rabbitmq

docker run --name rabbitmq \
-p 5672:5672 -p 15672:15672 \
--restart=always -d --privileged=true \
-v /etc/localtime:/etc/localtime:ro \
-e TZ=Asia/Shanghai rabbitmq

docker exec -it rabbitmq /bin/bash
rabbitmq-plugins enable rabbitmq_management
exit

上述是正常普通的启动rabbitmq,默认访问账号密码是guest,使用下列脚本内容执行可实现:rabbitmq自定义配置账号密码以及固定访问ip,更安全!

deploy_rabbitmq.sh内容:

复制代码
#!/bin/bash

set -e

#########################################
# 配置项 
#########################################

# 允许访问 RabbitMQ 的IP 示例:"192.168.110.22 192.168.110.20"
ALLOWED_IPS="192.168.110.22"

# RabbitMQ 管理账号
RABBITMQ_USER="user"
RABBITMQ_PASS="Gp#9$Lk@2qXz!"

CONTAINER_NAME="rabbitmq"
IMAGE="rabbitmq"

#########################################
# 删除旧容器
#########################################

echo "=============================="
echo "1. 删除旧容器(如果存在)"
echo "=============================="

docker rm -f ${CONTAINER_NAME} >/dev/null 2>&1 || true

#########################################
# 启动 RabbitMQ
#########################################

echo "=============================="
echo "2. 启动 RabbitMQ 容器"
echo "=============================="

docker run -d \
  --name ${CONTAINER_NAME} \
  -p 5672:5672 \
  -p 15672:15672 \
  --restart=always \
  --privileged=true \
  -v /etc/localtime:/etc/localtime:ro \
  -e TZ=Asia/Shanghai \
  -e RABBITMQ_DEFAULT_USER=${RABBITMQ_USER} \
  -e RABBITMQ_DEFAULT_PASS=${RABBITMQ_PASS} \
  ${IMAGE}

echo "等待 RabbitMQ 启动..."
sleep 20

#########################################
# 检查容器
#########################################

echo "=============================="
echo "3. 检查容器状态"
echo "=============================="

docker ps | grep ${CONTAINER_NAME} >/dev/null || {
    echo "RabbitMQ 启动失败"
    exit 1
}

#########################################
# 启用 management 插件
#########################################

echo "=============================="
echo "4. 检查 management 插件"
echo "=============================="

# 等 RabbitMQ 真正可用(关键!)
echo "等待 RabbitMQ readiness..."
for i in {1..30}; do
  if docker exec ${CONTAINER_NAME} rabbitmqctl status >/dev/null 2>&1; then
    echo "RabbitMQ 已就绪"
    break
  fi
  echo "等待中... $i"
  sleep 10
done

# 判断插件是否已启用(正确方式)
if docker exec ${CONTAINER_NAME} rabbitmq-plugins list | grep -q "rabbitmq_management.*E"; then
    echo "rabbitmq_management 已启用"
else
    echo "启用 rabbitmq_management..."

    docker exec ${CONTAINER_NAME} rabbitmq-plugins enable rabbitmq_management

    echo "重启 RabbitMQ..."
    docker restart ${CONTAINER_NAME}

    sleep 10
fi

#########################################
# 配置 DOCKER-USER 白名单
#########################################

echo "=============================="
echo "5. 配置 IP 白名单"
echo "=============================="

# 确保链存在
iptables -N DOCKER-USER 2>/dev/null || true

# 清空旧规则
iptables -F DOCKER-USER

# 放行已建立连接
iptables -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 遍历白名单
for ip in $ALLOWED_IPS; do
  iptables -A DOCKER-USER -s $ip -p tcp --dport 5672 -j ACCEPT
  iptables -A DOCKER-USER -s $ip -p tcp --dport 15672 -j ACCEPT
done

# 拒绝其他所有
iptables -A DOCKER-USER -p tcp --dport 5672 -j DROP
iptables -A DOCKER-USER -p tcp --dport 15672 -j DROP

echo "当前 DOCKER-USER 规则:"
iptables -L DOCKER-USER -n -v --line-numbers


echo "部署完成"