Docker Swarm介绍及使用入门

一、Swarm介绍

Docker Swarm是管理跨节点容器的编排工具,相较于Docker Compose而言,Compose只能编排单节点上的容器,Swarm将一群Docker节点虚拟化为一个主机,使得用户只要在单一主机上操作就能完成对整个容器集群的管理工作。如果下载的是最新版的Docker,那么Swarm就已经被包含在内了,无需再安装。

Docker Swarm架构包含两种角色,manager和node,前者是Swarm Daemon工作的节点,包含了调度器、路由、服务发现等功能,负责接收客户端的集群管理请求,然后调度Node进行具体的容器工作,比如容器的创建、扩容与销毁等。 manager本身也是一个node。

Swarm工作示意图

通常情况下,为了集群的高可用,manager个数>=3的奇数,node的个数则是不限制。

二、Swarm实例

2.1 准备工作

我们需要准备好三个节点,并在各自节点上安装好Docker Engine,才能进行接下来的实例搭建。

此处,我们选择购买阿里云的三个ECS云服务器,它们都是在一个地域里面,对应的私有地址IP和修改的host name分别是:

172.25.206.125 ————作为node1
172.25.206.126 ————作为node2
172.22.147.207 ————作为manager

我们首先需要重置root的登录密码,然后ssh登录后,确保相互之间可以ping通,然后再继续下面的操作。一般三台机器如果都在同一个区的话,使用私有地址相互之间肯定是联通的。

然后登录各个容器内部的命令行,进行Docker Engine的安装,该步骤可以参考另外一篇文章:《CentOS系统安装Docker》,安装完成后可以执行docker --version进行查看,务必确保全部安装成功以后再进入下面的步骤。

2.1 创建集群

在创建集群之前,我们使用docker node ls想查看下集群中节点的信息,反馈目前没有节点信息,并且当前节点并不是manager。

[root@manager ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

那么我们首先就在manager这个节点上执行如下操作,表示要将它设置为manager,并且设置自己的通讯IP为172.22.147.207

[root@manager ~]# docker swarm init --advertise-addr 172.22.147.207
Swarm initialized: current node (s0eoali1x32ly22jo85ebeb0w) is now a manager.

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

    docker swarm join --token SWMTKN-1-57msikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.22.147.207:2377

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

如上就完成了manager节点的设置,并且得到提示信息如下:

  • 可以在其它节点上执行docker swarm join --token......来将该节点设置为工作node,并加入到这个swarm集群中;
  • 可以在其它节点上执行docker swarm join-token manager来获取下一步执行指令,执行该指令后,该节点将设置为manager从节点加入到这个swarm集群中;

我们目前演示的是一个manager,两个工作node的模式,所以在另外两台node1和node2上执行第一个命令即可:

[root@node1 ~]# docker swarm join --token SWMTKN-1-57msikozxxt44uxz5r8hihmakp4zh1cr89v7zlxhyc8b5iojkt-5ea8uh68jcuy8m6f9ma7x0zg5 172.22.147.207:2377
This node joined a swarm as a worker.

如此,一个swarm集群就算搭建完成了。

2.2 使用集群

manager是我们管理集群的入口,我们的docker命令都是在manager上执行,node节点上是不能执行dockr命令的,这一点要十分牢记。

  • 查看当前节点信息;

    [root@manager ~]# docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    s0eoali1x32ly22jo85ebeb0w *   manager    Ready     Active         Leader           20.10.11
    7kuhm78bs3zrfkm2n28ukje25     node1      Ready     Active                          20.10.11
    io4qmqb87yzpmmo2mpblj48fp     node2      Ready     Active                          20.10.11
    
  • 创建一个私有网络,供不同节点上的容器互通使用;网络相关参考Docker网络互联原理及自定义网络的使用

    [root@manager ~]# docker network ls
    NETWORK ID     NAME              DRIVER    SCOPE
    45f6a352dcd2   bridge            bridge    local
    2b71198e802e   docker_gwbridge   bridge    local
    679154a40c18   host              host      local
    1ntnd2ruk0tp   ingress           overlay   swarm
    6d6218b5a31f   none              null      local
    [root@manager ~]# docker network create -d overlay niginx_network
    ldb1i69hxdsdo6un8yhaddhnv
    [root@manager ~]# docker network ls
    NETWORK ID     NAME              DRIVER    SCOPE
    45f6a352dcd2   bridge            bridge    local
    2b71198e802e   docker_gwbridge   bridge    local
    679154a40c18   host              host      local
    1ntnd2ruk0tp   ingress           overlay   swarm
    ldb1i69hxdsd   niginx_network    overlay   swarm
    6d6218b5a31f   none              null      local
    
  • 使用指定的网络部署一个服务;

    [root@manager ~]# docker service create --replicas 1 --network niginx_network --name my_nginx -p 80:80 nginx:latest
    q03ljoy94xkdeicb7d9tx422b
    overall progress: 1 out of 1 tasks 
    1/1: running   [==================================================>] 
    verify: Service converged 
    

    如上使用nginx:latest镜像创建了一个容器,容器名称为my_nginx,对外暴露80端口;

  • 查看运行中的服务列表;

    [root@manager ~]# docker service ls
    ID             NAME       MODE         REPLICAS   IMAGE          PORTS
    q03ljoy94xkd   my_nginx   replicated   1/1        nginx:latest   *:80->80/tcp
    
  • 查看某个服务在哪个节点上运行;

    [root@manager ~]# docker service ps my_nginx
    ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
    wf5h6u13zel6   my_nginx.1   nginx:latest   manager   Running         Running 2 minutes ago 
    

    除此之外,我们还可以在每一台服务器上使用docker ps来看看运行了哪些容器;

  • 动态扩缩容某个服务的容器个数;

    [root@manager ~]# docker service scale my_nginx=4
    my_nginx scaled to 4
    overall progress: 4 out of 4 tasks 
    1/4: running   [==================================================>] 
    2/4: running   [==================================================>] 
    3/4: running   [==================================================>] 
    4/4: running   [==================================================>] 
    verify: Service converged 
    [root@manager ~]# docker service ls
    ID             NAME       MODE         REPLICAS   IMAGE          PORTS
    q03ljoy94xkd   my_nginx   replicated   4/4        nginx:latest   *:80->80/tcp
    [root@manager ~]# docker service ps my_nginx
    ID             NAME         IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
    wf5h6u13zel6   my_nginx.1   nginx:latest   manager   Running         Running 8 minutes ago              
    kke3fl9sxdjm   my_nginx.2   nginx:latest   node1     Running         Running 27 seconds ago             
    0ds3p18dmc9r   my_nginx.3   nginx:latest   node1     Running         Running 27 seconds ago             
    32kyyibu9j12   my_nginx.4   nginx:latest   node2     Running         Running 25 seconds ago
    

    使用update命令也是等价的:docker service update --replicas 3 my_nginx

  • 下线一个节点,使之不参与任务分派;

    [root@manager ~]# docker node update --availability drain node2
    node2
    [root@manager ~]# docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    s0eoali1x32ly22jo85ebeb0w *   manager    Ready     Active         Leader           20.10.11
    7kuhm78bs3zrfkm2n28ukje25     node1      Ready     Active                          20.10.11
    io4qmqb87yzpmmo2mpblj48fp     node2      Ready     Drain                           20.10.11
    

    值得一提的是,如果某个节点被设置下线,或者因为其它故障宕机了,那么它其上的容器会被转移到其它可运行的节点上,如此来保证始终有指定副本数量的容器在运行。

  • 上线一个下线中的节点,使之参与任务分派;

    [root@manager ~]# docker node update --availability active node2
    node2
    
  • 移除一个任务,使得集群中所有该任务的容器都删除;

    [root@manager ~]# docker service update --replicas 4 my_nginx
    my_nginx
    overall progress: 4 out of 4 tasks 
    1/4: running   [==================================================>] 
    2/4: running   [==================================================>] 
    3/4: running   [==================================================>] 
    4/4: running   [==================================================>] 
    verify: Service converged 
    [root@manager ~]# docker service ps my_nginx
    ID             NAME             IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
    wf5h6u13zel6   my_nginx.1       nginx:latest   manager   Running         Running 18 minutes ago             
    q9soig9jmkik   my_nginx.2       nginx:latest   node2     Running         Running 13 seconds ago             
    hqti23fox6ui   my_nginx.3       nginx:latest   node1     Running         Running 13 seconds ago             
    wgm2xaqd147p   my_nginx.4       nginx:latest   node2     Running         Running 13 seconds ago             
    32kyyibu9j12    \_ my_nginx.4   nginx:latest   node2     Shutdown        Shutdown 7 minutes ago             
    [root@manager ~]# docker service rm my_nginx
    my_nginx
    [root@manager ~]# docker service ps my_nginx
    no such service: my_nginx
    
  • 节点离开集群;

    [root@node1 ~]# docker swarm leave
    Node left the swarm.
    
    [root@manager ~]# docker node ls
    ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
    s0eoali1x32ly22jo85ebeb0w *   manager    Ready     Active         Leader           20.10.11
    7kuhm78bs3zrfkm2n28ukje25     node1      Down      Active                          20.10.11
    io4qmqb87yzpmmo2mpblj48fp     node2      Ready     Active                          20.10.11
    
  • 删除swarm集群;

    [root@manager ~]# docker swarm leave
    Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message.
    [root@manager ~]# docker swarm leave -f
    Node left the swarm.
    

    当最后一个manager节点离开,则swarm集群自动删除。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容