一般的に、多くのリクエストをシステムは単一のサーバーで構成されることは珍しく、複数のサーバーで構成されています。単一のDockerホストで構成する場合は比較的単純でしたが、複数のDockerホストやコンテナの配置をどのように制御するべきかには単一のDockerホストと違い単純ではありません。複数のDockerホストを制御するための方法について手順を解説します。
目次
Docker Swarmとは?
Docker Swarmは複数のDockerホストを束ねてクラスタ化するためのツールです。コンテナーオーケストレーションシステムの一つです。
Dockerでのコンテナオーケストレーションに関わる名称のまとめは以下のようになります。
名称 | 役割 | 対応するコマンド |
Compose | 複数のコンテナを使うDockerアプリケーションの管理 (主にシングルホスト) | docker-command |
Swarm | クラスタの構築や管理 (主にマルチホスト) | docker swarm |
Service | Swarmを前提とし、クラスタ内のService (1つ以上のコンテナの集まり)の管理 | docker service |
Stack | Swarmを前提とし、複数のServiceをまとめたアプリケーション全体の管理 | docker stack |
複数のDockerホストを用意しSwarmクラスタを構築する
複数のDockerホストを用意するための仕組みとして、「Docker in Docker」があります。これは、Dockerホストとして機能するDockerコンテナを複数個立てることです。
Docker in Dockerを使うことで、VMによる起動や停止の時間が長い、マシンリソースを余計に消費するといったデメリットを解消することが出来ます。
dind(Docker in Docker)を使ってDocker Swarmクラスタを構築してみましょう。
作成するコンテナは以下のように3種類、5個です。
- registry x 1
- manager x 1
- worker x 3
手順
version: "3"
services:
registry:
container_name: registry
image: registry:2.6
ports:
- 5000:5000
volumes:
- "./registry-date:/var/lib/registry"
manager:
container_name: manager
image: docker:18.05.0-ce-dind
privileged: true
tty: true
ports:
- 8000:80
- 9000:9000
depends_on:
- registry
expose:
- 3375
command: "--insecure-registry registry:5000"
volumes:
- "./stack:/stack"
worker01:
container_name: worker01
image: docker:18.05.0-ce-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
worker02:
container_name: worker02
image: docker:18.05.0-ce-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
worker03:
container_name: worker03
image: docker:18.05.0-ce-dind
privileged: true
tty: true
depends_on:
- manager
- registry
expose:
- 7946
- 7946/udp
- 4789/udp
command: "--insecure-registry registry:5000"
> docker-compose up -d
registry is up-to-date
Starting manager ... done
Creating worker01 ... done
Creating worker03 ... done
Creating worker02 ... done
managerをDocker Swarmへ追加
> docker container exec -it manager docker swarm init
Swarm initialized: current node (ngj8hs1812m79gdcz9yi2flem) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z 172.29.0.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
WorkerをDocker Swarmへ追加
> docker container exec -it worker01 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.
> docker container exec -it worker02 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.
> docker container exec -it worker03 docker swarm join --token SWMTKN-1-2zugvze7qqbjvsd301r8pjy2rn3ny35bixn1dxir7f6aezpkk1-0c0qxiyon2s05a6dvmdp5qb5z manager:2377
This node joined a swarm as a worker.
nodeの状態の確認
> docker container exec -it manager docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
h0mjai6pd673bokfsepiw6k6x 0efa0423e100 Ready Active 18.05.0-ce
r3rwee9jzv2c73lg8qsvwmbjr 693fde09ce44 Ready Active 18.05.0-ce
bkqnqzurop3prp3cdqyx6u2uu b91ff3c9a469 Ready Active 18.05.0-ce
ngj8hs1812m79gdcz9yi2flem * c4e42e84f7a3 Ready Active Leader 18.05.0-ce