一、简介
Docker Swarm
是 Docker
官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker
官方对容器云生态进行支持的核心方案。
Swarm
是使用 SwarmKit
构建的 Docker
引擎内置(原生)的集群管理和编排工具。
使用 Swarm
集群之前需要了解以下几个概念。
节点
节点分为管理 (manager
) 节点和工作 (worker
) 节点。
管理节点用于 Swarm
集群的管理,docker swarm
命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave
可以在工作节点执行)。一个 Swarm
集群可以有多个管理节点,但只有一个管理节点可以成为 leader
,leader
通过 raft
协议实现。
服务和任务
任务 (Task
)是 Swarm
中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services
) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services
按照一定规则在各个工作节点上运行指定个数的任务。global services
每个工作节点上运行一个任务
两种模式通过 docker service create
的 --mode
参数指定。
二、创建 Swarm 集群
创建节点
首先创建3个或者更多docker-machine
。分别命名为:
- manager
- vm2
- vm3
1 2 3 4 |
$ docker-machine create --driver hyperv --hyperv-virtual-switch=DockerNAT manager $ docker-machine create --driver hyperv --hyperv-virtual-switch=DockerNAT vm2 $ docker-machine create --driver hyperv --hyperv-virtual-switch=DockerNAT vm3 |
我们进入manager主机,使用 docker swarm init
在管理节点初始化一个 Swarm 集群。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ docker-machine ssh manager $ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:D8:74:28:E2 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 ... eth0 Link encap:Ethernet HWaddr 00:15:5D:5E:31:3F inet addr:192.168.31.147 Bcast:192.168.31.255 Mask:255.255.255.0 ... lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 ... $ docker swarm init --advertise-addr 192.168.31.147 Swarm initialized: current node (14ui5c2e2kd9z2bouj6if62fk) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-1vy7232y4dbzumqbqohhtzu8ae7h9blfuiex6dgb62u8uywuex-7gdi98kpa2teq3pow94rwpsoy 192.168.31.147:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. |
加入节点
初始化完成后,将vm2
、vm3
节点假如管理节点。
在vm2
、vm3
节中分别执行命令
1 2 3 |
$ docker swarm join --token SWMTKN-1-1vy7232y4dbzumqbqohhtzu8ae7h9blfuiex6dgb62u8uywuex-7gdi98kpa2teq3pow94rwpsoy 192.168.31.147:2377 This node joined a swarm as a worker. |
管理节点
在manager
主机
1 2 3 4 5 6 |
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 14ui5c2e2kd9z2bouj6if62fk * manager Ready Active Leader 18.09.9 28pzxdp7xd1h5e87668yd0qun vm2 Ready Active 18.09.9 4j31uznmbtgfcmjp5on11p65e vm3 Ready Active 18.09.9 |
三、服务管理
创建服务
在manager
主机中创建3个nginx副本的集群
1 2 3 4 5 6 7 |
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine 6ka5qr4o0tgffdtdh2q4u4ghi overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] |
创建成功后,访问任意节点ip
即可。
查看服务
使用 docker service ls
来查看当前 Swarm 集群运行的服务。
1 2 3 4 |
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 6ka5qr4o0tgf nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp |
使用 docker service ps
来查看某个服务的详情。
1 2 3 4 5 6 |
$ docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS egb5yz60yyf0 nginx.1 nginx:1.13.7-alpine manager Running Running 3 minutes ago 4vj7vmmgnp0l nginx.2 nginx:1.13.7-alpine vm2 Running Running 3 minutes ago 0irw2uln3uv9 nginx.3 nginx:1.13.7-alpine vm3 Running Running 3 minutes ago |
使用 docker service logs
来查看某个服务的日志。
1 2 3 4 5 6 |
$ docker service logs nginx nginx.2.4vj7vmmgnp0l@vm2 | 10.255.0.2 - - [23/Sep/2019:10:48:29 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-" nginx.2.4vj7vmmgnp0l@vm2 | 2019/09/23 10:48:29 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.2, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.31.147", referrer: "http://192.168.31.147/" nginx.2.4vj7vmmgnp0l@vm2 | 10.255.0.2 - - [23/Sep/2019:10:48:29 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://192.168.31.147/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" "-" |
服务伸缩
我们可以使用 docker service scale
对一个服务运行的容器数量进行伸缩。
当业务处于高峰期时,我们需要扩展服务运行的容器数量。
1 2 3 4 5 6 7 8 9 10 |
$ docker service scale nginx=5 nginx scaled to 5 overall progress: 5 out of 5 tasks 1/5: running [==================================================>] 2/5: running [==================================================>] 3/5: running [==================================================>] 4/5: running [==================================================>] 5/5: running [==================================================>] verify: Service converged |
当业务平稳时,我们需要减少服务运行的容器数量。
1 2 3 |
$ docker service scale nginx=2 ... |
删除服务
使用 docker service rm
来从 Swarm
集群移除某个服务。
1 2 |
$ docker service rm nginx |
四、composer 文件部署服务
部署服务使用 docker stack deploy
,其中 -c 参数指定 compose
文件名。
1 2 3 4 5 6 7 |
$ docker stack deploy -c docker-compose.yml wordpress Creating network wordpress_overlay Creating network wordpress_default Creating service wordpress_wordpress Creating service wordpress_db Creating service wordpress_visualizer |
docker-compose.yml
参考如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
version: "3" services: wordpress: image: wordpress ports: - 80:80 networks: - overlay environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress deploy: mode: replicated replicas: 3 db: image: mysql networks: - overlay volumes: - db-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress deploy: 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] volumes: db-data: networks: overlay: |
查看服务
1 2 3 4 |
$ docker stack ls NAME SERVICES ORCHESTRATOR wordpress 3 Swarm |
移除服务
要移除服务,使用 docker stack down
1 2 3 4 5 6 7 |
$ docker stack down wordpress Removing service wordpress_db Removing service wordpress_visualizer Removing service wordpress_wordpress Removing network wordpress_overlay Removing network wordpress_default |
本文参考:
- https://yeasy.gitbooks.io/docker_practice/swarm/