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] |
こちらを参照して全ノードで Docker サービスを起動しておきます。
|
[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"] 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 |
Sponsored Link |