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/