docker版本:18.09.6 或以上
rabbitmq映象版本:rabbitmq:3.9.5-management
一、拉映象:
docker pull rabbitmq:3.9.5-management

二、檢視映象erlang cookie:

docker run --rm rabbitmq:3.9.5-management
ctrl - c 結束執行(自動刪除容器,不用關心這個臨時容器)
 
三、輸出的日誌中找到"cookie hash": sFDpr2/hTjqLDpdtOgrhpg==

四、建立docker swarm叢集(單節點直接為管理節點,多節點建立docker叢集):

docker swarm init --default-addr-pool 200.0.0.0/24 --advertise-addr 172.16.11.54

說明:

這是必要的步驟,先元件docker叢集,不然無法使用後續步驟需要的“機要資訊儲存”和“服務叢集”
--default-addr-pool為在該叢集內的隧道ip,給容器用的,
--advertise-addr 172.16.11.54這是本機物理ip為組建docker叢集用的,
執行後需要記錄好反饋資訊。
Swarm initialized: current node (azez8x2ae1u3l5uqwpexf3yi2) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mo2do1p8oxgcou36dhzd1o8lbvr7ecxh0ecdfza9pt1a47tez-1yuyuqo9cm252nsdz7bov68ir 172.16.11.54:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

五、利用docker機要資訊儲存erlang cookie:

printf "KYSleSjVyzf0Gej+eiPpCQ==" | docker secret create doc-rabbit-erlcookie -

六、建立一個用於給rabbitmq叢集內部使用的網路:(這一步不是必要的,但推薦執行,便於管理這一層網路)

docker network create \
--driver overlay \
rabbitmq_network

七、在docker叢集中可以直接建立rabbitmq服務叢集:

docker service create --container-label doc-rabbit --replicas 3 \
--name doc-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--network rabbitmq_network \
--secret source=doc-rabbit-erlcookie,target=/var/lib/rabbitmq/.erlang.cookie,uid=999,gid=999,mode=0600 \
rabbitmq:3.9.5-management

解釋:

使用rabbitmq:3.9.5-management映象建立叢集
使用機要doc-rabbit-erlcookie(參考第4步)儲存的資訊,放在叢集每個容器的/var/lib/rabbitmq/.erlang.cookie檔案中,並且明確檔案屬組和許可權,這裡是rabbitmq對它有這樣的要求
定義容器標籤:--container-label doc-rabbit
定義容器副本個數(規模,我這裡是3個擴充套件)--replicas 3 
定義容器主機名--hostname doc-rabbitmq
定義這個服務叢集的名字--name doc-rabbitmq

八、由於直接使用docker,未找到資料證明可以自動構建叢集的方式,k8s下可以參考rabbitmq官方文件,其中有關於在k8s下構建的兩種方式,和相應k8s外掛

開始構建叢集
使用docker ps 檢視容器名稱,其命名規則是擴充套件容器邏輯名稱.擴充套件節點id
使用docker service ps doc-rabbitmq 檢視服務中的擴充套件容器邏輯名稱和相應id
通過以上兩個指令,找到相應3個擴充套件容器,記錄容器的id,就是記錄docker ps檢視到的第一列的id號
通過docker service方式定義的容器組,每個容器預設的hostname就是容器id
對容器進行偽終端操作,
規劃一下rabbitmq主節點、磁碟節點、記憶體節點,例如:rabbitmq1(容器名是abcdefg)是主節點同時是磁碟節點,rabbitmq2(容器名是hijklmn),rabbitmq3(容器名是opqrst)是記憶體節點
docker exec rabbitmq2 rabbitmqctl stop_app && rabbitmqctl join_cluster rabbit@abcdefg --ram && rabbitmqctl start_app
docker exec rabbitmq3 rabbitmqctl stop_app && rabbitmqctl join_cluster rabbit@abcdefg --ram && rabbitmqctl start_app

兩個記憶體節點加入集群后,rabbitmq叢集就搭建完成了,

這裡不是docker的使用風格,不該由容器進行操作構建叢集,所以這裡需要仍需要後續探索。

9、驗證

因為在docker服務構建過程中,使用了埠對映,可以從docker節點的物理機ip直接進行訪問,這裡底層是ipvs,所以任意docker swarm的叢集物理ip都能訪問
瀏覽器訪問:http://172.16.11.54:15672,使用者名稱密碼都是預設的guest。
參考資料:
https://hub.docker.com/_/rabbitmq
https://docs.docker.com/engine/reference/commandline/service_create/#create-a-service-with-secrets
https://docs.docker.com/engine/swarm/secrets/