您的位置:首页 > 运维架构 > Docker

搭建Docker Swarm集群实战(二)(服务发现使用consul)

2017-10-07 15:54 1206 查看
注意:

docker在版本1.12之后,已经将swarm的部分集成在docker里面了,所以也就不需要依赖第三方的东西了。

所以如果不是为了有趣了解一下的话,请直接转到本系列的第三篇开始=》搭建Docker Swarm集群实战(三)(swarm mode)

个人建立的Docker爱好者交流QQ群:472149402,欢迎大家来此交流经验和问题,一起成长。

架构图

consul服务(1号机上)

1个swarm的master(2号机上)

2个swarm的node(3号机,4号机上)

1,2,3,4号机都是一个局域网LAN内部(原因是他们的eth1设备都和宿主机进行了virtual box的host-only)。

1号机在该网段内IP:192.168.99.101

2号机在该网段内IP:192.168.99.102

3号机在该网段内IP:192.168.99.103

4号机在该网段内IP:192.168.99.104

最后的效果图如下:

$ docker-machine ls
NAME             ACTIVE   DRIVER       STATE     URL                         SWARM                   DOCKER        ERRORS
consul-machine   -        virtualbox   Running   tcp://192.168.99.101:2376                           v17.09.0-ce
swarm-master     -        virtualbox   Running   tcp://192.168.99.102:2376   swarm-master (master)   v17.09.0-ce
swarm-node-01    -        virtualbox   Running   tcp://192.168.99.103:2376   swarm-master            v17.09.0-ce
swarm-node-02    -        virtualbox   Running   tcp://192.168.99.104:2376   swarm-master            v17.09.0-ce


贴一个官方的架构图,我的只是演示这个架构的一小部分。



开始操作

创建2号机以及把2号机的docker host设置为swarm master

docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-master


解释参数时刻:

* –swarm表示这个docker host需要成为swarm的一员。

* –swarm-master表示这个docker host的角色是swarm的master

* –swarm-discovery表示swarm的服务发现使用什么模式,这里使用consul服务发现作为swarm-discovery。

* cluster-store指定集群的信息存储的位置,这里利用consul的键值存储

* cluster-advertise指定了本docker host对外公示的ip地址和端口,如果对于为什么是eth1,这个就和网络有关了,可以参考这张图。https://github.com/wuzimei/docker-learning/blob/master/host-virtual-host-docker-network.png?raw=true

* 最后的swarm-master是这个docker host的名称

走起

$ docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-master
Running pre-create checks...
Creating machine...
(swarm-master) Copying /Users/jiandaojiao/.docker/machine/cache/boot2docker.iso to /Users/jiandaojiao/.docker/machine/machines/swarm-master/boot2docker.iso...
(swarm-master) Creating VirtualBox VM...
(swarm-master) Creating SSH key...
(swarm-master) Starting the VM...
(swarm-master) Check network to re-create if needed...
(swarm-master) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Configuring swarm...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env swarm-master


登录到2号机上偷窥一下吧。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
swarm               latest              2569518fadd0        3 weeks ago         15.77 MB

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                              NAMES
a52c4529773e        swarm:latest        "/swarm join --advert"   3 minutes ago       Up 3 minutes        2375/tcp                           swarm-agent
3ac1440eea97        swarm:latest        "/swarm manage --tlsv"   3 minutes ago       Up 3 minutes        2375/tcp, 0.0.0.0:3376->3376/tcp   swarm-agent-master


创建3号机和4号机(作为swarm的node)

docker-machine create -d virtualbox --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-01

docker-machine create -d virtualbox --swarm --swarm-discovery="consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-store=consul://$(docker-machine ip consul-machine):8500" --engine-opt="cluster-advertise=eth1:2376" swarm-node-02


确认集群

$ eval $(docker-machine env --swarm swarm-master)


注意上面的语句有–swarm。

然后你可以尝试一下docker info, 看看和以前是不是不一样了。

也可以尝试docker ps -a

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                                     NAMES
ab5753fb0680        swarm:latest        "/swarm join --advert"   36 minutes ago      Up 36 minutes               2375/tcp                                  swarm-node-02/swarm-agent
9812c1229dbf        swarm:latest        "/swarm join --advert"   44 minutes ago      Up 44 minutes               2375/tcp                                  swarm-node-01/swarm-agent
a52c4529773e        swarm:latest        "/swarm join --advert"   55 minutes ago      Up 55 minutes               2375/tcp                                  swarm-master/swarm-agent
3ac1440eea97        swarm:latest        "/swarm manage --tlsv"   56 minutes ago      Up 56 minutes               2375/tcp, 192.168.99.102:3376->3376/tcp   swarm-master/swarm-agent-master


这个时候你docker run一个随便什么容器的话,swarm master会在某一个node上启动这个容器。

好奇的你也可以尝试一下docker network ls等命令。

总结:

每次需要控制docker的容器的时候,就以swarm方式连接到swarm master上。(eval $(docker-machine env –swarm swarm-master))

docker ps -a可以查看所有容器的状态

docker run可以启动容器,容器host在哪个docker host上是会集群自动决定的。

下节预告

在写完这篇之后,才发现这种swarm的方式已经是比较旧的方式了。在docker版本1.12之后, 官方推荐使用新的swarm mode。 那下一次正好说一下,新的swarm mode如何搭建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: