使用Docker Swarm 0.2.0进行集群

Docker Swarm 0.2.0Docker 1.6的重要更新之一。 Docker Swarm解决了Docker的基本限制之一,即容器只能在单个Docker主机上运行。 Docker Swarm是Docker的本机集群。 它将Docker主机池变成单个虚拟主机。

码头工人鲸鱼透明

本技术提示将展示如何使用Docker Swarm在多个主机之间创建集群。

来自Container Camp的 @aluzzardi@vieux很好地介绍了Docker Swarm:

Docker Swarm的关键组件

docker-swarm-cluster

Swarm Manager :Docker Swarm有一个MasterManager ,它是一个预定义的Docker主机,并且是所有管理的单点。 当前,集群中仅允许管理器的一个实例。 这是用于高可用性体系结构的SPOF,在将来的Swarm版本#598中将允许其他管理器。

群节点 :容器部署在其他Docker主机的节点上。 管理器必须可以访问每个Swarm节点,每个节点必须侦听相同的网络接口(TCP端口)。 每个节点运行一个节点代理 ,该代理注册引用的Docker守护程序,对其进行监视,并使用该节点的状态更新发现后端 。 容器在节点上运行。

调度程序策略 :可以应用不同的调度程序策略binpackspreadrandom )来选择最佳节点来运行容器。 默认策略是spread ,它为最少数量的运行容器优化了节点。 过滤器有多种,例如约束亲和力 。 这应该允许一个体面的调度算法。

节点发现服务 :默认情况下,Swarm使用基于Docker Hub的托管发现服务,使用令牌来发现属于集群的节点。 但是etcd,领事和zookeeper也可以用于服务发现。 如果无法访问Internet,或者您在封闭的网络中运行安装程序,则此功能特别有用。 作为一种新发现的后端可以创建在这里解释 。 将托管的发现服务放在防火墙内部将很有用,并且#660将对此进行讨论。

标准Docker API :Docker Swarm提供了标准Docker API,因此与单个Docker主机通信的任何工具现在都可以无缝扩展到多个主机。 这意味着,如果您使用的是通过Docker CLI配置多个Docker主机的Shell脚本,则同一CLI现在可以与Swarm集群通信,而Docker Swarm将充当代理并在集群上运行它。

还有许多其他概念,但是这些是主要概念。

TL; DR:这是一个简单的脚本,它将创建一个具有主节点和两个节点的样板集群:

echo "Creating cluster ..."
TOKEN=`docker run swarm create`
echo "Got the token " $TOKEN
echo "Creating Swarm master ..."
docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$TOKEN swarm-master
echo "Creating Swarm node 01 ..."
docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-01
echo "Creating Swarm node 02 ..."
docker-machine create -d virtualbox --swarm --swarm-discovery token://$TOKEN swarm-node-02

现在让我们深入研究细节!

创建群群集

创建一个Swarm集群,如下所示:

~> docker run swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from swarm
dc2cace3cb9c: Pull complete 
dc2cace3cb9c: Download complete 
132dac22a0c2: Download complete 
c578e06f7812: Download complete 
1dfbc304fc7f: Download complete 
9b5a856b703d: Download complete 
282cd8d4f06e: Download complete 
96b8c18d1208: Download complete 
511136ea3c5a: Download complete 
Status: Downloaded newer image for swarm:latest
117c8d19ba140d7ba3259aae9012e22f

此命令返回一个令牌,并且是唯一的集群ID。 稍后在创建主节点和节点时将使用它。 如前所述,此群集ID由Docker Hub上的托管发现服务返回。 请确保立即记下该群集ID,因为以后无法列出它。 #661应该解决此问题。

创建虫群大师

Swarm与Docker Machine完全集成,因此这是在OSX上入门的最简单方法。

  1. 将Swarm master创建为:
    ~> docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-master
    INFO[0000] Creating SSH key...                          
    INFO[0000] Creating VirtualBox VM...                    
    INFO[0005] Starting VirtualBox VM...                    
    INFO[0006] Waiting for VM to start...                   
    INFO[0060] "swarm-master" has been created and is now the active machine. 
    INFO[0060] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-master)"

    --swarm使用Swarm配置计算机,-- --swarm-master将创建的计算机配置为Swarm master。 确保将token://之后的群集ID替换为上一步中获得的ID。 Swarm主服务器创建与Docker Hub上的托管服务进行对话,并通知已在集群中创建了主服务器。

    应该有一个使现有机器成为Swarm master的选项。 报告为#1017

  2. 将所有正在运行的计算机列出为:
    ~> docker-machine ls
    NAME           ACTIVE   DRIVER       STATE     URL                         SWARM
    swarm-master   *        virtualbox   Running   tcp://192.168.99.108:2376   swarm-master (master)

    请注意,如何将swarm-master标记为master。 似乎群集名称是从主机名称派生的。 应该有一个选项来指定集群名称,可能是在集群创建期间指定的。 报告为#1018

  3. 连接到这个新创建的母版,并找到有关它的更多信息:
    ~> eval "$(docker-machine env swarm-master)"
    ~> docker info
    Containers: 2
    Images: 8
    Storage Driver: aufs
     Root Dir: /mnt/sda1/var/lib/docker/aufs
     Backing Filesystem: extfs
     Dirs: 12
     Dirperm1 Supported: true
    Execution Driver: native-0.2
    Kernel Version: 3.18.11-tinycore64
    Operating System: Boot2Docker 1.6.0 (TCL 5.4); master : a270c71 - Thu Apr 16 19:50:36 UTC 2015
    CPUs: 8
    Total Memory: 999.4 MiB
    Name: swarm-master
    ID: UAEO:HLG6:2XOF:QQH7:GTGW:XW6K:ZILW:RY57:JSEY:2PHI:4OHE:QMVW
    Debug mode (server): true
    Debug mode (client): false
    Fds: 25
    Goroutines: 38
    System Time: Thu Apr 23 02:15:55 UTC 2015
    EventsListeners: 1
    Init SHA1: 9145575052383dbf64cede3bac278606472e027c
    Init Path: /usr/local/bin/docker
    Docker Root Dir: /mnt/sda1/var/lib/docker
    Username: arungupta
    Registry: [https://index.docker.io/v1/]
    Labels:
     provider=virtualbox

创建群节点

  1. 创建一个群集节点,如下所示:
    ~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-node-01
    INFO[0000] Creating SSH key...                          
    INFO[0000] Creating VirtualBox VM...                    
    INFO[0006] Starting VirtualBox VM...                    
    INFO[0006] Waiting for VM to start...                   
    INFO[0070] "swarm-node-01" has been created and is now the active machine. 
    INFO[0070] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-node-01)"

    节点创建再次与Docker Hub上的托管服务进行对话,并加入先前创建的集群。 这由--swarm-discovery token://...指定,并指定之前获得的集群ID。

  2. 创建另一个Swarm节点,如下所示:
    ~> docker-machine create -d virtualbox --swarm --swarm-discovery token://117c8d19ba140d7ba3259aae9012e22f swarm-node-02
    INFO[0000] Creating SSH key...                          
    INFO[0000] Creating VirtualBox VM...                    
    INFO[0006] Starting VirtualBox VM...                    
    INFO[0006] Waiting for VM to start...                   
    INFO[0061] "swarm-node-02" has been created and is now the active machine. 
    INFO[0061] To point your Docker client at it, run this in your shell: eval "$(docker-machine env swarm-node-02)"
  3. 列出所有现有的Docker机器:
    ~> docker-machine ls
    NAME            ACTIVE   DRIVER       STATE     URL                         SWARM
    mydocker                 virtualbox   Running   tcp://192.168.99.107:2376   
    swarm-master             virtualbox   Running   tcp://192.168.99.108:2376   swarm-master (master)
    swarm-node-01            virtualbox   Running   tcp://192.168.99.109:2376   swarm-master
    swarm-node-02   *        virtualbox   Running   tcp://192.168.99.110:2376   swarm-master

    这是集群的一部分机器在具有集群的名称SWARM列,否则为空白。 例如, mydocker是一台独立的计算机,其中所有其他计算机都是swarm-master集群的一部分。 Swarm主机也由SWARM列中的(master)标识。

  4. 连接到Swarm集群并找到有关它的一些信息:
    ~> eval "$(docker-machine env --swarm swarm-master)"
    ~> docker info
    Containers: 4
    Strategy: spread
    Filters: affinity, health, constraint, port, dependency
    Nodes: 3
     swarm-master: 192.168.99.108:2376
      └ Containers: 2
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB
     swarm-node-01: 192.168.99.109:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB
     swarm-node-02: 192.168.99.110:2376
      └ Containers: 1
      └ Reserved CPUs: 0 / 8
      └ Reserved Memory: 0 B / 1.025 GiB

    有3个节点-1个Swarm主节点和2个Swarm节点。 此群集中总共有4个容器在运行–主节点和每个节点上有一个Swarm代理,主节点上还有一个额外的swarm-agent-master master。 可以通过连接到主数据库并列出所有容器来验证这一点:

    ~> eval "$(docker-machine env swarm-master)"
    ~> docker ps
    CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                              NAMES
    458c58f93a2b        swarm:latest        "/swarm join --addr    19 minutes ago      Up 19 minutes       2375/tcp                           swarm-agent          
    0c80a04859ba        swarm:latest        "/swarm manage --tls   19 minutes ago      Up 19 minutes       2375/tcp, 0.0.0.0:3376->3376/tcp   swarm-agent-master
  5. 配置Docker客户端以连接到Swarm集群并检查正在运行的容器列表:
    ~> eval "$(docker-machine env --swarm swarm-master)"
    ~> docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

    正如预期的那样,群集中没有运行任何应用程序容器。

  6. 列出集群中的节点为:
    ~> docker run swarm list token://117c8d19ba140d7ba3259aae9012e22f
    192.168.99.108:2376
    192.168.99.109:2376
    192.168.99.110:2376

随后的博客将展示如何在此群集上的主机之间运行多个容器,并研究不同的调度策略。

Swarm尚未与Docker Compose完全集成。 但是真正酷的是,除了容器之外,我还可以在docker-compose.yml指定所有Docker Machine描述。 然后docker-compose up -d将设置集群并在该集群中运行容器。

翻译自: https://www.javacodegeeks.com/2015/04/clustering-using-docker-swarm-0-2-0.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值