Docker Swarm的入门使用
安装swarm的最贱的方式是使用docker官网上的镜像.
root@syx-VB:~# dao pull swarm
使用下面的命令来产看swarm是否安装成功:
root@syx-VB:~# docker run --rm swarm -v
swarm version 1.2.2 (34e3da3)
在使用swarm管理集群前,需要把集群中所有的节点的docker daemon的监听方式更改为0.0.0.0:2375.有两种方式:
(1).在启动docker daemon的时候指定:
sudo docker -H 0.0.0.0:2375&
(2).直接修改Docker的配置文件(ubuntu上的是/etc/default/docker),在文件最后添加以下代码:
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
需要注意的是,一定是在所有希望被swarm管理的节点上进行的.修改之后要重启docker:
service docker restart
Docker集群管理需要使用服务发现(Discovery service backend)功能,Swarm支持以下的几种方式:DockerHub提供的服务发现功能,本地的文件,etcd,counsel,zookeeper和IP列表.
本次实验包括三台机器,IP地址分别为:
Host1:192.168.3.144;
Host2:192.168.3.172;
Host3:114.215.97.162;
为什么三台机器的IP地址有点差距呢?因为楼主想证明,就算是三台离着很远的机器也能使用swarm管理.
利用这三台机器组成一个集群,其中172这台机器充当swarm manage管理节点.
在上面三台机器上的任何一台机器上执行:
root@syx-VB:~# sudo docker run --rm swarm create
4d53d13612f3a655449eb40596a1a1ec
可以看到返回了一个ID,这个ID是全球唯一的,用来标示要管理的集群,这里可能会出现timeout的错误,你看看你的机器能不能上网,因为楼主的虚拟机在获取的时候频频出错,但是在换成了阿里云的服务器之后使用这行命令一次错误也没产生.
记住这个全球唯一的ID.因为你每次返回的ID都不一样.
这一步很简单,就是在你需要加入集群的每台主机上,执行下面的命令:
sudo docker run -rm swarm join --addr=ip_address:2375 token://4d53d13612f3a655449eb40596a1a1ec
这里的ip_address换成你自己机器的IP即可.
案例如下,在172这台机器执行的命令如下:
root@syx-VB:~# docker run --rm swarm join --addr=192.168.3.172:2375 token://4d53d13612f3a655449eb40596a1a1ec
返回的结果如下:
time="2016-05-18T11:33:03Z" level=info msg="Registering on the discovery service every 1m0s..." addr="192.168.3.172:2375" discovery="token://4d53d13612f3a655449eb40596a1a1ec"
这条命令不会自动结束,你需要按下Ctrl+C强制结束一下.
其余两台机器的命令类似.
root@syx-VB:~# docker run -d -p 2376:2375 swarm manage token://4d53d13612f3a655449eb40596a1a1ec
返回的结果是已经启动的swarm容器的ID,此时整个集群已经启动起来了.
ccb604d3d393e22bb02b4b9d4a2aa8734b95e3ad8a32626fdda2f7686c6bf128
这个时候你运行:
root@syx-VB:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ccb604d3d393 swarm "/swarm manage token:" About a minute ago Up About a minute 0.0.0.0:2376->2375/tcp naughty_boyd
能够看到,swarm已经成功启动.在执行swarm 这条命令的时候,有几点需要注意:
1.这条命令需要在充当swarm管理者的机器上执行(本例中是172这台机器).
2.swarm要以daemon的形式执行.
3.映射的端口除了2375以外的任何都行,就是不能是2375.
测试一下:
最最关键的时刻到了,这个时候你可以在任意集群的机器中使用 swarm list命令查看一下集群中的节点,比如我在144这台机器上查看这个集群中的几点有哪些:
root@syx-VB:~# docker run --rm swarm list token://4d53d13612f3a655449eb40596a1a1ec
114.215.97.162:2375
192.168.3.144:2375
192.168.3.172:2375
这里楼主发现一个问题,就是你的机器只能加入一个集群,楼主开始的时候使用swarm创建了一个集群,完全没有问题,楼主又创建乐一个新集群,发现前面的没问题,就是在测试的时候不显示内容.
第二个问题是,在测试的时候楼主想查看一下其他机器的信息,比如楼主现在在172这台机器上执行如下命令:
root@syx-VB:~# docker -H 192.168.3.144:2376 info
返回的信息如下:
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
这是什么意思,楼主还没有搞明白,如果有大神知道如何解决,希望告诉小弟,感激不尽.
还有一个问题,小弟在开启2375端口监听的时候,出现了这种错误:
root@syx-VB:~# docker -H tcp://0.0.0.0:2375 -d
Warning: '-d' is deprecated, it will be removed soon. See usage.
WARN[0000] please use 'docker daemon' instead.
WARN[0000] /!\ DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING /!\
INFO[0000] API listen on [::]:2375
INFO[0000] [graphdriver] using prior storage driver "aufs"
INFO[0000] Firewalld running: false
INFO[0001] Default bridge (docker0) is assigned with an IP address 172.17.0.1/16. Daemon option --bip can be used to set a preferred IP address
WARN[0001] Your kernel does not support swap memory limit.
INFO[0001] Loading containers: start.
..........................................WARN[0001] Failed to allocate and map port 5000-5000: Error starting userland proxy: listen tcp 0.0.0.0:5000: bind: address already in use
ERRO[0001] error locating sandbox id 8962a74abfb1fdcc00518500b659cab4bdcde4b8aaef6ae263f092f7587f2b83: sandbox 8962a74abfb1fdcc00518500b659cab4bdcde4b8aaef6ae263f092f7587f2b83 not found
WARN[0001] failed to cleanup ipc mounts:
failed to umount /var/lib/docker/containers/29c3e5ab6ac7544aead75c13bb6f183a64b502e28d228d46c8bb1ff945ff7c3a/shm: invalid argument
failed to umount /var/lib/docker/containers/29c3e5ab6ac7544aead75c13bb6f183a64b502e28d228d46c8bb1ff945ff7c3a/mqueue: invalid argument
ERRO[0001] Failed to start container 29c3e5ab6ac7544aead75c13bb6f183a64b502e28d228d46c8bb1ff945ff7c3a: failed to create endpoint registry on network bridge: Error starting userland proxy: listen tcp 0.0.0.0:5000: bind: address already in use
INFO[0001] Loading containers: done.
INFO[0001] Daemon has completed initialization
INFO[0001] Docker daemon commit=a34a1d5 execdriver=native-0.2 graphdriver=aufs version=1.9.1
^CINFO[0079] Processing signal 'interrupt'