Docker集群管理之swarm


  1. Docker集群管理
  2. Swarm基础

    Swarm在Docker1.12版本之前属于一个独立的项目,在Docker1.12版本发布之后,该项目合并到了Docker中,成为Docker的一个子命令,即Swarm集群模式。目前,Swarm是Docker社区提供的唯一的一个原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机, 使得容器可以组成跨主机的子网网络。

    在Docker1.12版本之前,Docker在集群管理上一直依靠第三方工具。以前的Docker服务自身只能在单台主机上进行操作, 官方并没有真正意义上的集群管理方案。 直到Docker 1.12版的发布,Docker引擎在多主机 、多容器的集群管理上才有了进一步的改进和完善,该版本的Docker内嵌了Swarm mode集群管理模式。从Docker 1.13版开始,DockerSwarm又有了更丰富的功能,比如正式 支持DockerStack等。

    原理如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

  1. Docker Swarm命令

     

     

     

     

    1.Swarm初始化docker swarm init

     

    初始化集群的子命令docker swarm init

     

     

    2.加入集群docker swarm join

    1. 管理添加节点的口令docker swarm join-token

    swarm添加节点时需要管理节点生成一个口令,待添加的子节点需要凭借这个口令才能加入集群,这个子命令docker swarm join-token更加简单,主要用于管理集群口令,该子命令只能用于管理节点。

    --rotate表示持续输出口令

     

    1. 离开集群docker swarm leave

    docker swarm leave用于退出当前集群

    1. 解锁集群docker swarm unlock

    解锁集群的命令docker swarm unlock,用于解除锁定的swarm集群。

     

    1. 管理解锁密钥docker swarm unlock-key

    docker swarm unlock-key这个命令的选项与docker swarm join-token一致

     

    1. 更新集群docker swarm update

     

  2. Docker Node命令

     

    1. docker node demote

    将一个或多个节点从群集中的管理器降级。

    1. docker node inspect

    在一个或多个节点上显示详细信息

     

    3.docker node ls

    列出群中的节点

     

    4.docker node promote

    将一个或多个节点提升为群集中的管理器。

    5.docker node ps

    列出在一个或多个节点上运行的任务,默认为当前节点

     

    6.docker node rm

    从群中删除一个或多个节点

    7.docker node update

    更新节点

     

  3. Docker Stack命令

     

    1. 部署Docker栈docker stack deploy

    1. 查看所有栈docker stack ls

     

    3.列出堆栈中的任务docker stack ps

     

    4.移除一个或多个堆栈docker stack rm

     

    5.列出堆栈中的服务docker stack services

     

  4. Docker集群网络

    搭建一个Docker集群网络,为了方便演示跨主机网络,我们需要用到一个工具--Docker Machine,这个工具与Docker Compose,Docker Swarm一起称为Docker三剑客。

    安装machine

    base=https://github.com/docker/machine/releases/download/v0.16.2 &&curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine && mv /tmp/docker-machine /usr/local/bin/docker-machine &&

    chmod +x /usr/local/bin/docker-machine

    这是因为没有安装virtualbox虚拟机,如下,先设置yum源,生成缓存。

    yum安装virtualbox

    在创建虚拟机的时候报错

    输入/sbin/vboxconfig检查配置,可以发现内核一些模块未安装,按照提示中的指引按照。

    yum install gcc make perl

    yum install kernel-devel-3.10.0-1160.31.1.e17.x86_64

     

    如果你的宿主机上的软件为vmware要勾选下图选项

     

     

     

     

    然后再到https://github.com/boot2docker/boot2docker/releases/

    下载boot2docker.iso文件放到/root/.docker/machine/cache下。

    没有就创建。

    1.建立跨主机网络

    首先使用docker machine创建一个虚拟机作为manager节点

    查看虚拟机的环境变量等信息,包括虚拟机的IP地址

    然后再创建一个节点作为work节点

    查看虚拟机

    目前两台虚拟机是没有联系的,实际生产中是使用物理机或者是云主机作为集群机器的,在这里使用的时machine创建的,还可以使用docker-machine ssh命令连接虚拟机。

    将manager1加入集群

    用--listen-addr指定监听的IP与端口,实际的Swarm命令格式如下:

    docker swarm init --listen-addr <MANGER-IP>:<PORT>

    注意在machine创建的虚拟机才需要使用docker machine,目前docker machine正在被丢弃了。在这里我们使用它来建立虚拟机。并不是说swarm集群非得使用它。也就是说它就类似vmware软件一样,你也可以在vmware上建立多台虚拟机组成一个swarm集群,但是显然这个比较麻烦多了。因为还需要自己配置主机。

    生产中实际是使用物理机和云主机来搭建swarm集群。

    使用上面的token接下来把work1也加入集群。:

    上面在join命令中可以添加—listen-addr $WORKER1_IP:2377作为监听设备,因为有时候可能会遇到把一个work节点提升为manager节点的可能,在这里就不需要了。

    注意:在遇到双网卡的时候。可以指定使用一个IP,不然可能会报错。

     

    初始化成功后。现在我们新建了一个有两个节点的"集群",进入其中一个管理节点,使用Docker Node命令来查看节点信息:

    现在每个节点都归属于swarm,并都处在待机状态。Manager1是领导者,work1是工人。

    我们继续创建虚拟机manager2,worker2,worker3,现在共有五个虚拟机,使用docker-machine ls查看

    把其余虚拟机加入集群

    注意manager2是作为manager的级别加入集群,需要获取manager的token,如果是作为worker节点就需要获取worker节点的token。如下

    查看swarm集群的信息。

     

    还可以把宿主机加入到集群中,需要关闭宿主机防火墙,如下

     

    可以看到宿主机作为manager加入集群了,意味着在宿主机上就可以去管理集群了,不用再使用docker-machine ssh了。

    如果宿主机想要离开集群,则使用docker swarm leave ,manager节点需要—--force参数然后在集群中宿主机就会变为down状态,然后docker node rm 节点ID 去除这个节点即可。

    查看网络

     

    可以看到在swarm上默认已经有了一个名为ingress的overlay网络,默认在swarm里使用,我们新建一个overlay网络。

     

    现在一个跨主机的网络已经搭建好了,目前是待机状态。

     

    2.跨主机网络上部署应用

    新建的节点是没有镜像的,需要的话要逐一pull到节点中。

    使用docker-machine ssh manager1 docker pull nginx:alpine

    每个节点执行一次,然后去查看镜像是否存在即可。

     

    接下来我们在上面的虚拟机中部署nginx服务,

    查看服务状态

    查看helloworld服务详情

    可以看到nginx运行在worker1和manager2节点上。

    记住上面的名称,现在看看两个容器是否互通。

    首先使用machine进入manager2节点,然后使用docker exec -i命令进入容器中去ping运行在worker1的容器。

    然后进入worker1反过来ping

    可以看到是互通的。

    还可以在虚拟机ping另外虚拟机上的容器,不过延迟明显变高。

    从网络模型结构图中可以看到,容器之间互ping属于同一个子网的操作,因此ping值不高;而使用虚拟机内部的ping 命令去测试时相当于去另一个网络的访问,延迟就高了很多,尽管它们的物理地址都是同一个地点。

    Docker Network的overlay网络模型结构如图

    跨主机的两个容器C和E实际处于一个网络。

    删除helloworld服务

     

     

     

     

     

     

  5. 现在来搭建一个nginx集群。并且可访问

    查看服务运行状态

     

    现在做一个实验,杀死其中的一个节点。

    先查看容器所在节点

    其运行在manager1和manager2节点

    杀死manager1上的容器看看

    发现虽然manager1上的容器虽然退出了,但是在worker2上启动了nginx,保持了副本为2.

    还可以增加副本

    以上是应用集群的一个简单应用,还有更复杂的情况。

  6. Shipyard是一个基于Web的Docker管理工具, 支持多主机,可以把多个Docker主机上的容器进行统一管理、可以查看镜像、甚至构建镜像,并提供RESTful等。如果Shipyard要管理和控制Docker主机的话,那么需要先修改Docker主机上的默认配置,使其支持远程管理。

    因此项目代码已经不被维护了。在这里不再说明。

     

     

  7. Portainer是一个全面的Docker UI监控管理工具,很重要的一点是它极其轻量只有4MB大小,Portainer可以作为Docker引擎或Swarm群集上的轻量级Docker容器运行。因此,部署Portainer只需要在Docker机器上运行一个命令。

    安装

    现在访问9000端口。自行设置密码大于8位,然后连接本地环境即可,如下

    左边列表是资源栏,镜像,容器,等都可以查看。功能还是可以的,可以查看swarm集群,远程docker的资源,还可以拉取镜像,一般的维护功能是够的。

    以上是单机版,还可以进行集群管理。详细就不再说明。

     


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM