尝试使用 Docker1.12 的 Swarm
我是Cloudpack大阪的佐々木。
我打算试用一下热门话题Docker 1.12。
首先,我想试试被认为是最重要的功能之一的swarm的集成。
我参考了教程(直接使用了它),尝试了搭建swarm、添加服务和进行滚动更新。
Docker Swarm 是什么?
这是将Docker节点捆绑成集群的功能。虽然以前已经存在,但从最近发布的1.12版本开始,已经与Docker本身集成,看起来更加容易使用。
环境
我已经申请了Docker for AWS的私有Beat,但还没有收到回复,由于在Docker for Mac上无法体验到集群的感觉,所以我在EC2上安装了1.12版本的Docker来尝试。
安装
因为我不太清楚在Amazon Linux上安装的方法,所以我打算参考以下步骤在CentOS7上进行安装。
然而,在这里列出的存储库网址中,默认安装的是1.11版本,因此我们需要进行以下修改。
$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/testing/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
$ sudo yum install -y docker-engine
$ sudo systemctl enable docker.service
$ sudo systemctl start docker.service
在CentOS上安装Docker 1.12,并设置三个实例的主机名为manager1、worker1和worker2。然后,设置安全组,以便实例之间可以进行通信。
教程
我按照以下教程依次尝试了一下。
创建Swarm集群
首先创建swarm集群。
在manager1上运行以下命令。
$ docker swarm init
Swarm initialized: current node (eitfugbeu426sulvjboucdidq) is now a manager.
在帮助文件中提到,如果要指定监听IP/端口,可以这样指定:
–listen-addr 10.1.1.1:2377。
如果不指定,则默认为0.0.0.0:2377。
确保自己已经作为节点添加进来。
$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
eitfugbeu426sulvjboucdidq * manager1 Accepted Ready Active Leader
向Swarm添加节点
工人1和工人2执行以下操作,并加入到swarm中。
$ docker swarm join (managerのIP):2377
This node joined a Swarm as a worker.
我将在manager1上执行以下操作,并确认worker1和2已被添加。
docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS
43mdhg1wi44him1mglr09dxsh worker1 Accepted Ready Active
8zbsnwbz0qg7e76a637ihj311 worker2 Accepted Ready Active
eitfugbeu426sulvjboucdidq * manager1 Accepted Ready Active Leader
Swarmにサービスをデプロイ
我会在manager1上执行以下操作。
docker service create --replicas 1 --name helloworld alpine ping docker.com
8oxxbwc3dzgtpuq3de5kkik88
Alpine Linuxのコンテナ1台で ping docker.comを実行すると意味になります。
确认服务正在运行。
docker service ls
ID NAME REPLICAS IMAGE COMMAND
8oxxbwc3dzgt helloworld 1/1 alpine ping docker.com
服务检查
下記のようなコマンドでサービスの状態が確認できます。
docker service inspect --pretty helloworld
ID: 8oxxbwc3dzgtpuq3de5kkik88
Name: helloworld
Mode: Replicated
Replicas: 1
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 0
ContainerSpec:
Image: alpine
Args: ping docker.com
Resources:
Reservations:
Limits:
–prettyを省略するとjson形式で出力されます。
docker service inspect helloworld
[
{
"ID": "8oxxbwc3dzgtpuq3de5kkik88",
"Version": {
"Index": 22
},
"CreatedAt": "2016-06-27T15:22:14.396375971Z",
"UpdatedAt": "2016-06-27T15:22:14.396375971Z",
"Spec": {
"Name": "helloworld",
"TaskTemplate": {
"ContainerSpec": {
"Image": "alpine",
"Args": [
"ping",
"docker.com"
]
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {},
"EndpointSpec": {
"Mode": "vip"
}
},
"Endpoint": {
"Spec": {}
}
}
]
确认容器正在哪个节点上运行。
$ docker service tasks helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
4hf91p8moi7gdvwx22c917gsf helloworld.1 helloworld alpine Running 6 minutes Running manager1
在正在运行的节点上执行以下操作,以查看容器的详细信息。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3fc9cf7c874 alpine:latest "ping docker.com" 7 minutes ago Up 7 minutes helloworld.1.4hf91p8moi7gdvwx22c917gsf
服务规模
将helloworld扩展到五个版本。
docker service scale helloworld=5
helloworld scaled to 5
确认
docker service tasks helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
4hf91p8moi7gdvwx22c917gsf helloworld.1 helloworld alpine Running 9 minutes Running manager1
4tarsvkte3of71o7755yclvlv helloworld.2 helloworld alpine Running 42 seconds Running worker1
bjzw5mhnb1lwga1ycecfetfv2 helloworld.3 helloworld alpine Running 42 seconds Running worker2
2ip9tit3pupoj8fyjlw5y4t03 helloworld.4 helloworld alpine Running 42 seconds Running worker2
0zfhyhrqk114cj11xguvsrzvz helloworld.5 helloworld alpine Running 42 seconds Running manager1
分布在3个节点上。
删除服务
删除helloworld。
$ docker service rm helloworld
helloworld
确认
$ docker service inspect helloworld
[]
Error: no such service: helloworld
滚动更新
在Redis容器版本3.0.6上创建一个服务,然后进行Rolling Update升级到3.0.7。
docker service create --replicas 5 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6
236f4wpbfv07ocl1kebe4wh1j
我正在创建5个Redis 3.0.6容器,并将更新间隔设置为10秒,同时将同时更新数设置为1。
确认
docker service inspect redis --pretty
ID: 236f4wpbfv07ocl1kebe4wh1j
Name: redis
Mode: Replicated
Replicas: 5
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.6
Resources:
Reservations:
Limits:
执行3.0.7版本的更新。
docker service update --image redis:3.0.7 redis
redis
确认
docker service inspect --pretty redis
ID: 236f4wpbfv07ocl1kebe4wh1j
Name: redis
Mode: Replicated
Replicas: 5
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.7
Resources:
Reservations:
Limits:
会按照顺序进行更新。
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
5hrzferlm1pfo3t18fj8h0ks3 redis.1 redis redis:3.0.7 Preparing 1 seconds Running worker2
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Preparing 11 seconds Running worker2
4772bv6zlwp2c42botcvph4eg redis.3 redis redis:3.0.6 Running 4 minutes Running worker1
cdppq5w50jkkp1cdiwbmxf7o2 redis.4 redis redis:3.0.6 Running 4 minutes Running worker1
4j5azfbmkmtjcjdwq3mrcih26 redis.5 redis redis:3.0.6 Running 4 minutes Running manager1
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
3y2675vxi4vfwtt0za7zfh98w redis.1 redis redis:3.0.7 Preparing 12 seconds Running manager1
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Preparing 27 seconds Running worker2
41o9qbw1rdxo0e25c4myl45wy redis.3 redis redis:3.0.7 Preparing 2 seconds Running worker2
cdppq5w50jkkp1cdiwbmxf7o2 redis.4 redis redis:3.0.6 Running 4 minutes Running worker1
4j5azfbmkmtjcjdwq3mrcih26 redis.5 redis redis:3.0.6 Running 4 minutes Running manager1
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
3y2675vxi4vfwtt0za7zfh98w redis.1 redis redis:3.0.7 Preparing 35 seconds Running manager1
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Running 50 seconds Running worker2
4ab0mvl9vyhund6d7p6r5lunz redis.3 redis redis:3.0.7 Preparing 18 seconds Running worker1
cdppq5w50jkkp1cdiwbmxf7o2 redis.4 redis redis:3.0.6 Running 5 minutes Running worker1
2mhtbzsjvful0kit3i4j7qnkl redis.5 redis redis:3.0.7 Ready 8 seconds Running worker2
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
3y2675vxi4vfwtt0za7zfh98w redis.1 redis redis:3.0.7 Running 50 seconds Running manager1
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Running About a minute Running worker2
4ab0mvl9vyhund6d7p6r5lunz redis.3 redis redis:3.0.7 Running 33 seconds Running worker1
8wr4sactu87ag9cuiojdt7eys redis.4 redis redis:3.0.7 Running 4 seconds Running manager1
2mhtbzsjvful0kit3i4j7qnkl redis.5 redis redis:3.0.7 Running 24 seconds Running worker2
排除节点
如果需要在维护等情况下排除节点,则执行以下排空命令。
请确保容器已分布在3个节点上。
docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
3y2675vxi4vfwtt0za7zfh98w redis.1 redis redis:3.0.7 Running 6 minutes Running manager1
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Running 7 minutes Running worker2
4ab0mvl9vyhund6d7p6r5lunz redis.3 redis redis:3.0.7 Running 6 minutes Running worker1
8wr4sactu87ag9cuiojdt7eys redis.4 redis redis:3.0.7 Running 6 minutes Running manager1
2mhtbzsjvful0kit3i4j7qnkl redis.5 redis redis:3.0.7 Running 6 minutes Running worker2
排除工人1。
$ docker node update --availability drain worker1
worker1
工人1的可用性已经变成了“耗尽”。
$ docker node inspect --pretty worker1
ID: 43mdhg1wi44him1mglr09dxsh
Hostname: worker1
Status:
State: Ready
Availability: Drain
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 991.7 MiB
Plugins:
Network: overlay, overlay, null, host, bridge
Volume: local
Engine Version: 1.12.0-rc2
确认其他两台是分散在worker1之外的。
$ docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
3y2675vxi4vfwtt0za7zfh98w redis.1 redis redis:3.0.7 Running 9 minutes Running manager1
cy8xapvck5nj7mi71m5oj09xk redis.2 redis redis:3.0.7 Running 9 minutes Running worker2
8ilsqn1cidmmtrl7qyrcuyq0u redis.3 redis redis:3.0.7 Running 10 seconds Running manager1
8wr4sactu87ag9cuiojdt7eys redis.4 redis redis:3.0.7 Running 8 minutes Running manager1
2mhtbzsjvful0kit3i4j7qnkl redis.5 redis redis:3.0.7 Running 8 minutes Running worker2
将worker1重新激活。
$docker node update --availability active worker1
worker1
可用性已激活。
$ docker node inspect --pretty worker1
ID: 43mdhg1wi44him1mglr09dxsh
Hostname: worker1
Status:
State: Ready
Availability: Active
Platform:
Operating System: linux
Architecture: x86_64
Resources:
CPUs: 1
Memory: 991.7 MiB
Plugins:
Network: overlay, overlay, null, host, bridge
Volume: local
Engine Version: 1.12.0-rc2
总结
使用在1.12版本中集成的swarm,可以非常轻松地建立集群环境。
我还打算尝试其他功能。