RabbitMQ docker 运行命令

时间:2021-07-07 22:12:06

标签: docker docker-compose rabbitmq

目前,我正在使用以下 docker-compose 文件运行 3 节点 rabbitmq 集群。

rabbit1:
  image: rabbitmq-server:0.0.1
  hostname: rabbit1
  ports:
    - "5672:5672"
    - "15672:15672"
  environment:
    - RABBITMQ_DEFAULT_USER=root
    - RABBITMQ_DEFAULT_PASS=root
    - HOSTNAME=rabbit1

rabbit2:
  image: rabbitmq-server:0.0.1
  hostname: rabbit2
  links:
    - rabbit1
  environment: 
   - CLUSTERED=true
   - CLUSTER_WITH=rabbit1
   - RAM_NODE=true
   - HOSTNAME=rabbit2
  ports:
      - "5673:5672"
      - "15673:15672"

rabbit3:
  image: kumar/rabbitmq-server:0.0.1
  hostname: rabbit3
  links:
    - rabbit1
    - rabbit2
  environment: 
   - CLUSTERED=true
   - CLUSTER_WITH=rabbit1
   - HOSTNAME=rabbit3
  ports:
        - "5674:5672"

这是 Dockerfile 包含的用于启动容器并形成集群的脚本。

#!/bin/bash

change_default_user() {
    
    if [ -z $RABBITMQ_DEFAULT_USER ] && [ -z $RABBITMQ_DEFAULT_PASS ]; then
        echo "Maintaining default 'guest' user"
    else 
        echo "Removing 'guest' user and adding ${RABBITMQ_DEFAULT_USER}"
        rabbitmqctl delete_user guest
        rabbitmqctl add_user $RABBITMQ_DEFAULT_USER $RABBITMQ_DEFAULT_PASS
        rabbitmqctl set_user_tags $RABBITMQ_DEFAULT_USER administrator
        rabbitmqctl set_permissions -p / $RABBITMQ_DEFAULT_USER ".*" ".*" ".*"
    fi
}

if [ -z "$CLUSTERED" ]; then
    # if not clustered then start it normally as if it is a single server
    /usr/sbin/rabbitmq-server &
    rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
    change_default_user 
    tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
else
    if [ -z "$CLUSTER_WITH" ]; then
        # If clustered, but cluster with is not specified then again start normally, could be the first server in the
        # cluster
        /usr/sbin/rabbitmq-server &
        rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
        tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
    else
        /usr/sbin/rabbitmq-server &
        rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
        rabbitmqctl stop_app
        if [ -z "$RAM_NODE" ]; then
            rabbitmqctl join_cluster rabbit@$CLUSTER_WITH
        else
            rabbitmqctl join_cluster --ram rabbit@$CLUSTER_WITH
        fi
        rabbitmqctl start_app
                
        # Tail to keep the a foreground process active..
        tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
    fi
fi


我需要将 docker-compose 转换为 docker run 命令并以集群格式启动所有三个容器。我面临的问题是我需要一个运行命令,该命令可用于一个一个地启动所有容器,仅通过名称区分并形成一个集群。我如何传递像 --link 这样的命令和一些特定的环境变量,以便单个运行命令可以容纳所有。

docker run -d --net mynet1 --ip 172.18.0.11 --hostname rab1 --add-host rab2:172.18.0.12 --add-host rab3:172.18.0.13 --name rab1con -p 15672:15672 -e HOSTNAME=rab1 kumar/rabbitmq-server:0.0.1


docker run -d --net mynet1 --ip 172.18.0.12 --hostname rab2 --add-host rab1:172.18.0.11 --add-host rab3:172.18.0.13 --name rab2con -p 15673:15672 -e HOSTNAME=rab2 -e CLUSTERED=true -e CLUSTER_WITH=rab1 kumar/rabbitmq-server:0.0.1

docker run -d --net mynet1 --ip 172.18.0.13 --hostname rab3 --add-host rab1:172.18.0.11 --add-host rab2:172.18.0.12 --name rab3con -p 15674:15672 -e HOSTNAME=rab3 -e CLUSTERED=true -e CLUSTER_WITH=rab1 kumar/rabbitmq-server:0.0.1

这些是 3 个 docker 命令,可用于启动容器并形成集群。有没有办法让它通用,所以我可以删除 -e CLUSTERED=true -e CLUSTER_WITH=rab1

1 个答案:

答案 0 :(得分:0)

$ docker run -d --name=rabbit1 -h rabbit1 -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root -e HOSTNAME=rabbit1 rabbitmq:3 && docker run --name=rabbit2 -d -h rabbit2 --link rabbit1 -p 5673:5672 -p 15673:15672 -e CLUSTERED=true -e CLUSTER_WITH=rabbit1 -e RAM_NODE=true -e HOSTNAME=rabbit2 rabbitmq:3 && docker run --name=rabbit3 -d -h rabbit3 --link rabbit1 --link rabbit2 -p 5674:5672 -e CLUSTERED=true -e CLUSTER_WITH=rabbit1 -e HOSTNAME=rabbit3 rabbitmq:3 && sleep 15 && docker run -it --name=bash --link rabbit1 --link rabbit2 --link rabbit3 bash

41fa0f064aefd6382d1d20b9b716df3ebb21b99b44882f8cf3ffb1e789103d5d
87c1fec7a8eadbe7745f9496bc53935a5e8ddaa68b90c2b4faaaf8843f2dd5a0
9dc4e612c993df4aeacffc384c6c445d5d3ecef3ec5bea73797f6a33809c52f1

bash-5.1# ping rabbit1
PING rabbit1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.130 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.125 ms
--- rabbit1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.125/0.127/0.130 ms
bash-5.1# ping rabbit2
PING rabbit2 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.132 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.243 ms
--- rabbit2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.132/0.187/0.243 ms
bash-5.1# ping rabbit3
PING rabbit3 (172.17.0.4): 56 data bytes
64 bytes from 172.17.0.4: seq=0 ttl=64 time=0.167 ms
64 bytes from 172.17.0.4: seq=1 ttl=64 time=0.118 ms
--- rabbit3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.118/0.142/0.167 ms
bash-5.1# nc -zv rabbit2 5672
rabbit2 (172.17.0.3:5672) open
docker ps
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                                                                                              NAMES
7fbd718c6c18   rabbitmq:3              "docker-entrypoint.s…"   7 seconds ago    Up 4 seconds    4369/tcp, 5671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5674->5672/tcp                             rabbit3
9cdc70795d49   rabbitmq:3              "docker-entrypoint.s…"   10 seconds ago   Up 7 seconds    4369/tcp, 5671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:5673->5672/tcp, 0.0.0.0:15673->15672/tcp   rabbit2
f8533f132c59   rabbitmq:3              "docker-entrypoint.s…"   14 seconds ago   Up 10 seconds   4369/tcp, 0.0.0.0:5672->5672/tcp, 5671/tcp, 15691-15692/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbit1

我将 docker 镜像更改为实际的 rabbitmq:3 以便能够运行命令。我还在命令链的末尾添加了 bash 容器以检查 rabbit{1,2,3} 是否在容器组内可用。

也可以通过this service将docker-compose文件转换为运行命令。
如果您要使用它,请不要忘记将 -d--name=rabbit{1,2,3} 手动添加到 run