2

Docker Swarm概述

Docker Swarm是Docker官方提供的集群工具。它可以将一些关联的Docker主机转变成一个虚拟Docker主机。因为Docker Swarm符合Docker API的标准,任何已经可以与Docker守护进程通信的工具都可以使用Swarm来透明地扩展到多个主机。支持工具包括:

  • Dokku

  • Docker Compose

  • Docker Machine

  • Jenkins

当然,Docker客户端本身也是被支持的,而Docker Swarm支持的工具还不止这些。
如同其他的Docker项目,Docker Swarm依然遵循着“swap, plug, and play”的原则。

理解Swarm集群创建

创建一个Swarm集群的第一步是从网上拉取Docker Swarm镜像。然后,你可以使用Docker配置Swarm manager和所有节点运行Docker Swarm。步骤:

  • 在每个节点上打开一个TCP端口用于跟Swarm manager通信

  • 在每个节点上安装Docker

  • 创建和管理TLS证书以保护集群

对于有经验的管理员或者程序员来说,手动安装Docker Swarm的方法是最好的。另外也可以用docker-machine来安装。使用Docker Machine可以快速的在云供应商或者你自己的数据中心安装Docker Swarm。如果你的本地主机已经安装了虚拟机,那么你可以在本地环境中使用Docker Machine快速的构建和浏览Docker Swarm。这种方法会自动生成证书以保护你的集群。
如果是第一次使用Swarm,官方建议先使用Docker Machine。这里的Docker Machine是Docker官方提供的Docker Toolbox中的工具之一,主要适用于Mac和Windows系统。而本人这次学习是使用的Ubuntu系统和Ubuntu Server系统,所以这里我没有用此方法,想要了解此法请参照官方指南
使用Docker Swarm的发现服务功能(Discovery services)可以动态的配置和管理容器的服务。想要了解更多关于Discovery services的信息请参照官方文档
还有一些其他的相关信息:如Docker Swarm API和Advanced Scheduling(包含Docker Swarm strategiesSwarm filters)

安装Docker Swarm的方式

  • 安装Docker Swarm有两种方式:

    • 直接以swarm为镜像模板启动容器;

    • 在系统中安装swarm的二进制可执行文件。

  • 官网也列举出了这两种方法的优缺点:

    • 以swarm镜像启动容器:

      • 无需在系统中安装可执行的二进制文件;

      • 用docker run命令每次都可以获取并运行最近版本的镜像;

      • 容器是Swarm与主机环境相隔离,无需维护shell的路径和环境。

    • 在系统中安装swarm:

      • Swarm项目的开发者在测试代码变更的过程中,无需在运行该二进制文件前进行容器化(“containerizing”)操作。

因此,官方的推荐的方式也是以Swarm镜像启动容器的方式,而且官方给出的指导文档也都是采用的此种方法。

构建Swarm集群

关于Swarm集群的构建,官方依然给了两种

因为习惯了Hyper-v,如果要使用第一种方法必须要替换为Oracle VM VirtualBox(点击了解更多),这里计划是用Hyper-v创建虚拟机,然后安装Ubuntu Server系统,然后对第二种方法进行实践。这里只简单提一下第一种方法的步骤

  1. 安装Docker Toolbox(Install Docker Toolbox);

  2. 创建三个虚拟机运行Docker Engine(Create three VMs running Docker Engine);

  3. 创建一个Swarm发现服务的token(Create a Swarm discovery token);

  4. 创建Swarm的管理者和节点(Create the Swarm manager and nodes);

  5. 管理Swarm(Manage your Swarm);

每一步的具体操作请参考Docker的官方文档
下面主要演示Docker Swarm在Linux系统中的使用,而官方文档中用到的是AWS(Amazon Web Services)平台,这里我们有选择性的参照官方文档继续自己的操作。本次示例中用到了5个host,那么这里就创建5个虚拟机。

clipboard.png

在这里我的
Docker01 和 Docker02 分别对应 manager0 和 manager1;
Docker04 和 Docker05 分别对应 node0 和 node1;
Docker03 对应 consul0;

  • 创建虚拟机

  • 安装Ubuntu 16.04/15.04 Server (64-bit)系统

  • 开启并配置ssh服务

  • 安装Docker

  • 配置环境;
    这里的配置环境主要是使用私有仓库的配置和使用,请参照文章:批量上传镜像到私有仓库

    # 在客户端主机创建文件夹(DomainName:Port例如example.com:9527)
    mkdir -p /etc/docker/certs.d/DomainName:Port
    # 先将ca.crt文件传到客户端主机
    # 在ca.crt的当前目录下将该证书复制到上面创建的文件夹
    cp ca.crt /etc/docker/certs.d/DomainName:Port/
    # 重启docker服务
    service docker restart
    # 接下来就可以从私有仓库拉取镜像或向其上传镜像了。
    
  • 建立了一个发现服务的后端;
    在这里,你需要创建一个及其简单的发现服务的后台,Swarm集群的管理者和节点通过这个后台进行身份验证,从而成为集群的一员。Swarm集群的管理者也会利用这些信息去判断哪些节点能够运行容器。为了简单起见,您要在同一主机Swarm集群的管理者主机上运行一个consul守护进程。

    # 操作对象manager0和consul0
    # 命令
    docker run -d -p 8500:8500 --name=consul swarm/consul -server -bootstrap
    
  • 创建Swarm集群;
    在创建完成发现服务的后台之后就可以开始创建集群的管理者了。接下来会创建两个Swarm集群的管理者,第一个启动的管理者将会成为Swarm集群的主管理者(primary manager)。也有文章称其为master,但那种说法已经被废弃。第二个启动的管理者可以看作是备胎(replica),一旦主管理者挂掉,那么备胎将升级为主管理者。

    # 在高可用的Swarm集群中创建主管理者
    # 操作对象 manager0 和 consul0
    # <manager0_ip> 和 <consul_ip>相同
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
    
    # 操作对象 manager1
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://172.30.0.161:8500
    
    # 操作对象 node0 和 node1
    docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
    
  • 操作Swarm集群;

    # 获取集群的管理者和节点的信息
    # 操作对象 manager0 和 consul0
    docker -H :4000 info
    
    # 在Swarm集群中运行应用
    docker -H :4000 run hello-world
    
    # 查询Swarm集群的哪个节点在运行该应用
    docker -H :4000 ps
  • 测试Swarm集群的故障;

    # 获取swarm容器的id或名称
    # 操作对象 manager0
    docker ps
    
    # 删除或关闭当前的主管理者 manager0
    docker rm -f <id_name>
    
    # 创建或启动Swarm集群管理者 manager0
    docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500
    
    # 查看该容器的日志
    sudo docker logs <id_name>
    
    # 获取集群管理者和节点的信息
    docker -H :4000 info
    

Ably
603 声望44 粉丝

Let everything around us become better


引用和评论

0 条评论