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.
- 在一个集群里面,你可以指定运行多少容器,在你向swarm发送请求时,基于资源可用情况, Docker决定哪些主机会实际运行这个容器。
- 你可以往一个运行的swam里面加入新容器,或者从中删除容器。
- Swarm支持Networking功能,这意味着里面的所有容器可以互相通讯。
- 如果一台主机挂掉,其上所有容器都也都会消失,为确保服务级别的正确性,这个时候Docker会在其他主机上启动新的实例。
- Docker swarm 遵从 manager-worker architecture ,manager 调度worker上的work。为提供高可靠性,你可以让多个节点都设计为managers节点,但是只有一个阶段处于active状态—the leader。为避免疲惫的选举,一般只部署奇数个主机作managers节点。
例1 Docker Machine and a local VM
说明:本例中,众多docker ps命令都应当更新为最新的docker container ps命令,虽然docker的新版本保留了docker ps命令
1.1 安装Docker-machine
见另外一个文档“七. Docker Machine的安装
”说明
1.2 使用Docker-machine+virtualbox(其上使用Boot2Docker)创建多个local machine(VM)
见另外一个文档“七. Docker Machine的安装
”说明
1.2.1 安装Virtualbox
见另外一个文档“七. Docker Machine的安装
”说明
1.2.2 安装Boot2Docker.iso
见另外一个文档“七. Docker Machine的安装
”说明
1.2.3 建立4个虚机(1个Master+3个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
然后查看虚拟机状态:
~$ sudo docker-machine ls
1.2.3' 如果已经创建虚拟机
现在只需要重启即可,使用
~$ sudo docker-machine start master
~$ sudo docker-machine start slave1
~$ sudo docker-machine start slave2
~$ sudo docker-machine start slave3
1.2.3 SSH登陆到虚拟机上
1.2.3.1 在master上初始化一个docker swarm集群
在登陆的master虚机里面执行:
注意,docker swarm init 命令有个监听ip,这是由于可能有多个地址(host或者vm上)
然后在3个slave虚机上执行:
到目前为止,集群已经建立完毕
提示:要退出集群使用下面的命令
docker@slave2:~$ docker swarm leave
docker@master:~$ docker swarm leave --force
1.3 在该docker集群上部署高可用的nginx容器任务
然后测试通过两个slave访问niginx(实际上都过这4个虚机的任何一个都是可以的):
登陆到两个slave上查看容器状态:
1.4 扩容service中的任务实验
查看集群节点
1.5 高可用性测试
接下来我们把master容器关闭,你会发现过了一会它又起来了(下面的docker ps可以用docker container ps代替,后者是最新的命令):
让slave2从集群中消失
上图注意:较新的docker中可以用docker container ps查看容器状态
你会看到宕机后在slave1上重启了
如果我们把slave1-3全部弄宕机:
较新的docker中可以用docker container ps查看容器状态
遗留两个实验:
- 再次启动slave1,会不会容器再次在它环境里面自动启动
- master挂掉后是否slave变成master
例2 多个master多个slave的单集群
2.1 创建多个主机实例
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
部分结果展示如下:2.2 查看虚机
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ls
2.3 登陆虚机
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
2.4 Docker Swarm 配置集群节点
2.4.1 创建第一个管理节点
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.100
2.4.2 加入第二个管理节点
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1 "docker swarm join-token manager"
依据执行结果里面的提示,登陆到manager2节点执行找到的命令,这里是:
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 加入工作节点
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查看节点信息
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker node ls
2.5 部署集群服务
2.5.1 部署4个容器
docker@manager1:~$ docker service create --replicas 4 -d -p 8080:80 --name nginx nginx:alpine
2.5.2 集群服务信息查看
docker@manager1:~$ docker service ls
docker@manager1:~$ docker service ps nginx
说明:上图结果是因为我重启了4个虚机
例3 使用Docker stack部署多集群
Docker service只能组建单个集群
注意:例2创建的4个虚机我们仍然需要
3.1 创建docker-compose.yml文件并部署
我这里创建的配置文件名为docker-compose-stack.yml文件内容如下(可以使用touch或者vi创建)
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主机上,可以用下面的命令:
$ 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
总结:
创建虚拟主机节点
docker-machine create 虚拟主机名
查看虚拟机节点信息
docker-machine ls
停止虚拟主机节点
docker-machine stop 虚拟主机名
删除虚拟主机节点
docker-machine rm 虚拟主机名
初始化docker swarm集群
docker swarm init --advertise-addr master的IP地址
slave节点加入集群docker swarm join --token [token] [master的IP]:[master的端口]
slave节点主动离开集群
docker swarm leave
在master上获取加入集群的token
docker@master:~$ docker swarm join-token worker
docker@master:~$ docker swarm join-token manager
**master上创建service举例:**
docker service create --replicas 2 -d -p 8080:80 --name 服务名 镜像名
master上查看service信息
docker service ls
docker service ps 你所创建的服务的ID
在master上删除service
docker service rm 服务名
在master上进行服务扩容
docker service scale 你的service name=你要的副本数目
查看swarm 的token
docker@master:~$ docker swarm join-token manager