本文讲的是Docker Swarm入门:启动Swarm管理者及代理【编者的话】在上一篇文章中开始介绍Docker Swarm入门,并已建好了令牌,下面让我们开始启动管理者容器,这是一切的基础。
启动Swarm管理者及代理
首先,启动Swarm管理者,然后创建代理加入Swarm集群。这两步都在上一篇启动“Swarm”容器时已经完成,下面将使用不用的参数启动集群。由于管理者已经是‘激活’节点,所以可使用以下命令创建Swarm 集群:
$ docker run -d -p 3376:3376 -t -v ~/.docker/machine/machines/manager:/certs:ro swarm manage -H 0.0.0.0:3376 --tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/server.pem --tlskey=/certs/server-key.pem token://7c14cbf2a86ecd490a7ea7ae4b795a6b
使用以下配置运行Swarm 集群:
- -d (or –detach):通过后台运行方式运行Swarm容器,并在启动后输出容器ID
- -t:分配一个伪终端的输出
- -p:映射Docker容器的3376端口到Docker主机(你的笔记本)的3376端口,这是容器命令网络连接的默认端口
- -v:使用只读方式 (ro),将容器的本地卷 (~/.docker/machine/machines/manager) 挂载到指定路径(/certs)
- 令牌:这就是在上篇中已创建的发现令牌
设置中所面临最大的挑战是设置正确的证书路径。不同的Docker版本及操作系统,证书存放的路径不同。在撰写本文时,Macs环境下,Docker会在home目录下创建一个.docker的文件夹。当我们创建管理者虚拟机时,将在以下路径创建配置文件:machine/machines/manager。
若在启动过程中遇到问题需找到server.key 或server-key.pem文件。可在Docker配置中找到这些文件,便可修改相应的卷挂载路径。
管理者启动后,下一步是启动代理。若需要修改激活的Docker主机为Agent1,可使用如下命令:
$ eval $(docker-machine env agent1)
此命令是告诉Docker客户端,将所有的Docker命令到发送给‘Agent1’主机上的Docker引擎。下面让我们启动Agent1:
$ docker run -d swarm join --addr=$(docker-machine ip agent1):2376 token://7c14cbf2a86ecd490a7ea7ae4b795a6b Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm eada7ab697d2: Pull complete afaf40cb2366: Pull complete 7495da266907: Pull complete a3ed95caeb02: Pull complete Digest: sha256:12e3f7bdb86682733adf5351543487f581e1ccede5d85e1d5e0a7a62dcc88116 Status: Downloaded newer image for swarm:latest 99c5ec703dc3230fcf769eb13e639079803ee36c33447a0290a2fb7ffe5e7952
此命令同上一个命令类似,也是启动Docker Swarm容器,但这次是“join”模式,运行在detached方式下(-d)并传递两个参数:
- addr:标识IP地址及端口,用来通知管理者代理的存在;
- 令牌:就是之前创建的发现令牌,用来启动管理者
第二个代理也以此类推:
$ eval $(docker-machine env agent2) $ docker run -d swarm join --addr=$(docker-machine ip agent2):2376 token://7c14cbf2a86ecd490a7ea7ae4b795a6b Unable to find image 'swarm:latest' locally latest: Pulling from library/swarm eada7ab697d2: Pull complete afaf40cb2366: Pull complete 7495da266907: Pull complete a3ed95caeb02: Pull complete Digest: sha256:12e3f7bdb86682733adf5351543487f581e1ccede5d85e1d5e0a7a62dcc88116 Status: Downloaded newer image for swarm:latest 0b16ee511399c27d849c6a6c628822375c27755b14719b5295c9038f97ede72a
至此,管理者和两个代理都已启动。下面开始配置连接Docker Swarm 管理者的Docker客户端,并查看环境参数。首先设置DOCKER_HOST环境变量来指向管理者Docker主机:
$ DOCKER_HOST=$(docker-machine ip manager):3376
下面的例子中使用docker-machine的IP命令查找管理者主机的IP地址。同样的,Windows操作系统可执行SET DOCKER_HOST来配置环境变量。只要有DOCKER_HOST环境变量,便可通过执行以下命令查看Swarm集群的相关信息:
$ docker info Containers: 2 Running: 2 Paused: 0 Stopped: 0 Images: 2 Server Version: swarm/1.2.2 Role: primary Strategy: spread Filters: health, port, containerslots, dependency, affinity, constraint Nodes: 2 agent1: 192.168.99.101:2376 - ID: RDNQ:VD3I:AZPE:LSWW:7NND:XV7C:KHGH:5KR5:MZHG:4I7H:7RMU:XGQG - Status: Healthy - Containers: 1 - Reserved CPUs: 0 / 1 - Reserved Memory: 0 B / 1.021 GiB - Labels: executiondriver=, kernelversion=4.4.8-boot2docker, operatingsystem=Boot2Docker 1.11.1 (TCL 7.0); HEAD : 7954f54 - Wed Apr 27 16:36:45 UTC 2016, provider=virtualbox, storagedriver=aufs - Error: (none) - UpdatedAt: 2016-05-22T19:03:35Z - ServerVersion: 1.11.1 agent2: 192.168.99.102:2376 - ID: DXN7:FLLA:RMDW:HSPS:WT74:YM2I:CM3G:QBY7:FR7G:4WEO:LJ72:XB6L - Status: Healthy - Containers: 1 - Reserved CPUs: 0 / 1 - Reserved Memory: 0 B / 1.021 GiB - Labels: executiondriver=, kernelversion=4.4.8-boot2docker, operatingsystem=Boot2Docker 1.11.1 (TCL 7.0); HEAD : 7954f54 - Wed Apr 27 16:36:45 UTC 2016, provider=virtualbox, storagedriver=aufs - Error: (none) - UpdatedAt: 2016-05-22T19:03:32Z - ServerVersion: 1.11.1 Plugins: Volume: Network: Kernel Version: 4.4.8-boot2docker Operating System: linux Architecture: amd64 CPUs: 2 Total Memory: 2.042 GiB Name: 77d61b0fe67f Docker Root Dir: Debug mode (client): false Debug mode (server): false WARNING: No kernel memory limit support
输出信息表示目前有两个正在运行的容器(Swarm容器运行在“join”模式)作为代理,并且这些代理是健康的。注意是Docker的主机容器而非客户端应用容器,我们可以通过ps命令查看运行客户端应用的容器:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如上所料,没有任何客户端应用容器正在运行。
运行Docker容器
三个Docker主机启动后,便可启动一个Docker客户端容器。管理者主机已激活,因此Docker命令行工具发送命令给管理者。执行以下命令来启动Nginx的容器实例:
$ docker run -d -p 80:80 nginx cc6d627873f7b33f910129fafdcc5c544048cc864ef5433e667afc9a88632931
此命令通过nginx:latest镜像启动了容器,运行在detached模式下,并绑定容器的80端口到Docker主机的80端口。下面执行ps命令查看这个容器运行在哪:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc6d627873f7 nginx "nginx -g 'daemon off" 28 seconds ago Up 27 seconds 192.168.99.101:80->80/tcp, 443/tcp agent1/goofy_bassi
输出显示容器运行在Agent1。可打开连接Agent1的浏览器确认容器正在运行:
http://192.168.99.101/
如图二所示:
下面再启动一个实例来展示如何使用Docker Swarm部署第二个实例:
$ docker run -d -p 80:80 nginx $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 737d5d37d5a6 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 192.168.99.102:80->80/tcp, 443/tcp agent2/condescending_galileo cc6d627873f7 nginx "nginx -g 'daemon off" 3 minutes ago Up 3 minutes 192.168.99.101:80->80/tcp, 443/tcp agent1/goofy_bassi
Docker的ps命令显示一个实例运行在Agent1,另一个运行在Agent2上。Swarm使用了一种算法来决定每个代理运行容器的数量,并部署新的容器在运行容器数量最少的代理上。本例中Agent1上运行了1个容器,而Agent2没有运行容器,因此Swarm将新的容器发布到了Agent2。
可通过以下浏览器URL地址来测试第二个实例:
http://192.168.99.102/
恭喜你,现在有了一个Swarm管理者,两个代理,以及运行在代理上的两个容器。
清理
一旦完成以上步骤可以通过以下步骤来清理环境:
- 指定容器前的ID号可停止Docker容器:
$ docker stop 737 $ docker stop cc6 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 使用docker-machine 命令停止Docker主机:
$ docker-machine stop agent1 Stopping "agent1"... Machine "agent1" was stopped. $ docker-machine stop agent2 Stopping "agent2"... Machine "agent2" was stopped. $ docker-machine stop manager Stopping "manager"... Machine "manager" was stopped. $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Stopped Unknown agent2 - virtualbox Stopped Unknown default - virtualbox Stopped Unknown manager - virtualbox Stopped Unknown
这样您便安全的停止了Docker。
结论
本文介绍了Docker Swarm,一种Docker的原生集群解决方案,并一步一步的演示了如何建立一个本地的Docker Swarm集群。Docker Swarm提供了管理代理和运行Docker引擎主机的基本功能,并通过一组代理实现部署Docker容器的功能。当在AWS上运行Docker时, 亚马逊ECS是一种可选的方案,但如果在本地数据中心或另外的私有云环境,Swarm也是一个相当有竞争力的备选方案。
原文链接:Getting Started with Docker Swarm: Part 2(翻译:Chilly)
原文发布时间为:2016-07-30
本文作者:Chilly
本文来自合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
原文标题:Docker Swarm入门:启动Swarm管理者及代理