简介

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

夜河资源网提供的所有内容仅供学习与交流。通过使用本站内容随之而来的风险以及法律责任与本站无关,所承担的法律责任由使用者承担。
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!