In most cases, you’ll want redundancy for your app so that if the server hosting it goes down, another server can take over; and you’ll want the ability to scale so that multiple servers can all run the app and share the workload between them. Docker has native support for that with Docker swarm mode, which lets you join multiple machines running Docker into a cluster that provides scale and redundancy.
- 在一個(gè)集群里面,你可以指定運(yùn)行多少容器烹看,在你向swarm發(fā)送請(qǐng)求時(shí),基于資源可用情況国拇, Docker決定哪些主機(jī)會(huì)實(shí)際運(yùn)行這個(gè)容器。
- 你可以往一個(gè)運(yùn)行的swam里面加入新容器惯殊,或者從中刪除容器酱吝。
- Swarm支持Networking功能,這意味著里面的所有容器可以互相通訊土思。
- 如果一臺(tái)主機(jī)掛掉务热,其上所有容器都也都會(huì)消失,為確保服務(wù)級(jí)別的正確性己儒,這個(gè)時(shí)候Docker會(huì)在其他主機(jī)上啟動(dòng)新的實(shí)例崎岂。
- Docker swarm 遵從 manager-worker architecture ,manager 調(diào)度worker上的work闪湾。為提供高可靠性冲甘,你可以讓多個(gè)節(jié)點(diǎn)都設(shè)計(jì)為managers節(jié)點(diǎn),但是只有一個(gè)階段處于active狀態(tài)—the leader途样。為避免疲憊的選舉江醇,一般只部署奇數(shù)個(gè)主機(jī)作managers節(jié)點(diǎn)。
例1 Docker Machine and a local VM
說明:本例中捂贿,眾多docker ps命令都應(yīng)當(dāng)更新為最新的docker container ps命令纠修,雖然docker的新版本保留了docker ps命令
1.1 安裝Docker-machine
見另外一個(gè)文檔“七. Docker Machine的安裝
”說明
1.2 使用Docker-machine+virtualbox(其上使用Boot2Docker)創(chuàng)建多個(gè)local machine(VM)
見另外一個(gè)文檔“七. Docker Machine的安裝
”說明
1.2.1 安裝Virtualbox
見另外一個(gè)文檔“七. Docker Machine的安裝
”說明
1.2.2 安裝Boot2Docker.iso
見另外一個(gè)文檔“七. Docker Machine的安裝
”說明
1.2.3 建立4個(gè)虛機(jī)(1個(gè)Master+3個(gè)Slave)
:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso master
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave1
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave2
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso slave3
然后查看虛擬機(jī)狀態(tài):
~$ sudo docker-machine ls
1.2.3' 如果已經(jīng)創(chuàng)建虛擬機(jī)
現(xiàn)在只需要重啟即可,使用
~$ sudo docker-machine start master
~$ sudo docker-machine start slave1
~$ sudo docker-machine start slave2
~$ sudo docker-machine start slave3
1.2.3 SSH登陸到虛擬機(jī)上
1.2.3.1 在master上初始化一個(gè)docker swarm集群
在登陸的master虛機(jī)里面執(zhí)行:
注意厂僧,docker swarm init 命令有個(gè)監(jiān)聽ip,這是由于可能有多個(gè)地址(host或者vm上)
然后在3個(gè)slave虛機(jī)上執(zhí)行:
到目前為止了牛,集群已經(jīng)建立完畢
提示:要退出集群使用下面的命令
docker@slave2:~$ docker swarm leave
docker@master:~$ docker swarm leave --force
1.3 在該docker集群上部署高可用的nginx容器任務(wù)
然后測(cè)試通過兩個(gè)slave訪問niginx(實(shí)際上都過這4個(gè)虛機(jī)的任何一個(gè)都是可以的):
登陸到兩個(gè)slave上查看容器狀態(tài):
1.4 擴(kuò)容service中的任務(wù)實(shí)驗(yàn)
查看集群節(jié)點(diǎn)
1.5 高可用性測(cè)試
接下來我們把master容器關(guān)閉,你會(huì)發(fā)現(xiàn)過了一會(huì)它又起來了(下面的docker ps可以用docker container ps代替鹰祸,后者是最新的命令):
讓slave2從集群中消失
上圖注意:較新的docker中可以用docker container ps查看容器狀態(tài)
你會(huì)看到宕機(jī)后在slave1上重啟了
如果我們把slave1-3全部弄宕機(jī):
較新的docker中可以用docker container ps查看容器狀態(tài)
遺留兩個(gè)實(shí)驗(yàn):
- 再次啟動(dòng)slave1甫窟,會(huì)不會(huì)容器再次在它環(huán)境里面自動(dòng)啟動(dòng)
- master掛掉后是否slave變成master
例2 多個(gè)master多個(gè)slave的單集群
2.1 創(chuàng)建多個(gè)主機(jī)實(shí)例
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso manager1
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso manager2
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso worker1
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下載/boot2docker.iso worker2
部分結(jié)果展示如下:2.2 查看虛機(jī)
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ls
2.3 登陸虛機(jī)
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
2.4 Docker Swarm 配置集群節(jié)點(diǎn)
2.4.1 創(chuàng)建第一個(gè)管理節(jié)點(diǎn)
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.100
2.4.2 加入第二個(gè)管理節(jié)點(diǎn)
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1 "docker swarm join-token manager"
依據(jù)執(zhí)行結(jié)果里面的提示,登陸到manager2節(jié)點(diǎn)執(zhí)行找到的命令蛙婴,這里是:
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager2 "docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7pp6lsq1rrw72sp6t1ggsj2f-06v7c9nv8pr2fuzgshc9korsa 192.168.99.100:2377"
2.4.3 加入工作節(jié)點(diǎn)
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh worker1
docker@worker1:~$ docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7
pp6lsq1rrw72sp6t1ggsj2f-d5dqsszj6micdr8t2de3xpww7 192.168.99.100:2377
2.4.4 登陸到manager1查看節(jié)點(diǎn)信息
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker node ls
2.5 部署集群服務(wù)
2.5.1 部署4個(gè)容器
docker@manager1:~$ docker service create --replicas 4 -d -p 8080:80 --name nginx nginx:alpine
2.5.2 集群服務(wù)信息查看
docker@manager1:~$ docker service ls
docker@manager1:~$ docker service ps nginx
說明:上圖結(jié)果是因?yàn)槲抑貑⒘?個(gè)虛機(jī)
例3 使用Docker stack部署多集群
Docker service只能組建單個(gè)集群
注意:例2創(chuàng)建的4個(gè)虛機(jī)我們?nèi)匀恍枰?/p>
3.1 創(chuàng)建docker-compose.yml文件并部署
我這里創(chuàng)建的配置文件名為docker-compose-stack.yml文件內(nèi)容如下(可以使用touch或者vi創(chuàng)建)
version: "3"
services:
nginx:
image: 192.168.99.1:5000/nginx:latest
ports:
- 8088:80
deploy:
mode: replicated
replicas: 4
visualizer:
image: 192.168.99.1:5000/dockersamples/visualizer:latest
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: 192.168.99.1:5000/portainer/portainer:latest
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
下面命令中-c表示--compose-file, 這里用到的docker-compose-stack.yml必須先copy到manager1主機(jī)上粗井,可以用下面的命令:
$ sudo docker-machine scp docker-compose-stack.yml manager1:~
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ vi docker-compose.yml
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-demo
總結(jié):
創(chuàng)建虛擬主機(jī)節(jié)點(diǎn)
docker-machine create 虛擬主機(jī)名
查看虛擬機(jī)節(jié)點(diǎn)信息
docker-machine ls
停止虛擬主機(jī)節(jié)點(diǎn)
docker-machine stop 虛擬主機(jī)名
刪除虛擬主機(jī)節(jié)點(diǎn)
docker-machine rm 虛擬主機(jī)名
初始化docker swarm集群
docker swarm init --advertise-addr master的IP地址
slave節(jié)點(diǎn)加入集群docker swarm join --token [token] [master的IP]:[master的端口]
slave節(jié)點(diǎn)主動(dòng)離開集群
docker swarm leave
在master上獲取加入集群的token
docker@master:~$ docker swarm join-token worker
docker@master:~$ docker swarm join-token manager
**master上創(chuàng)建service舉例:**
docker service create --replicas 2 -d -p 8080:80 --name 服務(wù)名 鏡像名
master上查看service信息
docker service ls
docker service ps 你所創(chuàng)建的服務(wù)的ID
在master上刪除service
docker service rm 服務(wù)名
在master上進(jìn)行服務(wù)擴(kuò)容
docker service scale 你的service name=你要的副本數(shù)目
查看swarm 的token
docker@master:~$ docker swarm join-token manager