简介
Swarm是使用 SwarmKit
构建的 Docker 引擎内置(原生)的集群管理和编排工具。Swarm mode
内置 kv 存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计、内置服务发现、负载均衡、路由网格、动态伸缩、滚动更新、安全传输等。使得 Docker 原生的Swarm集群具备与 Mesos、Kubernetes 竞争的实力。
swarm是一个集群概念,所以就必须会有管理节点和工作节点的概念,这是一个集群所必须有的东西。
- 管理节点用于
Swarm
集群的管理,docker swarm
命令基本只能在管理节点执行(节点退出集群命令docker swarm leave
可以在工作节点执行)。一个Swarm
集群可以有多个管理节点,但只有一个管理节点可以成为leader
,leader
通过raft
协议实现。 - 工作节点是任务执行节点,管理节点将服务 (
service
) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
同时还有2个概念需要理解,服务和任务:
- 任务 (
Task
)是Swarm
中的最小的调度单位,目前来说就是一个单一的容器。 - 服务 (
Services
) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式,两种模式通过docker service create
的--mode
参数指定。replicated services
按照一定规则在各个工作节点上运行指定个数的任务。global services
每个工作节点上运行一个任务
集群搭建及使用
需要准备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小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!