English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Docker Swarm は Docker のクラスタ管理ツールです。Docker ホストプールを単一の仮想 Docker ホストに変換します。Docker Swarm は標準の Docker API を提供しており、Docker デーモンと通信しているすべてのツールが Swarm を使用して簡単に複数のホストに拡張できます。
サポートするツールには以下のようなものが含まれますが、これに限りません:
Dokku
Docker Compose
Docker Machine
Jenkins
以下の図のように、swarm クラスタは管理ノード(manager)とワークノード(work node)で構成されています。
swarm mananger:クラスタ全体の管理業務を担当し、クラスタ設定、サービス管理など、クラスタに関連するすべての業務を担当します。
work node:つまり図の available node、タスク(task)を実行するためのサービスを運行する主な役割があります。
以下の例では、Docker Machine と virtualbox を使用して説明しています。ホストが virtualbox をインストールしていることを確認してください。
docker マシンを作成します:
$ docker-machine create -d virtualbox swarm-manager
swarm クラスタを初期化し、初期化を行うこのマシンはクラスタの管理ノードです。
$ docker-machine ssh swarm-manager $ docker swarm init --advertise-addr 192.168.99.107 #ここでのIPは、マシンを作成した際に割り当てられたIPです。
上記の出力は、初期化が成功したことを示しています。以下の行をコピーして、ワークノードを追加する際に使用します:
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh2j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
ここでは直接2台のマシンを作成し、swarm-worker1 とswarm-worker2 。
それぞれのマシンにログインし、前の手順で作成したクラスタに追加します、ここでは前の手順でコピーした内容を使用します。
以上のデータ出力は、成功が確認されたことを示しています。
上図では、前の手順でコピーした内容が長いため、自動的に切られますが、実際に実行されたコマンドは以下の通りです:
docker@swarm-worker1:~$ docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh2j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377
管理ノードに入ると、docker infoを実行すると現在のクラスタの情報を確認できます。
$ docker info
赤い円の位置から、現在実行中のクラスタには3つのノードがあり、そのうち1つが管理ノードであることがわかります。
注意:クラスタ管理に関連するどんな操作も、管理ノード上で行われます。
以下の例では、作業ノード上にhelloworldという名前のサービスを作成します、これはランダムに作業ノードに割り当てられます:
docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com
helloworldサービスがどのノード上で実行されているかを確認する、現在はswarm上で実行されています。-worker1 ノード:
docker@swarm-manager:~$ docker service ps helloworld
helloworldデプロイメントの詳細情報を確認する:
docker@swarm-manager:~$ docker service inspect --pretty helloworld
上記のhelloworldサービスを二つのノードに拡張します。
docker@swarm-manager:~$ docker service scale helloworld=2
既に一つのノードから二つのノードに拡張されています。
docker@swarm-manager:~$ docker service rm helloworld
削除されたか確認する:
以下の例では、redis バージョンがどのように高バージョンにロールオーバーされるかを紹介します。
一つの 3.0.6 の redis 版本。
docker@swarm-manager:~$ docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6
redis をロールバックアップグレードします。
docker@swarm-manager:~$ docker service update --image redis:3.0.7 redis
図を確認すると、redis のバージョンが以下のようになります: 3.0.6 アップグレードして 3.0.7、サービスのアップグレードが成功しました。
すべてのノードを確認:
docker@swarm-manager:~$ docker node ls
現在のすべてのノードは Active で、新しいタスクの割り当てを受け取ることができます。
ノードの swarm を停止-worker1:
注意:swarm-worker1 ステータスが Drain に変わります。クラスタのサービスには影響しませんが、swarm-worker1 ノードは新しいタスクを受け取らなくなり、クラスタの負荷能力が低下します。
以下のコマンドでノードを再アクティブ化できます:
docker@swarm-manager:~$ docker node update --availability active swarm-worker1