参考文档: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 了
这一步是用来创建服务发现功能,采用了consul作为服务发现服务程序,也可以选择zookeeper,etcd。
安装consul是比较简单的,直接运行一个容器就好了。
在consul0结点上运行一下命令:
docker run -d -p 8500:8500 --name=consul progrium/consul -server -bootstrap
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:2375
和node1: 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管理结点的高可用,挂掉主节点,从结点会切换为主
结论是可以用的,就不贴过程了,干掉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 info
可以看到每个docker的ID值。 结果就是,所有的结点的程序都起来了,但是从 manager1结点看,node只有一个是Healthy的,另外一个的状态一直是Prending。解决这个问题也比较简单,删除/etc/docker/key.json
,重启启动docker engine和node结点上运行的swarm join容器就好了