Debian 10 Buster
Sponsored Link

Docker : Docker Swarm を利用する2019/07/24

 
Docker Swarm を利用して、複数の Docker ホストでクラスター環境を構成します。
当例では以下の 3台の Docker ホストを使用して設定します。
Swarm クラスターではマネージャーノード [Manager nodes] とワーカーノード [Worker nodes] の二つの役割がありますが、 いずれの役割も複数ノード設定可能ですが、当例では以下のように node01 をマネージャーノード、その他をワーカーノードとして設定します。
 -----------+---------------------------+--------------------------+------------
            |                           |                          |
        eth0|10.0.0.51              eth0|10.0.0.52             eth0|10.0.0.53
 +----------+-----------+   +-----------+----------+   +-----------+----------+
 | [ node01.srv.world ] |   | [ node02.srv.world ] |   | [ node03.srv.world ] |
 |       Manager        |   |        Worker        |   |        Worker        |
 +----------------------+   +----------------------+   +----------------------+

[1]
[2] マネージャーノードで Swarm クラスターの設定をします。
root@node01:~#
docker swarm init

Swarm initialized: current node (al73w42dwnui659iyomjcekds) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-19qm6ypn0d25pwisgcsjak9m31mwesutrl9448q7l92oe2izwb-8z3dk7xs19tuc1rxf9a2ix4tu 10.0.0.51:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[3] ワーカーノードから Swarm クラスターへの参加を実行します。
実行コマンドはマネージャーノードで swarm init した際に表示されたコマンドをそのまま実行すれば OK です。
root@node02:~#
docker swarm join \
--token SWMTKN-1-19qm6ypn0d25pwisgcsjak9m31mwesutrl9448q7l92oe2izwb-8z3dk7xs19tuc1rxf9a2ix4tu 10.0.0.51:2377

This node joined a swarm as a worker.
[4] ワーカーノードが正常に Swarm クラスターに参加できていれば、マネージャーノードで node ls するとクラスター参加ノードの一覧が表示されます。
root@node01:~#
docker node ls

ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
al73w42dwnui659iyomjcekds *   node01.srv.world    Ready               Active              Leader              18.09.1
3nvb18sjv4ric46kawvfosx9h     node02.srv.world    Ready               Active                                  18.09.1
zr23tmq3dj938va6lchm88y0f     node03.srv.world    Ready               Active                                  18.09.1
[5] Swarm クラスターが正常に設定できたら、次に Swarm クラスターで提供するサービスを設定します。
例として、apache2 サービスを提供するコンテナーイメージを作成して設定します。
コンテナーイメージは全ノードで作成しておくか、あるいは、全ノードからアクセス可能な自身のプライベートレジストリーにイメージを保管します。
当例では動作確認のため HTTP アクセス時の表示メッセージはノード毎に異なるものを設定しています。
root@node01:~#
vi Dockerfile
FROM debian
MAINTAINER ServerWorld <admin@srv.world>

RUN apt-get update
RUN apt-get -y install apache2
RUN echo "node01" > /var/www/html/index.html

EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

root@node01:~#
docker build -t apache2_server:latest ./

[6] コンテナーイメージが準備できたら、マネージャーノードでサービスを定義します。
サービス起動後は、マネージャーノードの設定したポート宛てにアクセスすると、サービスに設定したレプリカのノード数分の Docker ノードが応答します。 クラスター内のノードへのアクセスはラウンドロビン方式で振り分けられるため、アクセスごとに応答ノードが切り替わります。
root@node01:~#
docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
apache2_server      latest              41d978b3ce45        10 seconds ago      243MB
debian              latest              00bf7fdd8baf        2 weeks ago         114MB

# レプリカ数 2 でサービスを新規作成する

root@node01:~#
docker service create --name swarm_cluster --replicas=2 -p 80:80 apache2_server:latest

image apache2_server:latest could not be accessed on a registry to record
its digest. Each node will access apache2_server:latest independently,
possibly leading to different nodes running different
versions of the image.
.....
.....
1/2: running
2/2: running
verify: Service converged

# サービスの一覧を表示する

root@node01:~#
docker service ls

ID                  NAME                MODE                REPLICAS            IMAGE                   PORTS
tbnpvw5b871p        swarm_cluster       replicated          2/2                 apache2_server:latest   *:80->80/tcp

# サービスを調査する

root@node01:~#
docker service inspect swarm_cluster --pretty

ID:             tbnpvw5b871puheptpakzcxby
Name:           swarm_cluster
Service Mode:   Replicated
 Replicas:      2
Placement:
UpdateConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:   1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:         apache2_server:latest
 Init:          false
Resources:
Endpoint Mode:  vip
Ports:
 PublishedPort = 80
  Protocol = tcp
  TargetPort = 80
  PublishMode = ingress

# サービスの稼働状況を表示する

root@node01:~#
docker service ps swarm_cluster

ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
bdjrhe896xye        swarm_cluster.1     apache2_server:latest   node02.srv.world    Running             Running 47 seconds ago
fcq9es71z8zf        swarm_cluster.2     apache2_server:latest   node01.srv.world    Running             Running 47 seconds ago

# マネージャーノードにアクセスして動作確認

# ラウンドロビン方式で各ノードへ振り分けられる

root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
[7] 設定したサービスのレプリカ数を変更したい場合は以下のように設定します。
# レプリカ数を 3 に変更する

root@node01:~#
docker service scale swarm_cluster=3

swarm_cluster scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
root@node01:~#
docker service ps swarm_cluster

ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
bdjrhe896xye        swarm_cluster.1     apache2_server:latest   node02.srv.world    Running             Running about a minute ago
fcq9es71z8zf        swarm_cluster.2     apache2_server:latest   node01.srv.world    Running             Running about a minute ago
xghvm62h2o4x        swarm_cluster.3     apache2_server:latest   node03.srv.world    Running             Running 7 seconds ago

# アクセスして動作確認

root@node01:~#
curl http://node01.srv.world

node03
root@node01:~#
curl http://node01.srv.world

node02
root@node01:~#
curl http://node01.srv.world

node01
関連コンテンツ