docker入门教程八:三剑客之docker swarm

简介

Swarm是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。Swarm mode 内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的Swarm集群具备与 Mesos、Kubernetes 竞争的实力。

swarm是一个集群概念,所以就必须会有管理节点和工作节点的概念,这是一个集群所必须有的东西。

  • 管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现。
  • 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

img

同时还有2个概念需要理解,服务和任务:

  • 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
  • 服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式,两种模式通过 docker service create--mode 参数指定。
    • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
    • global services 每个工作节点上运行一个任务

img

集群搭建及使用

需要准备2台机器,一台是manager节点,IP是192.168.137.66,另一台是work节点,IP是192.168.137.55。

初始化

首先进行初始化集群操作:

在manager上面操作:

1
2
3
4
5
6
7
8
[root@localhost ~]# docker swarm init --advertise-addr 192.168.137.66
Swarm initialized: current node (p92ez7umy4y7t0c7maj907v4x) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-1faujb51zu8p1b7uw8whplp97hnf6rehjgx536koqkjyixodg9-9yjq4lgtxpyu9hrknqbejg62h 192.168.137.66:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

运行 docker swarm init --advertise-addr之后,会就提示如果有work节点需要加入到这个集群里面的话,就可以复制以下的这一行命令,主要是—token。

在work节点操作:

1
2
[root@localhost ~]# docker swarm join --token SWMTKN-1-1faujb51zu8p1b7uw8whplp97hnf6rehjgx536koqkjyixodg9-9yjq4lgtxpyu9hrknqbejg62h 192.168.137.66:2377
This node joined a swarm as a worker.

很简单,复制命令执行一下就可以了。

在切回到manager上,使用 docker node ls 查看节点的情况,该命令只能在管理节点运行。

1
2
3
4
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
p92ez7umy4y7t0c7maj907v4x * localhost.localdomain Ready Active Leader 19.03.2
mxhy7p2uqfcdugnks29l7jey1 remote Ready Active 19.03.2

部署服务

我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# docker service create --replicas 3 -p 80:80 --name nginx nginx:1.13.7-alpine
n00dtwb5rfn4qly4i8c1c6ezc
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged

[root@localhost ~]# curl -s http://192.168.137.66 |grep Welcome
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>
[root@localhost ~]#
[root@localhost ~]# curl -s http://192.168.137.55 |grep Welcome
<title>Welcome to nginx!</title>
<h1>Welcome to nginx!</h1>

按上面的规划,只有一个worker节点,但实际上,manager节点也是可以部署任务和服务的,所以也算是一个worker节点,自行就加入了。使用curl工具来访问,证明服务部署地没有异常。

查看运行情况

使用 docker service ls 查看当前集群运行的服务,使用 docker service ps 来查看某个服务的详情。 从 docker service ps nginx 中可以看到,运行了3个副本,在remote 这个worker节点上面运行了2个nginx的任务。

1
2
3
4
5
6
7
8
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
n00dtwb5rfn4 nginx replicated 3/3 nginx:1.13.7-alpine *:80->80/tcp
[root@localhost ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
1985ibefbpjk nginx.1 nginx:1.13.7-alpine remote Running Running 29 seconds ago
n0xw3rqcej09 nginx.2 nginx:1.13.7-alpine localhost.localdomain Running Running 39 seconds ago
ugmhss3dp1et nginx.3 nginx:1.13.7-alpine remote Running Running 42 seconds ago

服务伸缩

我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# docker service scale nginx=2
nginx scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
n00dtwb5rfn4 nginx replicated 2/2 nginx:1.13.7-alpine *:80->80/tcp
[root@localhost ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
1985ibefbpjk nginx.1 nginx:1.13.7-alpine remote Running Running 9 minutes ago
n0xw3rqcej09 nginx.2 nginx:1.13.7-alpine localhost.localdomain Running Running 9 minutes ago

更新版本

由于我们之使用的nginx是1.13版本,很老了,需要升级下。使用 --image 选项进行服务镜像的更新:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# docker exec -it nginx.2.dqr6ytgmo6uvsr3b5mu8i2jlk nginx -v
nginx version: nginx/1.13.7
[root@localhost ~]# docker service update --image nginx:1.16.1-alpine nginx
nginx
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
[root@localhost ~]# docker exec -it nginx.2.dqr6ytgmo6uvsr3b5mu8i2jlk nginx -v
Error response from daemon: Container 18129a24b960f74a68066bb40d9b9106bc2e2702c7f0db23e7b974286931f9d8 is not running
[root@localhost ~]# docker exec -it nginx.2.egooovj58sserjcash77eb35j nginx -v
nginx version: nginx/1.16.1

回退版本

有更新就有回退,使用 docker service rollback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@localhost ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
8jkdrojxwooy nginx.1 nginx:1.16.1-alpine remote Running Running 4 minutes ago
8dk43ff5rq4o \_ nginx.1 nginx:1.13.7-alpine remote Shutdown Shutdown 4 minutes ago
egooovj58sse nginx.2 nginx:1.16.1-alpine localhost.localdomain Running Running 4 minutes ago
dqr6ytgmo6uv \_ nginx.2 nginx:1.13.7-alpine localhost.localdomain Shutdown Shutdown 4 minutes ago
[root@localhost ~]# docker service rollback nginx
nginx
rollback: manually requested rollback
overall progress: rolling back update: 2 out of 2 tasks
1/2: running [> ]
2/2: running [> ]
verify: Service converged
[root@localhost ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
az5ep2t6t8bh nginx.1 nginx:1.13.7-alpine remote Running Running 13 seconds ago
8jkdrojxwooy \_ nginx.1 nginx:1.16.1-alpine remote Shutdown Shutdown 14 seconds ago
8dk43ff5rq4o \_ nginx.1 nginx:1.13.7-alpine remote Shutdown Shutdown 5 minutes ago
1kpq3lyp23ut nginx.2 nginx:1.13.7-alpine localhost.localdomain Running Running 9 seconds ago
egooovj58sse \_ nginx.2 nginx:1.16.1-alpine localhost.localdomain Shutdown Shutdown 9 seconds ago
dqr6ytgmo6uv \_ nginx.2 nginx:1.13.7-alpine localhost.localdomain Shutdown Shutdown 5 minutes ago
#查看版本,已经回退好了
[root@localhost ~]# docker exec -it nginx.2.1kpq3lyp23utpuf6t0vwt1mq5 nginx -v
nginx version: nginx/1.13.7

从升级以及回退中可以看到,docker server都是类似git,会保留历史版本。

删除服务

使用 docker service rm 来从 Swarm 集群移除某个服务。

1
2
[root@localhost ~]# docker service rm nginx
nginx

docker service 还有另外2个功能,一是密钥功能,二是管理配置文件功能,有兴趣的同学请查看https://yeasy.gitbooks.io/docker_practice/content/swarm_mode/config.html ,自行练习。这几个概念跟K8S很接近,要深刻理解 之。

使用compose文件

正如之前使用 docker-compose.yml 来一次配置、启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务,docker使用docker stack命令来运行compose文件。

准备如下yaml文件,运行2个wordpress服务,一个db服务,一个visualizer服务,后2台服务都指定了运行在magager节点上:

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
[root@localhost wordpress]# cat docker-compose.yml
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: 2

db:
image: mysql
networks:
- overlay
volumes:
- db-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
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
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost wordpress]# docker stack deploy -c docker-compose.yml wp
Creating network wp_overlay
Creating network wp_default
Creating service wp_db
Creating service wp_visualizer
Creating service wp_wordpress
[root@localhost wordpress]# docker stack ls
NAME SERVICES ORCHESTRATOR
wp 3 Swarm
[root@localhost wordpress]# docker stack ps wp
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
o1xhtj8qq2d0 wp_wordpress.1 wordpress:latest localhost.localdomain Running Preparing 2 minutes ago
ipz4y738pjpi wp_visualizer.1 dockersamples/visualizer:stable localhost.localdomain Running Preparing 2 minutes ago
8tx7j9276ujx wp_db.1 mysql:latest localhost.localdomain Running Preparing 2 minutes ago
smjxpssmrjm0 wp_wordpress.2 wordpress:latest remote Running Preparing 2 minutes ago
#隔了几分钟之后,看到有的服务已经是running状态了
[root@localhost wordpress]# docker stack ps wp
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
o1xhtj8qq2d0 wp_wordpress.1 wordpress:latest localhost.localdomain Running Running 26 seconds ago
ipz4y738pjpi wp_visualizer.1 dockersamples/visualizer:stable localhost.localdomain Running Running about a minute ago
8tx7j9276ujx wp_db.1 mysql:latest localhost.localdomain Running Running 44 seconds ago
smjxpssmrjm0 wp_wordpress.2 wordpress:latest remote Running Preparing 4 minutes ago

上面有部署了一个visualizer服务,这是查看集群状态,在浏览器上面访问任意一个节点 ip + 8080就可以看到了。

要移除服务,使用 docker stack down

1
2
3
4
5
6
[root@localhost wordpress]# docker stack down wp
Removing service wp_db
Removing service wp_visualizer
Removing service wp_wordpress
Removing network wp_default
Removing network wp_overlay

跟docker-compose类似,该命令不会移除服务所使用的数据卷,如果你想移除数据卷请使用 docker volume rm

  • 本文作者: wumingx
  • 本文链接: https://www.wumingx.com/k8s/docker-swarm.html
  • 本文主题: docker入门教程八:三剑客之docker swarm
  • 版权声明: 本博客所有文章除特别声明外,转载请注明出处!如有侵权,请联系我删除。
0%