使用Docker Swarm运行服务并尝试缩减规模
请注意,Docker引擎的版本为1.12。
总结
在Swarm上同时运行nginx服务(nginx_sample),尝试进行缩小规模操作(使用docker service scale命令)。
命令清单
这次主要使用的命令是前半的两个。
启动新服务
docker service create -p 80:80 --name="nginx_sample" --replicas=3 nginx
将swarm节点的TCP80端口(HTTP)与nginx_sample服务的TCP80端口(HTTP)进行关联。
nginx镜像也可以使用TCP443端口(HTTPS),但本次只是一个示例,不进行设置。
确认正在启动
docker service ls
ID NAME REPLICAS IMAGE COMMAND
8ejer8lok06o nginx_sample 0/3 nginx
因为REPLICAS的值为0/3,所以还没有启动任何容器。
docker service ps nginx_sample
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
6tns1opze4dtzjdq7la1rgpvj nginx_sample.1 nginx ubuntu-001 Running Preparing 25 seconds ago
ei2hww2pdqo4rd114d6sl0tvn nginx_sample.2 nginx ubuntu-002 Running Preparing 25 seconds ago
b9tvhzi6ln5hcjhnsia6y5uyp nginx_sample.3 nginx ubuntu-003 Running Preparing 25 seconds ago
由于 DESIRED STATE 是 Running,但 CURRENT STATE 是 Preparing,所以尚未启动。
可以通过运行docker service inspect命令来获取指定服务的详细信息。
docker service inspect nginx_sample
[
{
"ID": "1uzck4r361lxi8u3zyaqa6zhf",
"Version": {
"Index": 91
},
"CreatedAt": "2016-08-13T14:47:54.266023526Z", # 作成が指示された時刻
"UpdatedAt": "2016-08-13T14:47:54.269125202Z", # 更新は行っていないのでCreatedAtに等しい
"Spec": {
"Name": "nginx_sample",
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"Mode": {
"Replicated": {
"Replicas": 3 # 指定したレプリカ数
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80
}
]
},
"Ports": [ # 指定したポートがオープンされている
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 80
}
],
"VirtualIPs": [
{
"NetworkID": "27szphefusnj2bdpq0itpfpat",
"Addr": "10.255.0.6/16"
}
]
},
"UpdateStatus": {
"StartedAt": "0001-01-01T00:00:00Z", #サービスが起動中の場合、ここが空に等しいような値になっている
"CompletedAt": "0001-01-01T00:00:00Z"
}
}
]
请注意以下事项
从DockerHub或其他互联网来源获取镜像时,要注意网络流量问题,因为每个独立的节点都会同时访问互联网。
开机后进行确认
无论访问哪一个Docker主机,都可以显示nginx的启动界面。

docker service ls
ID NAME REPLICAS IMAGE COMMAND
1uzck4r361lx nginx_sample 3/3 nginx
REPLICAS已经是3/3,集群内的3个nginx容器已经根据指定的数量启动。
docker service ps nginx_sample
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dcdngo5ibombyjuqysst4y3gf nginx_sample.1 nginx ubuntu-003 Running Running 8 minutes ago
bg39i6hrqksfle0xypkpnoouz nginx_sample.2 nginx ubuntu-002 Running Running 8 minutes ago
4nutgpvioz91oyubtjb9lgzq6 nginx_sample.3 nginx ubuntu-001 Running Running 8 minutes ago
在ubuntu-001/002/003的每个节点上,各有一个nginx容器正在运行。
启动后的整体形象

调整服务规模
因为意识到不需要三个nginx容器,所以暂时将其缩减为一个。
描述从任何节点都可以访问的容器。
docker service scale nginx_sample=1
nginx_sample scaled to 1
将复制品数量由3更改为1。
确认规模变更结果
docker service ls
ID NAME REPLICAS IMAGE COMMAND
1uzck4r361lx nginx_sample 1/1 nginx
复制品的值已经变成了1/1,并且达到了预期的结果。
docker service ps nginx_sample
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dcdngo5ibombyjuqysst4y3gf nginx_sample.1 nginx ubuntu-003 Shutdown Shutdown 2 minutes ago
bg39i6hrqksfle0xypkpnoouz nginx_sample.2 nginx ubuntu-002 Shutdown Shutdown 2 minutes ago
4nutgpvioz91oyubtjb9lgzq6 nginx_sample.3 nginx ubuntu-001 Running Running 15 hours ago
ubuntu-002(192.168.1.26)和ubuntu-003(192.168.1.29)上运行的容器已经停止。
nginx容器本身只在ubuntu-001(192.168.1.27)上运行,
但是不论访问ubuntu-002还是ubuntu-003,都会路由到nginx容器。
这归功于Ingress覆盖网络。



规模变更后的整体形象

总结
-
- swarm上でサービスを構成し、swarm外からアクセスすることができた。(-p 80:80)
-
- swarm上でサービスを構成するタスクが一つでも動作していれば各ノードを介してアクセスできた。(Ingressオーバレイネットワーク)
- swarm上でコマンド(docker service scale)を用いてサービスをスケールインさせることができた。