当前位置: 首页 > 工具软件 > Swarm > 使用案例 >

部署Swarm - Deploy Swarm

许博
2023-12-01

参考文档:https://docs.docker.com/swarm/install-manual/

使用的部署环境

参考文档中是要把Swarm部署到AWS的EC2上的,没有这样的条件,所以选择在本地建立多个虚机机来搭建。
操作系统选择centos7,共建立了5个虚拟机, 为了简单起见,均使用root用户做操作。

[root@mamager1 ~]# cat /etc/hosts
192.168.221.136 manager0
192.168.221.137 manager1
192.168.221.138 consul0
192.168.221.139 node0
192.168.221.140 node1

manager0和manager1是swarm的管理结点,两个节点用来做高可用。
consul0节点是服务发现结点,部署了consul
node0和node1是资源结点

5 个节点都事先安装好了docker engine 1.12

安装docker: curl -sSL https://get.docker.com/ | sh
启动docker: docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

开始部署

配置好以上环境后,可以直接进入参考文档的 Step 4 了

Step 4. Set up a discovery backend

这一步是用来创建服务发现功能,采用了consul作为服务发现服务程序,也可以选择zookeeper,etcd。

安装consul是比较简单的,直接运行一个容器就好了。

在consul0结点上运行一下命令:

docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap

Step 5. Create Swarm cluster

Swarm的安装和运行也是比较简单的,同样是使用容器运行。

在manager0结点上运行以下命令
docker run -d -p 4000:4000 swarm manage -H :4000 –replication –advertise 192.168.221.136:4000 consul://192.168.221.138:8500

在manager1结点上运行以下命令
docker run -d -p 4000:4000 swarm manage -H :4000 –replication –advertise 192.168.221.137:4000 consul://192.168.221.138:8500

在node0结点上运行以下命令
docker run -d swarm join –advertise=192.168.221.139:2375 consul://192.168.221.138:8500

在node1结点上运行以下命令
docker run -d swarm join –advertise=192.168.221.140:2375 consul://192.168.221.138:8500

试用一下

在manager0上执行命令: docker -H :4000 info

[root@localhost ~]# docker -H :4000 info
Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 4
Server Version: swarm/1.2.4
Role: replica
Primary: 192.168.221.137:4000
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 2
 node0: 192.168.221.139:2375
  └ ID: 6UEQ:FE4C:QYPC:7EFT:CXYZ:EPDF:OYWD:5L5U:QAB2:32EW:3GYS:GZAR
  └ Status: Healthy
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 1.003 GiB
  └ Labels: kernelversion=3.10.0-327.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  └ UpdatedAt: 2016-08-02T10:10:57Z
  └ ServerVersion: 1.12.0
 node1: 192.168.221.140:2375
  └ ID: RTT2:OFYE:MWP5:GVAY:QUTG:QHZU:3AXA:OILX:UG5K:D3RM:6XJE:QX2Z
  └ Status: Healthy
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 1.003 GiB
  └ Labels: kernelversion=3.10.0-327.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  └ UpdatedAt: 2016-08-02T10:10:39Z
  └ ServerVersion: 1.12.0
Plugins:
 Volume: 
 Network: 
Swarm: 
 NodeID: 
 Is Manager: false
 Node Address: 
Security Options:
Kernel Version: 3.10.0-327.el7.x86_64
Operating System: linux
Architecture: amd64
CPUs: 8
Total Memory: 2.005 GiB
Name: cfb6647dfc11
Docker Root Dir: 
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support

在manager1上执行命令: docker -H :4000 info

[root@mamager1 ~]# docker -H :4000 info
Containers: 2
 Running: 2
 Paused: 0
 Stopped: 0
Images: 4
Server Version: swarm/1.2.4
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 2
 node0: 192.168.221.139:2375
  └ ID: 6UEQ:FE4C:QYPC:7EFT:CXYZ:EPDF:OYWD:5L5U:QAB2:32EW:3GYS:GZAR
  └ Status: Healthy
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 1.003 GiB
  └ Labels: kernelversion=3.10.0-327.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  └ UpdatedAt: 2016-08-02T10:11:33Z
  └ ServerVersion: 1.12.0
 node1: 192.168.221.140:2375
  └ ID: RTT2:OFYE:MWP5:GVAY:QUTG:QHZU:3AXA:OILX:UG5K:D3RM:6XJE:QX2Z
  └ Status: Healthy
  └ Containers: 1 (1 Running, 0 Paused, 0 Stopped)
  └ Reserved CPUs: 0 / 4
  └ Reserved Memory: 0 B / 1.003 GiB
  └ Labels: kernelversion=3.10.0-327.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), storagedriver=devicemapper
  └ UpdatedAt: 2016-08-02T10:11:43Z
  └ ServerVersion: 1.12.0
Plugins:
 Volume: 
 Network: 
Swarm: 
 NodeID: 
 Is Manager: false
 Node Address: 
Security Options:
Kernel Version: 3.10.0-327.el7.x86_64
Operating System: linux
Architecture: amd64
CPUs: 8
Total Memory: 2.005 GiB
Name: 558a052d79fa
Docker Root Dir: 
Debug Mode (client): false
Debug Mode (server): false
WARNING: No kernel memory limit support

根据Role,可以看出来,manager1是主,manager0是从,已经有两个node加入进来了,分别是node0: 192.168.221.139:2375node1: 192.168.221.140:2375

在manager1上执行以下命令,查看正在运行的容器

[root@mamager1 ~]# docker -H :4000 ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
fa5f096d9aa4        swarm               "/swarm join --advert"   47 minutes ago      Up 47 minutes       2375/tcp            node1/infallible_montalcini
7ca9201566b1        swarm               "/swarm join --advert"   About an hour ago   Up About an hour    2375/tcp            node0/compassionate_shannon

在manager1上执行以下命令,创建一个容器:

[root@mamager1 ~]# docker -H :4000 run hello-world
[root@mamager1 ~]# docker -H :4000 ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
efecac9a30e7        hello-world         "/hello"                 6 seconds ago       Exited (0) 5 seconds ago                       node0/determined_hoover
fa5f096d9aa4        swarm               "/swarm join --advert"   49 minutes ago      Up 49 minutes              2375/tcp            node1/infallible_montalcini
7ca9201566b1        swarm               "/swarm join --advert"   About an hour ago   Up About an hour           2375/tcp            node0/compassionate_shannon

可以看到 hello-world已经运行过了,但是hello-world在运行后就退出了,所以需要用 ps -a 才能看到。

高可用

参考文档的第7步是测试Swarm管理结点的高可用,挂掉主节点,从结点会切换为主

Step 7. Test Swarm failover

结论是可以用的,就不贴过程了,干掉manager1上面的swarm容器后,在mangager0上执行 docker -H :4000 info, 可以看到manager0已经变为主了。

踩过的坑

在部署的过程中,也是遇到了一些问题的,都不是大问题,很快就能解决。

  • ip地址: 发现不了结点
    因为刚开始的时候,我已经把host和ip信息写入/etc/hosts文件里面了,所以启动swarm manager和swarm ndoe的使用用的是机器名称而不是直接写的IP,这样引起的问题是,这些参数会带入到swarm的容器中,容器中是没有/etc/hosts文件的,所以就会找不到相应的服务,导致所有服务都不能正常启动

  • 防火墙: no route to host
    没有配置防火墙,导致node结点的2375端口不能被manager结点访问,所以修改了一下防火墙策略

firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --zone=dmz --add-port=2375/tcp --permanent
firewall-cmd --reload
  • docker id: prending
    我用的5个虚拟机都是直接从一个basic复制过来的,basic已经安装好docker了,所以导致了所有docker id 都是相同的。使用docker info可以看到每个docker的ID值。 结果就是,所有的结点的程序都起来了,但是从 manager1结点看,node只有一个是Healthy的,另外一个的状态一直是Prending。解决这个问题也比较简单,删除/etc/docker/key.json,重启启动docker engine和node结点上运行的swarm join容器就好了
 类似资料: