尝试使用 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,可以非常轻松地建立集群环境。
我还打算尝试其他功能。

广告
将在 10 秒后关闭
bannerAds