Docker使用Swarm組建集群的方法
Swarm 在 Docker 1.12 版本之前屬于一個(gè)獨(dú)立的項(xiàng)目,在 Docker 1.12 版本發(fā)布之后,該項(xiàng)目合并到了 Docker 中,成為 Docker 的一個(gè)子命令。目前,Swarm 是 Docker 社區(qū)提供的唯一一個(gè)原生支持 Docker 集群管理的工具。它可以把多個(gè) Docker 主機(jī)組成的系統(tǒng)轉(zhuǎn)換為單一的虛擬 Docker 主機(jī),使得容器可以組成跨主機(jī)的子網(wǎng)網(wǎng)絡(luò)。
Docker 使用 Swarm 可以很方便的在多個(gè)主機(jī)上創(chuàng)建容器集群,并且容器之間可以跨主機(jī)網(wǎng)絡(luò)通信。
Swarm 的集群分為 Manager 節(jié)點(diǎn)和 Worker 節(jié)點(diǎn)。
Swarm 中使用 Service 來創(chuàng)建/管理使用相同鏡像的多個(gè)容器,多個(gè)容器同時(shí)對(duì)外提供服務(wù),多個(gè)容器之間負(fù)載均衡。每個(gè) Service 有一個(gè)浮動(dòng)IP(VIP),各個(gè)容器還有自己的物理IP。創(chuàng)建基于 Swarm 的 Overlay 網(wǎng)絡(luò),將 Service 掛載到此網(wǎng)絡(luò)上。然后 Service 中的各個(gè)容器便可以通過 Service 名稱和 IP 地址實(shí)現(xiàn)網(wǎng)絡(luò)互通。
下面使用了三個(gè)機(jī)器來組建一個(gè)Swarm集群
bd0 192.168.0.109
bd1 192.168.0.192
bd2 192.168.0.193
Docker 開啟遠(yuǎn)程管理
默認(rèn)情況下,Docker守護(hù)進(jìn)程會(huì)生成一個(gè) /var/run/docker.sock 文件來進(jìn)行本地進(jìn)程通信,而不會(huì)監(jiān)聽任何端口,所以默認(rèn)情況下 Docker 只能在本地使用命令行操作。 如果要在其它機(jī)器上遠(yuǎn)程操作 Docker 主機(jī),就需要讓 Docker 監(jiān)聽一個(gè)端口,這樣才能實(shí)現(xiàn)遠(yuǎn)程通信。
在我的 CentOS 7X 上,首先修改 Docker 配置文件 /etc/sysconfig/docker 中的 OPTIONS 參數(shù),添加
-H unix:///var/run/docker.sock -H 0.0.0.0:5555
修改后參數(shù)類似
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false -H unix:///var/run/docker.sock -H 0.0.0.0:5555'
然后重新啟動(dòng) Docker 服務(wù)
$ sudo systemctl restart docker.service
測(cè)試一下
sudo docker -H <HOST>:5555 images
創(chuàng)建 Swarm 集群
獲取 Swarm 鏡像
分別在三個(gè)節(jié)點(diǎn)上下載swarm鏡像
$ sudo docker pull swarm
初始化Swarm集群
首先在 bd0 節(jié)點(diǎn)上初始化 Swarm 集群
$ sudo docker swarm init Error response from daemon: could not choose an IP address to advertise since this system has multiple addresses on different interfaces (192.168.0.109 on eth0 and 192.168.122.1 on virbr0) - specify one with --advertise-addr
第一次創(chuàng)建失敗了,原因是我的機(jī)器有兩塊網(wǎng)卡,Swarm不知道要用那塊網(wǎng)卡組建集群,所以需要使用 --advertise-addr 來指定使用那塊網(wǎng)卡。
$ sudo docker swarm init --advertise-addr 192.168.0.109 Swarm initialized: current node (1egy2ark49q6xokudps5wykhn) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl \ 192.168.0.109:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
然后分別在 bd1 和 bd2 節(jié)點(diǎn)上運(yùn)行下面命令將機(jī)器加入集群
$ sudo docker swarm join \ --token SWMTKN-1-0x11m2uk7ps9bh7nflkxwirgv0syvacl18rut3hilz4i9lgis3-d9m22hixt0b57hjj81im8bqdl \ 192.168.0.109:2377
This node joined a swarm as a worker.
下面查看一下集群節(jié)點(diǎn)信息
$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 11ochjq4o1s2m6w4u8jxb37w6 bd1 Ready Active 1egy2ark49q6xokudps5wykhn * bd0 Ready Active Leader b4e2ywnhhd6fhgfxtr1qh4gew bd2 Ready Active
創(chuàng)建集群跨主機(jī)網(wǎng)絡(luò)
首先查看一下集群網(wǎng)絡(luò)
$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE 36679de6466b bridge bridge local 72e853673d8b docker_gwbridge bridge local b45cef05e017 host host local 1zzlk9hpwyqy ingress overlay swarm
添加一個(gè)Swarm網(wǎng)絡(luò)
$ sudo docker network create --driver overlay myswarm a04evrfrr4cvnbvrummzvg0mn
創(chuàng)建后,查看一下集群網(wǎng)絡(luò)
$ sudo docker network ls NETWORK ID NAME DRIVER SCOPE 36679de6466b bridge bridge local 72e853673d8b docker_gwbridge bridge local b45cef05e017 host host local 1zzlk9hpwyqy ingress overlay swarm a04evrfrr4cv myswarm overlay swarm
部署服務(wù)
這里使用 nginx 服務(wù)來演示一下怎樣創(chuàng)建一個(gè)服務(wù)集群。
下載nginx鏡像
$ sudo docker pull nginx
創(chuàng)建服務(wù)
$ sudo docker service create --replicas 2 --name mynginx -p 8000:80 --network=myswarm nginx 5xrm96xveqw5gq63srts1rbhw
這里創(chuàng)建了需要兩個(gè) nginx 實(shí)例的 nginx 服務(wù)。同時(shí),為了能被外網(wǎng)地址訪問,我們做了一下端口映射,映射到物理主機(jī)的8000端口。
查看服務(wù)
$ sudo docker service ls
ID NAME REPLICAS IMAGE COMMAND
5xrm96xveqw5 mynginx 2/2 nginx
$ sudo docker service ps mynginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 23 seconds ago
divhrq89xhxka8bvb8r9zqqhz mynginx.2 nginx bd2 Running Running 20 seconds ago
$ sudo docker service inspect mynginx
...
"VirtualIPs": [
{
"NetworkID": "1zzlk9hpwyqyocloxy9j9vct7",
"Addr": "10.255.0.6/16"
},
{
"NetworkID": "a04evrfrr4cvnbvrummzvg0mn",
"Addr": "10.0.0.2/24"
}
]
...
在bd0上查看
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e480d427fd51 nginx:latest "nginx -g 'daemon off" 41 seconds ago Up 40 seconds 80/tcp mynginx.1.1crmc5ecsjoci8xavxzbnbks3
在bd2上查看
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c12d4f9eb457 nginx:latest "nginx -g 'daemon off" 56 seconds ago Up 52 seconds 80/tcp mynginx.2.divhrq89xhxka8bvb8r9zqqhz
服務(wù)已經(jīng)創(chuàng)建并啟動(dòng)了,下面我們?cè)跒g覽器訪問 http://bd0:8000 來驗(yàn)證一下 nginx 服務(wù)的狀態(tài)。
服務(wù)的Failover
首先我們查看一下當(dāng)前服務(wù)的狀態(tài)
$ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 23 seconds ago divhrq89xhxka8bvb8r9zqqhz mynginx.2 nginx bd2 Running Running 20 seconds ago
然后在 bd2 上將其上的服務(wù)停止
$ sudo docker kill mynginx.2.divhrq89xhxka8bvb8r9zqqhz mynginx.2.divhrq89xhxka8bvb8r9zqqhz
再次觀察服務(wù)狀態(tài),如下:
$ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 6 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Running Running 4 seconds ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed 5 seconds ago "task: non-zero exit (137)"
可以看到在 bd1 上又起了一個(gè)實(shí)例用來接替原來在 bd2 上的實(shí)例。
服務(wù)的擴(kuò)容/縮容
增加服務(wù)實(shí)例
$ sudo docker service scale mynginx=3 mynginx scaled to 3 $ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 7 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Running Running about a minute ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed about a minute ago "task: non-zero exit (137)" 985tln0aprsvjthjpve0n6qmz mynginx.3 nginx bd2 Running Preparing 3 seconds ago
減少服務(wù)實(shí)例
$ sudo docker service scale mynginx=2 mynginx scaled to 2 $ sudo docker service ps mynginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR 1crmc5ecsjoci8xavxzbnbks3 mynginx.1 nginx bd0 Running Running 7 minutes ago br5iyie0dr945ixnq7s77kunr mynginx.2 nginx bd1 Shutdown Shutdown less than a second ago divhrq89xhxka8bvb8r9zqqhz \_ mynginx.2 nginx bd2 Shutdown Failed about a minute ago "task: non-zero exit (137)" 985tln0aprsvjthjpve0n6qmz mynginx.3 nginx bd2 Running Running 5 seconds ago
刪除服務(wù)
$ sudo docker service rm mynginx
總結(jié)
以上所述是小編給大家介紹的Docker使用Swarm組建集群的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
使用非root用戶安裝及啟動(dòng)docker的問題(rootless模式運(yùn)行)
docker是使用--userns-remap容器用戶映射宿主機(jī)用戶的方式來解決問題,用戶和組的映射由兩個(gè)配置文件來控制,分別是/etc/subuid和/etc/subgid,本文給大家介紹非root用戶啟動(dòng)docker的問題,感興趣的朋友一起看看吧2022-05-05
基于Docker的PHP調(diào)用基于Docker的Mysql數(shù)據(jù)庫
Docker 是一個(gè)開源的應(yīng)用容器引擎,自從接觸docker以來,一直想建立基于Docker的PHP調(diào)用基于Docker的Mysql數(shù)據(jù)庫,下面通過本文給大家介紹下,感興趣的朋友參考下2016-11-11
如何解決Docker啟動(dòng)問題docker?is?starting…
這篇文章主要給大家介紹了關(guān)于如何解決Docker啟動(dòng)問題docker?is?starting…的相關(guān)資料,文中通過圖文將解決的過程介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Docker中Nginx反向代理的實(shí)現(xiàn)步驟
為了安全考慮,我們一般會(huì)設(shè)置反向代理,用來屏蔽應(yīng)用程序真實(shí)的IP和端口號(hào),本文主要介紹了Docker中Nginx反向代理的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
詳解Docker Compose 中可用的環(huán)境變量問題
Compose 的多個(gè)部分在某種情況下處理環(huán)境變量。這篇文章主要介紹了Docker Compose 中可用的環(huán)境變量問題,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

