docker swarm模式跨主機連接

一、前言

        當我們開發好微服務之後,考慮到靈活快速持續部署的需要,通常會考慮將其Docker鏡像化並在Docker環境下運行。由於微服務個數通常會較多,把所有微服務部署在一台docker主機上是不現實的,因此需要考慮到跨主機通信的問題,對實際部署必然會提出以下幾點要求:

        1. 微服務作為一個docker container可以在任意host上運行;

        2. 同一host上可以運行多個相同的微服務;

        3. 運行在同一個host上的微服務之間可以相互通信;

        4. 運行在不同host上的微服務也可以相互通信;

        5. 每個微服務的ip地址不受host所在本地局域網ip地址段限制,即擁有獨立網段,避免佔用本地IP地址,同時確保container數量受限盡量小;

        6. 每個微服務container避免通過端口暴露的方式相互通信,確保不會因端口獨佔而導致無法靈活部署。

        綜上原因,docker swarm模式下將各微服務加入同一個overlay network網絡的方式實現微服務之間的相互通信。

 

二、總體架構圖(來源網絡)

 

說明:

如圖所示,假設本地局域網段10.159.62.0/24中存在主機10.159.62.231,10.159.62.232和10.159.62.233互聯互通

每個主機上都運行dockerengine,通過docker engine運行若干個docker container,例如圖中的Order,Billing等等。

將這3台主機建立成為一個dockerswarm集群

創建一個docker overlay網絡(網段10.10.0.0/24),每個主機上的container都被加入到該overlay網絡中,通過overlay網絡實現跨主機的container相互通信

假設console,terminal和api這三個服務均需要暴露端口到物理網絡,因為物理網絡10.159.62.0/24無法直接訪問overlay網絡中的container,需要container中映射端口到物理網絡。

overlay網絡中的container默認通過與主機之間的bridge訪問物理網絡。

 

三、創建Swarm 集群

 

1.準備機器3台

l172.17.0.201

l172.17.0.143

l172.17.0.89

 

 在主機201上創建管理節點

 $ docker swarm init –advertise-addr 172.17.0.201

執行完會顯示

Swarm initialized: current node (vjvp9h9cu1q1umerisj579g4r) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join –token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8n05wlyxoq3ckmv4bd5pj3x4g 172.17.0.201:2377

To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

 

 swarm集群需要使用到相同的Overlay network(網卡),所以我們應該給另外的節點也設置為管理節點,通過命令docker swarm join-token manager

 在201,89服務器生成管理節點token(也可以先成工作節點,再升級為管理節點)執行完會顯示:

 To add a manager to this swarm, run the following command:

 docker swarm join –token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

 

2. 在主機143上創建管理節點

   $ docker swarm join –token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

 

3.在主機89上創建管理節點

   $ docker swarm join –token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

 

 

通過任意一個節點命令可以查詢節點名稱

docker node ls(目前設置的為兩個節點)

 

節點的hostname 沒有可讀性,可以通過下面命令修改各個服務器的hostname(不設置可以忽略此部分)

# hostnamectl set-hostname manger201 # systemctl restart docker

 

再次docker node ls如下

 

四、構建Overlay network(容器互通的關鍵)

 

在管理節點主機201上執行

docker network create -d overlay –subnet=10.10.0.0/16 –gateway=10.10.0.254 –attachable=true my-network-overlay

通過docker network ls命令查看到生成的集群網卡,另外兩台服務器節點通過該命令也可以查看到這個集群網絡

 

 

擴展部分(dubbo2.7.X版本以上需要設置)

由於dubbo2.7.6後zk註冊中心消費者使用的容器ip是docker swarm network網卡的docker_gwbridge

 

 

需要將集群中所有節點的

docker_gwbridge改為相同的網段,否則遠程調用將調用不通(nacos註冊中心用的是my-network-overlay網段,不需要設置docker_gwbridge),修改方式參考:

//www.cnblogs.com/yyxianren/p/10892066.html

查看當前網段

docker network inspect docker_gwbridge

刪除網段

docker network rm docker_gwbridge

 

如果報次錯需要先解散集群再進行刪除操作

Error response from daemon: error while removing network: network docker_gwbridge id 6bb302db0876b57762afbe49d0c3df1641a9da59c20d4640530c53585f9b457b has active endpoints

 

使用以下命令先解散集群再刪除:

docker swarm leave

docker network rm docker_gwbridge

service docker restart

 

如果為從管理節點143,89,先降級為任務節點,再解散

如果為主管理節點201,則需要重新初始化集群和重建Overlay network網絡,按步驟三和步驟四進行操作

 

生成網段,由於是docker_gwbridge 網卡scope 是local,所以需要所有集群節點進行重新生成

docker network create –subnet 172.21.0.0/20 –gateway 172.21.0.1 -o com.docker.network.bridge.enable_icc=false -o com.docker.network.bridge.name=docker_gwbridge docker_gwbridge

 

五、部署服務

根據上文架構圖中所示分別在各主機上執行類似的命令,將各微服務docker container啟動起來。

對於不需要暴露端口的微服務,命令類似如下

$ docker run –name order –network=my-network-overlay 10.159.62.231/somecom/order:1.0.0 &

通過–network=my-network-overlay 加入到集群同一網段,這樣就可以實現跨主機的容器聯通