创建Swarm
上面创建了3个节点。计划让:
-
t1
作为manager
节点,swarm
的操作命令只能在manager
节点上执行 -
t2
和t3
作为worker
节点
可通过docker-machine
的ssh
命令无需密码登录到t1
节点:
在t1
节点创建swarm:
1
|
docker swarm init --advertise-addr 192.168.99.100
|
执行后会输出类似这样的结果:
1
2
3
|
docker swarm join \
--token SWMTKN-1-04e9uir3hzkfvog5r3idnanic1e3en3ffdtizrqondf9flus0e-46akedpdhu9upa6nmw7q6fusm \
192.168.99.100:2377
|
退出t1
,再次通过docker-machine ssh
命令登录到t2
和t3
,执行上述命令加入到t1
创建的swarm中,即:
1
2
3
|
docker swarm join \
--token SWMTKN-1-04e9uir3hzkfvog5r3idnanic1e3en3ffdtizrqondf9flus0e-46akedpdhu9upa6nmw7q6fusm \
192.168.99.100:2377
|
然后,再次登录t1
,可通过如下命令查看swarm加入的情况:
1
2
3
4
5
|
docker@t1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
0vbcfw1f5ozy74yy1wzkdgqlz t3 Ready Active
4muoqgiwxig9y4xks6ua8ssf5 * t1 Ready Active Leader
65h5he04on3n93o250fcs1nuo t2 Ready Active
|
创建服务
在t1
节点,执行命令创建服务:
1
|
docker service create -p 3000:3000 --name hello-service marshalw/hello-service:0.1.0
|
这个命令类似docker的run命令:
1
|
docker run -d -p 3000:3000 marshalw/hello-service
|
区别是,docker run
命令只在当前docker服务器上创建容器,docker service create
将在创建的swarm中创建容器。上面创建服务的命令只跑了1个服务实例:
1
2
3
|
$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
2itleggpnm14 hello-service 1/1 marshalw/hello-service
|
虽然服务只部署在swarm其中一个节点,但无论访问其中哪个节点,都可获得服务:
1
2
3
4
5
6
|
$ curl http://192.168.99.100:3000/hello/name
{"status":"OK"}
$ curl http://192.168.99.101:3000/hello/name
{"status":"OK"}
$ curl http://192.168.99.102:3000/hello/name
{"status":"OK"}
|
原因是未部署服务的节点会自动转发请求到服务所在的节点上去。
改变服务的实例数
下面命令将目前1个实例数改为3个:
1
|
docker service scale hello-service=3
|
可以通过docker service ps
命令查看具体节点上服务的状态:
1
2
3
4
5
|
$ docker service ps hello-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
cls3ozabbapthazz670s3psof hello-service.1 marshalw/hello-service t1 Running Shutdown 6 minutes ago
6jut42y57l6z7awuz9ylmk2bf hello-service.2 marshalw/hello-service t2 Running Running 6 minutes ago
8ou2s46wvibm7wc74mncrvkax hello-service.3 marshalw/hello-service t3 Running Shutdown 6 minutes ago
|
当服务实例失效后swarm自动创建新服务实例
执行:
1
|
docker service scale hello-service=2
|
让当前实例数为2。
执行:
1
2
3
4
5
|
$ docker service ps hello-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
2hx76y324601nzh4oroozyykx hello-service.1 marshalw/hello-service t3 Running Running 42 seconds ago
6jut42y57l6z7awuz9ylmk2bf hello-service.2 marshalw/hello-service t2 Running Running 9 minutes ago
...
|
发现t2
和t3
上有部署服务,停掉t3
节点:
然后在t1
上执行:
1
2
3
|
$ docker service ls
ID NAME REPLICAS IMAGE COMMAND
2itleggpnm14 hello-service 2/2 marshalw/hello-service
|
发现运行的服务实例还是2个,说明swarm的自动创建新服务实例功能是有效的。
我的 Docker 版本是 1.12,請問我跑的是一代 Swarm 還是二代 Swarm 啊?
……自己運行的 Swarm 怎麼會連自己都不知道跑的是啥?