上次说了docker machine和常用的命令。docker machine就是在远程机器上安装docker的,虽然实际线上环境很少使用,在实验环境中docker machine还是非常重要的。本次开始说三剑客中的最后一个docker warm。

(一)Docker Swarm介绍
使用SwarmKit构建的 Docker 引擎内置(原生)的集群管理和编排工具。内置在docker之中的,原生的docker集群编排工具,docker swarm非常的重要本身也是编排工具和后面要提到的Mesos,k8s,跟k8s是竞争的关系,但是k8s发展到现在已经完完全全给其他竞争对手完全的甩开了。这个系列主要说的k8s,但是docker swarm的使用方法也是一定要提的。
- ①Swarm的架构
1.节点下面有角色:Worker,Manager
2.Manager 是整个warm集群的大脑,为了避免单点的故障,我们的大脑至少有2个,状态的同步通过raft协议进行同步。raft协议可以确保多个Manager之前是同步的。
3.管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行(节点退出集群命令docker swarm leave可以在工作节点执行)。
4.Manager节点的也可以是worker节点。一个主机可以既是Manager也是worker节点。在实际的生产中,为了凸显manager的调度性能,manager上不跑worker节点。

- ②Swarm的服务和任务
1.任务是最小的单元,就是一个节点运行的容器。下图的node。
2.服务是指一组任务,整个生成的3个nginx被称为服务。

- ③如何部署
客户端的发起docker命令,两种方式
- 直接ssh到manager节点,执行docker命令。
- 通过远程访问的方式,通过Remote API调用manager上的docker命令,我们这张图画的就是第二种方式。

docker Client 在manager节点的外边,假如执行了docker service create,先会经过docker Deamon接受这条命令,传给Scheduler模块,Scheduler模块主要实现调度的功能,负责选择出来最优的节点,里面包含了2个子模块,Fiter 和Strategy,Fiter很明显是过滤节点,用来找出满足条件的节点(资源足够多,节点正常的),Strategy是过滤出来后选择出最优的节点(对比选择资源剩余最多的节点,或者找到资源剩余最少的节点),当然Fiter 和Strategy都是用户可以单独定制的,中间的Cluster是抽象的worker节点集群,包含了Swarm节点里面每个节点的信息,右边的Discovery是信息维护的模块,比如Label Health。Cluster最终调用容器的api,完成容器启动的流程。
(二)集群演示
- ①主机信息
系统类型 | IP地址 | 节点角色 | CPU | Memory | Hostname |
---|---|---|---|---|---|
Centos7 | 192.168.66.100 | Manager | 2 | 2G | Nexus |
Centos7 | 192.168.66.101 | Nexus | 2 | 2G | Nexus |
Centos7 | 192.168.66.102 | Nexus | 2 | 2G | Nexus |

- ② manager节点初始化操作(192.168.66.100)
添加初始化init服务,默认是manager节点
docker swarm init --advertise-addr 192.168.66.100

- ③ 添加worker节点(192.168.66.101)
上边manager初始化的时候,有对应的worker命令。
docker swarm join --token SWMTKN-1-3gfv7tpeznhwsl7v3y0n9f5g7547lgzo7fjpv0pm5s6uzvdlgg-b0mlie5vhp2ms1xg1tyd7zwc2 192.168.66.100:2377

- ④ 添加worker节点(192.168.66.102)
上边manager初始化的时候,有对应的worker命令。
docker swarm join --token SWMTKN-1-3gfv7tpeznhwsl7v3y0n9f5g7547lgzo7fjpv0pm5s6uzvdlgg-b0mlie5vhp2ms1xg1tyd7zwc2 192.168.66.100:2377

- ⑤ manager查看节点
docker node ls

- ⑥ 创建service服务
replicas 3个节点
docker service create --replicas 3 -p 80:80 --name nginx nginx
docker service ls
docker service ps





- ⑥ 删除service服务
docker service rm nginx

(二)docker swarm 运行docker-compose文件
- ①stack
Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。它支持相同类型的compose文件,但实际的处理是发生在Docker Engine(docker引擎)内部的Go代码中。 在使用堆栈命令之前,还必须创建一个单机版的“swarm”,但这并不是什么大问题。
- ②测试docker-compose文件
mkdir labs
cd labs
vi 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:

- ③运行 docker-compose.yml
docker stack deploy example --compose-file=docker-compose.yml
docker stack ls
docker stack services example


- 打开网页
http:/192.168.66.100:5000/
http://192.168.66.100:5001/
http://192.168.66.100:8080/


- 扩展vote
docker service scale example_vote=4


- 删除stack
docker stack rm example

PS:这就是我们的服务编排,都是在三个节点,所谓的编排就是将多个节点变成一个节点来使用,接下来讲的k8s要把docker swarm功能要强大很多,当然也要复杂很多。docker的基本命令一样掌握好!后面说k8s才不会那么吃力,遇到问题了才知道如何解决。
网友评论