Docker Swarm集群管理
1. 创建Swarm集群
在已经安装好 Docker 的主机上执行如下命令:
$ docker swarm init --advertise-addr 172.25.114.4
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
172.25.114.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr
指定 IP。
执行 docker swarm init
命令的节点自动成为管理节点。
- 如果需要生成增加管理(manager)节点的token,执行
docker swarm join-token manager
生成token;- 如果需要生成增加工作(worker)节点的token,执行
docker swarm join-token worker
生成token.
2. 增加管理节点
本次集群部署因为只有三台主机,所以采用三个管理节点的模式。
在其他的Docker主机中分别执行如下命令增加管理节点:
$ docker swarm join --token SWMTKN-1-346v4942pvegrl7ysrxxe61xfzptqlllgaun7y24443iucm5ea-1g5pd608q1gycsaidgsoppmcm 172.25.114.4:2377
3. 查看集群
管理节点成功添加之后执行docker node ls
,展示如下结果则表示swarm集群创建成功:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
t2wdg7dus5gis7w34xhc7mydm * iZbp1ekc2hkqmgls01avd3Z Ready Active Leader 20.10.18
918yfolt8fzxzdugpemj94jha iZbp10aux1l2hkppunuyqrZ Ready Active Reachable 20.10.21
obrpjd7frbthok0fl5b9edj9z iZbp14elaus2o5tcs2a1qgZ Ready Active Reachable 20.10.17
4. 部署服务
但应用部署可以使用如下命令(以nginx为例):
$ docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
5. 查看服务
使用 docker service ls
来查看当前 Swarm
集群运行的服务。
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kc57xffvhul5 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
使用 docker service ps
来查看某个服务的详情。
$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
pjfzd39buzlt nginx.1 nginx:1.13.7-alpine swarm2 Running Running about a minute ago
hy9eeivdxlaa nginx.2 nginx:1.13.7-alpine swarm1 Running Running about a minute ago
36wmpiv7gmfo nginx.3 nginx:1.13.7-alpine swarm3 Running Running about a minute ago
使用 docker service logs
来查看某个服务的日志。
$ docker service logs nginx
nginx.3.36wmpiv7gmfo@swarm3 | 10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.3.36wmpiv7gmfo@swarm3 | 10.255.0.4 - - [25/Nov/2017:02:10:30 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.3.36wmpiv7gmfo@swarm3 | 2017/11/25 02:10:30 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.255.0.4, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "192.168.99.102"
nginx.1.pjfzd39buzlt@swarm2 | 10.255.0.2 - - [25/Nov/2017:02:10:26 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.1.pjfzd39buzlt@swarm2 | 10.255.0.2 - - [25/Nov/2017:02:10:27 +0000] "GET /favicon.ico HTTP/1.1" 404 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0" "-"
nginx.1.pjfzd39buzlt@swarm2 | 2017/11/25 02:10:27 [error] 5#5: *1 open() "/usr/share/nginx/html/favicon.ic
6. 服务伸缩
我们可以使用 docker service scale
对一个服务运行的容器数量进行伸缩。
当业务处于高峰期时,我们需要扩展服务运行的容器数量。
$ docker service scale nginx=5
当业务平稳时,我们需要减少服务运行的容器数量。
$ docker service scale nginx=2
7. 删除服务
使用 docker service rm
来从 Swarm
集群移除某个服务。
$ docker service rm nginx
8. 在 Swarm 集群中使用 compose 文件
正如之前使用 docker-compose.yml
来一次配置、启动多个容器,在 Swarm
集群中也可以使用 compose
文件 (docker-compose.yml
) 来配置、启动多个服务。
使用 docker service create
一次只能部署一个服务,使用 docker-compose.yml
我们可以一次启动多个关联的服务。
我们以在 Swarm
集群中部署 WordPress
为例进行说明。
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:
9. 部署服务
部署服务使用 docker stack deploy
,其中 -c
参数指定 compose 文件名。
$ docker stack deploy -c docker-compose.yml wordpress
10. 查看服务
$ docker stack ls
NAME SERVICES
wordpress 3
11. 更新服务
如果部署完成之后有配置文件的修改,则可以通过deploy来更新服务
$ docker stack deploy -c docker-compose.yml wordpress
单个service更新
$ docker service update kafka_kafka2
12. 移除服务
要移除服务,使用 docker stack down
$ docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default
该命令不会移除服务所使用的 数据卷
,如果你想移除数据卷请使用 docker volume rm