目录导航

  • 一、Swarm介绍
  • 二、Swarm实例
    • 2.1 准备工作
    • 2.2 创建集群
    • 2.3 使用集群

一、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的安装,该步骤可以参考另外一个博主的一篇文章:《Linux中安装docker》,安装完成后可以执行docker --version进行查看,务必确保全部安装成功以后再进入下面的步骤。

2.2 创建集群

在创建集群之前,我们使用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:2377To 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.3 使用集群

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集群自动删除。

云原生之 Docker Swarm服务编排介绍及使用入门相关推荐

  1. 云原生架构下日志服务数据预处理

    简介:本篇实践将以某家国际教育机构为例,为大家详细介绍云原生架构下日志服务数据预处理以及对应的解决方案和最佳实践操作手册,方便用户快速对号入座,解决云原生架构下的常见日志难题. 直达最佳实践:[htt ...

  2. cube一站式云原生机器学习平台-推理服务的工程化加速

    全栈工程师开发手册 (作者:栾鹏) 一站式云原生机器学习平台 前言:cube是tme开源的云原生机器学习平台,目前包含特征平台,支持在/离线特征:数据源管理,支持结构数据和媒体标注数据管理:在线开发, ...

  3. 【云原生之Docker实战】使用Docker部署Lsky Pro个人图床平台

    [云原生之Docker实战]使用Docker部署Lsky Pro个人图床平台 一.Lsky Pro介绍 1.Lsky Pro简介 2.Lsky Pro特点 二.检查宿主机系统版本 三.检查本地dock ...

  4. 【云原生之Docker实战】使用Docker部署Mindoc文档管理平台

    [云原生之Docker实战]使用Docker部署Mindoc文档管理平台 一.Mindoc介绍 1.Mindoc简介 2.Mindoc功能 二.检查宿主机系统版本 1.检查操作系统版本 2.检查系统内 ...

  5. 【云原生之Docker实战】使用Docker部署Cloudreve公有云文件系统

    [云原生之Docker实战]使用Docker部署Cloudreve公有云文件系统 一.Cloudreve介绍 1.Cloudreve简介 2.Cloudreve特点 二.检查本地docker环境 1. ...

  6. 【云原生之Docker实战】使用Docker部署Alist网盘直链程序

    [云原生之Docker实战]使用Docker部署Alist网盘直链程序 一.Alist介绍 1.Alist简介 2.Alist支持的网盘 3.Alist特点 二.检查宿主机系统版本 三.检查本地doc ...

  7. 【云原生之Docker实战】使用Docker部署Flarum开源论坛

    [云原生之Docker实战]使用Docker部署Flarum开源论坛 一.Flarum介绍 1.Flarum简介 2.Flarum特点 二.检查宿主机系统版本 三.检查本地docker环境 1.检查d ...

  8. 【云原生之Docker实战】使用Docker部署Rap2开源接口管理工具

    [云原生之Docker实战]使用Docker部署Rap2开源接口管理工具 一.Rap2介绍 二.检查宿主机系统版本 三.检查本地docker环境 1.检查docker服务状态 2.检查docker配置 ...

  9. 【云原生之Docker实战】使用Docker部署Duplicati备份工具

    [云原生之Docker实战]使用Docker部署Duplicati备份工具 一.Duplicati介绍 2.Duplicati特点 二.检查宿主机系统版本 三.检查本地docker环境 1.检查doc ...

最新文章

  1. ThinkPHP 5.0 入门教程 一:安装ThinkPHP并在Web浏览器访问
  2. 汇编语言 寄存器 2.9~2.12 总结
  3. 引以为戒,特斯拉Kubernetes控制台被黑客攻击
  4. catkin_make: command not found
  5. Android自动伸展动画,android – 如何实现平滑的展开/折叠动画
  6. 使用Spring MVC开发Restful Web服务
  7. oracle01537,ORACLE REUSE实验
  8. 李天平×××作诞生记——《亮剑.NET:.NET深入体验与实战精要》
  9. 全局变量中断原子操作_操作系统导论02-06章
  10. 火狐优化及遇到的问题
  11. 判断用户 小程序_小程序对于用户的作用有哪些
  12. android中webview使用打开系统相机录像_有没有什么高效使用微信的经验?
  13. sw修改器初始化服务器错误,solidworks打开出现Loadlibrary failed with error 1114:动态链接库(DLL)初始化例程失败如何解决?...
  14. beyond compare代码比对工具
  15. 解决tomcat内存溢出问题
  16. SNMP TRAP实战
  17. PX4 ---- Mixer
  18. 【观察】数字中国的新机遇,神州数码的新角色
  19. webpack配置完全指南
  20. c语言中函数floor用法,C 库函数

热门文章

  1. [转载]深圳、香港、新加坡 我的程序轨迹
  2. Neo4J图库的基础介绍(一)
  3. 半夏半暖半流年,半秋半冷半生缘
  4. C - N^3问题 SDUT
  5. 【个人瞎想】乡村个体户经营方法
  6. mysql的发展进程和特点_数据库的发展历史分为哪几个阶段_各有什么特点
  7. 2.1.4符号常量和const常量
  8. Tomcat10不支持javax的问题
  9. 昨天的你造就今天的你,今天的你准备怎么造就明天的你呢?
  10. 2023最新使用python进行shellcode免杀过360火绒 ,反虚拟机