Docker Swarm 0.2.0是Docker 1.6的重要更新之一。 Docker Swarm解决了Docker的基本限制之一,即容器只能在单个Docker主机上运行。 Docker Swarm是Docker的本机集群。 它将Docker主机池变成单个虚拟主机。
本技术提示将展示如何使用Docker Swarm在多个主机之间创建集群。
来自Container Camp的 @aluzzardi和@vieux很好地介绍了Docker Swarm:
Docker Swarm的关键组件
Swarm Manager :Docker Swarm有一个Master或Manager ,它是一个预定义的Docker主机,并且是所有管理的单点。 当前,集群中仅允许管理器的一个实例。 这是用于高可用性体系结构的SPOF,在将来的Swarm版本#598中将允许其他管理器。
群节点 :容器部署在其他Docker主机的节点上。 管理器必须可以访问每个Swarm节点,每个节点必须侦听相同的网络接口(TCP端口)。 每个节点运行一个节点代理 ,该代理注册引用的Docker守护程序,对其进行监视,并使用该节点的状态更新发现后端 。 容器在节点上运行。
调度程序策略 :可以应用不同的调度程序策略 ( binpack
, spread
和random
)来选择最佳节点来运行容器。 默认策略是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上入门的最简单方法。
- 将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 。
- 将所有正在运行的计算机列出为:
~> 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 。 - 连接到这个新创建的母版,并找到有关它的更多信息:
~> 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
创建群节点
- 创建一个群集节点,如下所示:
~> 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。 - 创建另一个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)"
- 列出所有现有的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)
标识。 - 连接到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
- 配置Docker客户端以连接到Swarm集群并检查正在运行的容器列表:
~> eval "$(docker-machine env --swarm swarm-master)" ~> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
正如预期的那样,群集中没有运行任何应用程序容器。
- 列出集群中的节点为:
~> docker run swarm list token://117c8d19ba140d7ba3259aae9012e22f 192.168.99.108:2376 192.168.99.109:2376 192.168.99.110:2376
随后的博客将展示如何在此群集上的主机之间运行多个容器,并研究不同的调度策略。
- 使用Swarm扩展Docker有很多细节。
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