什么是Docker Swarm?

  • 对比Docker

前面我们介绍过Docker可以理解成是一个我们的服务的独立运行的容器,那么在实际工作中,我们的系统可能是一个微服务应用,系统中根据业务拆分成多个模块,可以理解一个模块对应一组运行着相同镜像的的Docker容器,这就是单个Docker,而Swarm就是这个系统中,能够管理所有的容器之间的路由、负载均衡、服务发现,以及容器的伸缩(可以理解为我们一个服务进行扩/缩容)、日志、配置文件的编排工具。

  • 对比Docker-Compose

Docker-Compose类似与我们生活中的管家,它仅仅能够管理一个主机上的所有容器,他可以一次性启动多个容器。而Docker-Swarm可以跨主机去管理多个容器,并且当一个容器状态异常时候可以快速在其他机器上启动容器,保证服务的高可用!

  • 对比Kubernetes

Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,都是一个跨主机的容器管理平台,当然也有自己一些不一样的特点,k8s是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。Kubernetes在Docker基础上封装了一层概念,所以他的功能相对于Swarm更强大,但是运维更复杂,Swarm则更容易上手。

综上所述大家应该知道Docker就是一个容器,Docker-Compose是一个单主机的编排工具,Docker-Swarm是一个多主机的编排工具!


swarm
  • Swarm架构组成

    • Docker Api 是基于Docker去管理容器
    • Swarm Manage CLi 是Swarm集群管理Api
    • Leadership 这个是Swarm提供的HA
    • Scheduler 则是Swarm的调度策略,以及过滤规则管理
    • Discovery Service 管理每个容器的服务的注册、发现

结构图
  • Swarm如何工作?
    Swarm节点分为管理节点(manager)跟 工作节点(worker),管理节点主要用于swarm集群的管理(也可以设置执行任务工作),Docker Swarm命令只能在管理节点上去操作,一个集群可以存在多个管理节点,但是只有一个管理节点可以成为Leader。工作节点是任务执行节点。

    • Manager节点:

      1. 处理集群管理任务
      2. 维护集群状态
      3. 调度服务
      4. Swarm 提供外部可调用的 API 接口
    • Worker节点:
      实际执行我们服务的Docker容器

执行图

Docker Swarm命令

  • 初始化集群
$ docker swarm init --advertise-addr 192.168.99.121
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.

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

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • 加入集群
# 加入worker 
$ docker swarm join-token worker

To add a worker to this swarm, run the following command:
    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
    172.17.0.2:2377
# 加入manager 
$ docker swarm join-token manager

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

    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \
    172.17.0.2:2377
  • 离开集群
# --force / -f 强制离开
$ docker swarm leave -f
Node left the default swarm.
  • 查看集群节点信息
docker@manager:~$ docker node ls                                                                                                                                                          
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12

  • swarm集群中创建服务
docker service create --name redis redis:3.0.6

dmu1ept4cxcfe8k8lhtux3ro3

$ docker service create --mode global --name redis2 redis:3.0.6

a8q9dasaafudfs8q8w32udass

$ docker service ls

ID            NAME    MODE        REPLICAS  IMAGE
dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6
a8q9dasaafud  redis2  global      1/1       redis:3.0.6
  • 查看swarm集群服务信息
$ docker service inspect redis
  • 查看服务的日志
$ docker service logs -f redis

  • 查看启动所有服务
$ docker service ls 
ID            NAME      MODE            REPLICAS             IMAGE
c8wgl7q4ndfd  frontend  replicated      5/5                  nginx:alpine
dmu1ept4cxcf  redis     replicated      3/3                  redis:3.0.6
iwe3278osahj  mongo     global          7/7                  mongo:3.3
hh08h9uu8uwr  job       replicated-job  1/1 (3/5 completed)  nginx:latest

  • 查看服务启动的具体容器
$ docker service ps redis

ID             NAME      IMAGE        NODE      DESIRED STATE  CURRENT STATE          ERROR  PORTS
0qihejybwf1x   redis.1   redis:3.0.5  manager1  Running        Running 8 seconds
bk658fpbex0d   redis.2   redis:3.0.5  worker2   Running        Running 9 seconds
5ls5s5fldaqg   redis.3   redis:3.0.5  worker1   Running        Running 9 seconds
  • 删除服务
$ docker service rm redis

redis

$ docker service ls

ID  NAME  MODE  REPLICAS  IMAGE
  • 扩容/缩容服务(可以动态添加服务提供节点,在swarm节点集群中启动)
    docker service create --mode global ... : 启动服务️定--mode global 则不能使用此命令,global创建一个服务会在每个节点都启动一个
# frontend服务扩容50个节点
$ docker service scale frontend=50

frontend scaled to 50
  • 指定参数更新
    具体参考 https://docs.docker.com/engine/reference/commandline/service_update/

Swarm实战演练

使用Dcoker-Machine创建3台虚拟机

1.创建三台主机

docker-machine create --driver=virtualbox  manager
docker-machine create --driver=virtualbox  node-1
docker-machine create --driver=virtualbox  node-2

[root@docker ~]# docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER      ERRORS
manager   -        virtualbox   Running   tcp://192.168.99.100:2376           v19.03.12   
node-1    -        virtualbox   Running   tcp://192.168.99.103:2376           v19.03.12   
node-2    -        virtualbox   Running   tcp://192.168.99.102:2376           v19.03.12  

2.创建好主机后初始化Swarm manager节点

[root@docker ~]# docker-machine ssh manager
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

# --advertise-addr 改成 manager 节点ip
docker@manager:~$   docker swarm init --advertise-addr 192.168.99.100  
Swarm initialized: current node (alz0od3rbkg552mkicfuezhkn) is now a manager.

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

    docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377

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

这样就初始化好了manager是不是很简单?

3.切换node-1、node-2加入集群


# node-1加入swarm集群、
[root@docker ~]# docker-machine ssh node-1
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@node-1:~$ docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker.

#node-2加入swarm集群
[root@docker ~]# docker-machine ssh node-2
   ( '>')
  /) TC (\   Core is distributed with ABSOLUTELY NO WARRANTY.
 (/-_--_-\)           www.tinycorelinux.net

docker@node-2:~$     docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker

  1. 在manager查看当前集群node状态
docker@manager:~$ docker node ls                                                                                                                                                          
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
alz0od3rbkg552mkicfuezhkn *   manager             Ready               Active              Leader              19.03.12
jxf5u2hnurrgz90vnd9ay3y7p     node-1              Ready               Active                                  19.03.12
lldvm2slseyodo0t7ath5tzne     node-2              Ready               Active                                  19.03.12
  1. 创建一个nginx服务包含3个副本
# --replicas 指定容器个例数
docker@manager:~$ docker service create  --name test-nginx --publish 8080:80  --replicas=3 nginx
ya3q60llnj62w141aaekggyl2
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
docker@manager:~$ docker service ls                                                                                                                                                       
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ya3q60llnj62        test-nginx          replicated          3/3                 nginx:latest        *:8080->80/tcp

这时候创建好了3个nginx服务,这时候我们只要访问manager的ip:8080 则可以随机访问任意一个nginx服务,是不是类似nginx的负载均衡?

# 发送多次请求nginx服务
curl 192.168.99.100:8080
#查看日志
docker@manager:~$ docker service logs -f ya3q60llnj62                                                                                                                                     
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.1.h50ridnlpsim@node-2    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.1.h50ridnlpsim@node-2    | 10.0.0.2 - - [25/Mar/2021:14:59:33 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.3.mw75ab00bfs1@node-1    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:28 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1    | 10.0.0.2 - - [25/Mar/2021:14:59:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager    | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.2.drsv2s4cnf9y@manager    | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager    | 10.0.0.2 - - [25/Mar/2021:14:59:32 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

至此所有请求负载到后端3个nginx服务上。

结束

下篇结合微服务说swarm如何可以代替微服务的功能!

欢迎关注公众号!
公众号回复:入群 ,扫码加入我们交流群!

走进docker-swarm 带大家快速掌握docker自带编排工具的更多相关文章

  1. Docker Swarm搭建多服务器下Docker集群

    对于有多台服务器来讲,如果每一台都去手动操控,那将会是一件非常浪费时间的事情,毕竟时间这东西,于我们而言,十分宝贵,或许在开始搭建环境的时候耗费点时间,感觉是正常的,我也如此,花费大堆时间在采坑和填坑 ...

  2. docker实战系列之快速删除docker中的容器

    1.停用全部运行中的容器 docker stop $(docker ps -q) 2.删除全部容器 docker rm $(docker ps -aq) 3.停用并删除容器 docker stop $ ...

  3. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

  4. Docker 系列六(Docker Swarm 项目).

    一.前言 随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大.上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的通信,比如 Web 项目对 DB.Ca ...

  5. docker swarm 搭建及跨主机网络互连案例分析

    准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...

  6. Docker Manager for Docker Swarm deploy

    一.Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Doc ...

  7. 行车记+翻车记:.NET Core 新车改造,C# 节能降耗,docker swarm 重回赛道

    非常抱歉,10:00~10:30 左右博客站点出现故障,给您带来麻烦了,请您谅解. 故障原因与博文中谈到的部署变更有关,但背后的问题变得非常复杂,复杂到我们都在怀疑与阿里云服务器 CPU 特性有关. ...

  8. 一文快速入门Docker

    Docker提供一种安全.可重复的环境中自动部署软件的方式,拉开了基于与计算平台发展方式的变革序幕.如今Docker在互联网公司使用已经非常普遍.本文用十分钟时间,带你快速入门Docker. Dock ...

  9. docker--搭建docker swarm集群

    10 搭建docker swarm集群 10.1 swarm 介绍 Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行 为.比如我们常见的蜂群,鱼群,秋天 ...

随机推荐

  1. ES6 arrow function vs ES5 function

    ES6 arrow function vs ES5 function ES6 arrow function 与 ES5 function 区别 this refs xgqfrms 2012-2020 ...

  2. Keep Fitness

    Keep Fitness 健身 keep health 训练流程 Part 1 热身 5-10分钟 Part 2 肌肉力量训练 30分钟 大肌群包括:胸.背.腿.臀: 小肌群包括:肩.二头肌.三头肌. ...

  3. auto embedded component in an online code editor

    auto embedded component in an online code editor how to auto open a component in the third parts onl ...

  4. 增强 CT & CT & MR

    增强 CT & CT & MR CTA,增强 CT Computed Tomography (CT) CT 计算机断层扫描 Computed Tomography (CT) Angio ...

  5. how to overwrite css !important style

    how to overwrite css !important style css !important bug how to override css !important style https: ...

  6. WEB 硬件设备联网

    在js中与第三方设备的通信 这是一个Xbox One手柄的demo,将手柄使用USB连接到PC上: See also: video Device APIs 通过JavaScript与蓝牙设备通信 在网 ...

  7. 「NGK每日快讯」12.17日NGK第44期官方快讯!

  8. BGV崛起带动DeFi重回大众视野

    自10月份比特币二次发力以来,DeFi越来越被市场忽略,这当然也有比特币给力和DeFi低迷的双重原因,但随着Baccarat的平台币BGV于A网的正式上线,近期DeFi重新回到了大众的视野中. 正如区 ...

  9. Hive-常见调优方式 && 两个面试sql

    Hive作为大数据领域常用的数据仓库组件,在设计和开发阶段需要注意效率.影响Hive效率的不仅仅是数据量过大:数据倾斜.数据冗余.job或I/O过多.MapReduce分配不合理等因素都对Hive的效 ...

  10. Spark和Spring整合处理离线数据

    如果你比较熟悉JavaWeb应用开发,那么对Spring框架一定不陌生,并且JavaWeb通常是基于SSM搭起的架构,主要用Java语言开发.但是开发Spark程序,Scala语言往往必不可少. 众所 ...