swarm是一个集群架构
Swarm有两种节点,一种叫Manager,一种叫Worker。Manager是指挥官,多个Manager之间会做同步,Worker是真正干活的,Worker之间也要数据同步。
replicas可以理解为容器。
1.创建一个三节点的swarm集群
进入https://labs.play-with-docker.com/p/bngt93vad2eg009qp6h0#bngt93va_bngt9kfad2eg009qp6l0
这个网站去搭建
执行以下命令:
$ docker swarm init --advertise-addr 192.168.0.16
Swarm initialized: current node (hwip18th1x341ya0mgfhy0odn) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-47yjbgi9agonlqcx561xj83m0yghgtsfvrrqutzpdnfv4cc0c4-5yzowa1j2s2hwubzl8amgsvcq 192.168.0.16:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
我们可以从结果中看到启动的是一个manager。
[root@master ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
rvr00w2iu56y94ru5l1gmcg03 * master Ready Active Leader 19.03.5
在第二台机器上执行命令,加入到manager集群中
回到第一台机器,我么可以看到节点加入进来了
加入第三台机器
2.service的创建维护和水平扩展
service就是一个容器,swarm可以使用docker service创建一个容器。类似于docker run,但是docker是在本地创建一个容器。docker service就不仅仅是在本地创建容器了。
创建一个busybox:
我们通过下面的截图可以看到这个service运行在node2节点上:
通过docker ps可以发现node3上根本没有busybox,只有我自己启动的一个nginx。证明了service启动的时候是随机选择了集群中的一个节点进行启动。
接下来我们对我们的demo3进行水平扩展
重点关注下REPLICAS从1/1变成了5/5,说明我们扩展成功了,分母上的5表示设置的scale的数量,分子上表示运行中的。在通过docker service ps demo3看看有多少个运行的,且分别运行在什么机器上:
如果说我们在node2上去docker rm -f一个container会发生什么事情呢?
我们发现RELICAS从4/5变成了5/5,为什么会这样?
执行docker service ps demo3可以发现,挂掉了一个之后,又重新启动了一个起来。
那如果我们真正的要做删除操作呢?docker service rm service名称即可
在swarm中Container和Container之间的访问通过overlay网络。我们启动多个service,如果service有绑定端口,则此服务可以通过任意swarm节点的相应端口访问。当一个container去访问swarm中的另外一个container的时候,首先通过DNS把服务名解析成一个VIP,然后这个VIP在映射到具体的Service中。如下图所示:
docker容器之间的通信是通过overlay来进行的:
2.用Docker swarm部署一个复杂的应用
2.1编辑一个docker-compose.yml
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
这个compose文件中有多个应用,我们对这个文件中所有的应用进行部署:
$ docker stack deploy zzm --compose-file=docker-compose.yml
Creating network zzm_frontend
Creating network zzm_default
Creating network zzm_backend
Creating service zzm_worker
Creating service zzm_visualizer
Creating service zzm_redis
Creating service zzm_db
Creating service zzm_vote
Creating service zzm_result
查看这里面有多少services
查看一下swarm集群中的service情况分布
现在我们打算把zzm_vote这个service从2个扩展到3个:
网友评论