Ubuntu16.04でDockerSwarmとDigitalOceanを使用してDockerコンテナのクラスターを作成する方法
序章
Docker Swarm は、DockerホストのクラスターをデプロイするためのDockerネイティブソリューションです。 これを使用して、ローカルマシンまたはサポートされているクラウドプラットフォームで実行されているDockerホストのクラスターをすばやくデプロイできます。
Docker 1.12より前は、Dockerホストのクラスターをセットアップしてデプロイするには、サービス検出にetcdやConsulなどの外部Key-Valueストアを使用する必要がありました。 ただし、Docker 1.12では、Dockerにはそのまま使用できるメモリ内のキー値ストアが付属しているため、外部の検出サービスは不要になりました。
このチュートリアルでは、DigitalOceanでDocker1.12のSwarm機能を使用してDockerマシンのクラスターをデプロイする方法を学習します。 クラスタ内の各DockerノードはUbuntu16.04を実行します。 数十、数百、または数千のDockerホストで構成されるクラスターを実行できますが、このチュートリアルでセットアップするクラスターは、マネージャーノードと2つのワーカーノードで構成され、合計3つのクラスターメンバーになります。 。 このチュートリアルを完了すると、クラスターにノードを簡単に追加できるようになります。
前提条件
このチュートリアルでは、次のものが必要です。
- Dockerがインストールされたローカルマシン。 ローカルマシンは、任意のLinuxディストリビューション、またはWindowsやmacOSを実行できます。 WindowsおよびmacOSの場合、公式インストーラーを使用してDockerをインストールします。 ローカルマシンでUbuntu16.04を実行しているが、Dockerがインストールされていない場合は、 Ubuntu16.04にDockerをインストールして使用する方法を参照してください。
- DigitalOceanAPIトークン。 お持ちでない場合は、このガイドを使用して生成してください。 トークンを生成するときは、そのトークンに読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合は、読み取り/書き込み機能があります。 コマンドラインで使いやすくするために、その記事に記載されているように、必ずトークンを変数に割り当ててください。
- ローカルコンピューターにインストールされたDockerMachine。これを使用して3つのホストを作成します。 WindowsおよびmacOSでは、DockerインストールにDockerMachineが含まれます。 Ubuntu 16.04をローカルで実行している場合、インストール手順については、 Ubuntu16.04でDockerマシンを使用してリモートDockerホストをプロビジョニングおよび管理する方法を参照してください。
ステップ1—クラスターノードのプロビジョニング
クラスタ用に複数のDockerホストを作成する必要があります。 復習として、次のコマンドは単一のDockerizedホストをプロビジョニングします。ここで、$DOTOKEN
はDigitalOceanAPIトークンに評価される環境変数です。
- docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name
少なくとも3つのノードで構成されるクラスターをセットアップし、一度に1つのホストをプロビジョニングするために、これを実行する必要があると想像してください。
このコマンドをいくつかの単純なBashスクリプトと組み合わせて使用すると、任意の数のDockerホストをプロビジョニングするプロセスを自動化できます。 ローカルマシンでこのコマンドを実行して、node-1
、node-2
、およびnode-3
という名前の3つのDockerホストを作成します。
- for i in 1 2 3; do docker-machine create --driver digitalocean \
- --digitalocean-image ubuntu-16-04-x64 \
- --digitalocean-access-token $DOTOKEN node-$i; done
コマンドが正常に完了したら、DigitalOceanダッシュボードにアクセスするか、次のコマンドを入力して、すべてのマシンが作成されたことを確認できます。
- docker-machine ls
出力は次のようになり、ノードのIPアドレスを検索するためのクイックリファレンスとして機能する必要があります。
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node-1 - digitalocean Running tcp://111.111.111.111:2376 v1.12.2
node-2 - digitalocean Running tcp://111.111.111.112:2376 v1.12.2
node-3 - digitalocean Running tcp://111.111.222.222:2376 v1.12.2
この時点で、3つのDocker化されたホストがすべて作成され、各ホストのIPアドレスが設定されています。 また、すべてDocker 1.12.xを実行していますが、まだDockerクラスターの一部ではありません。 次の手順では、ノードをクラスターのメンバーとして機能させるファイアウォールルールを構成し、ノードの1つを選択してDocker Swarmマネージャーにし、残りをDockerSwarmワーカーとして構成します。
ステップ2—DockerSwarmトラフィックを許可するようにファイアウォールルールを構成する
クラスターには、マネージャーとして機能するノードが少なくとも1つ必要ですが、実稼働セットアップでは、3つのマネージャーが推奨されます。 このセットアップでは、最初のノードを選択して、それをSwarmマネージャーにします。 他の2つのノードはワーカーノードになります。
クラスタが正しく機能するには、クラスタの一部となるノードで特定のネットワークポートを開く必要があります。 これには、これらのポートを通過するトラフィックを許可するようにファイアウォールを構成する必要があります。 そのタスクを実行するために使用できる3つの異なるファイアウォールアプリケーションがあるため、各ファイアウォールアプリケーションのノードで実行する必要のあるコマンドは別の記事に記載されています。 このガイドに従って、各ホストのファイアウォールを構成します。 マネージャで適切なポートを開き、繰り返して2つのクライアントノードのポートを開きます。
この手順を完了したら、クラスターマネージャーを初期化できます。
ステップ3—クラスタマネージャの初期化
node-1
がクラスターマネージャーになることを決定したので、ローカルマシンからノードにログインします。
- docker-machine ssh node-1
コマンドプロンプトは、その特定のノードにログインしているという事実を反映して変化します。 ノードをSwarmManagerとして構成するには、次のコマンドを入力します。
- docker swarm init --advertise-addr node_ip_address
node_ip_address
はノードのIPアドレスです。 docker-machine ls
の出力またはDigitalOceanダッシュボードから取得できます。
次のような出力が表示されます。
OutputSwarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
出力には、ノードのID(この例では a35hhzdzf4g95w0op85tqlow1 )と、他のノードをクラスターに追加する方法の説明が含まれています。
これで、マネージャーが構成されたDockerSwarmができました。 残りのノードをワーカーとして追加しましょう。
ステップ4—クラスターへのノードの追加
この手順を完了するには、別の端末を開いて、今のところSwarmManagerにログインするために使用した端末タブまたはウィンドウをそのままにしておくことをお勧めします。
まず、ローカルマシンからnode-2
に接続します。
- docker-machine ssh node-2
次に、次のコマンドを実行します。ここで、your_swarm_token
は前の手順でクラスターを作成したときに受け取ったトークンであり、manager_node_ip_address
はSwarmマネージャーのIPです。
- docker swarm join \
- --token your_swarm_token \
- manager_node_ip_address:2377
コマンドが正常に実行されると、次の応答が表示されます。
OutputThis node joined a swarm as a worker.
node-2
からログアウトし、node-3
でこのプロセスを繰り返して、クラスターに追加します。
これで、2つのワーカーノードがクラスターに追加されました。 ファイアウォールルールが正しく構成されていれば、すべてのノードが同期された状態でDockerSwarmが機能しています。
ステップ5—クラスターの管理
マネージャーノードとワーカーノードがクラスターに割り当てられた後、すべてのDockerSwarm管理コマンドをマネージャーノードで実行する必要があります。 したがって、マネージャーを追加するために使用したターミナルに戻り、次のコマンドを入力して、クラスターのすべてのメンバーを表示します。
- docker node ls
出力は次のようになります。
OutputID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active
6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active
a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader
この出力は、3ノードのDocker Swarmとそのノード(マネージャーと2人のワーカー)を処理していることを示しています。 マネージャノードで実行できる他の管理コマンドを表示するには、次のように入力します。
- docker node --help
クラスターの詳細については、マネージャーまたはワーカーで次のコマンドを使用できます(これは一般的なDockerコマンドです)。
- docker info
出力はこの種である必要があり、クラスターのステータス(activeまたはpending)、クラスター内のノードの数、および特定のノードがマネージャーであるかどうかを示す必要がありますまたは労働者。
Output...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...
ワーカーノードで同じコマンドを繰り返すと、 IsManagerの行にfalse
と表示されます。
ヒント:いつでもクラスターにノードを追加したり、クラスターからノードを削除したりできます。 さらに、ワーカーノードをマネージャーに昇格させたり、マネージャーをワーカーに変換したりすることができます。
それでは、クラスター上でサービスを実行してみましょう。
ステップ6—DockerSwarmでサービスを実行する
Docker Swarmが起動して実行されたので、テストコンテナーを実行して、マネージャーがそれをどのように処理するかを見てみましょう。 Docker Engine 1.12以降を実行しているマシンでは、コンテナーはdocker service
コマンドを使用してサービスとしてデプロイされます。 また、docker node
コマンドと同様に、docker service
コマンドはマネージャーノードでのみ実行できます。
それでは、公式のNginxコンテナイメージを使用してWebサーバーサービスをデプロイしましょう。
- docker service create -p 80:80 --name webserver nginx
このコマンドでは、Nginxコンテナのポート80
をクラスターのポート80
にマッピングしているため、どこからでもデフォルトのNginxページにアクセスできます。
クラスタで実行されているサービスを表示するには、次のように入力します。
- docker service ls
出力はこの形式になるはずです。 REPLICAS 列には、実行中のサービスのインスタンスの数が表示されます。
OutputID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
docker service ps
に続けてサービス名を使用すると、サービスが実行されているノードを判別できます。
- docker service ps webserver
出力は次のようになります。
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago
この例では、webserver
サービスはnode-1
で実行されています。 これはデフォルトのポートで実行されているWebサーバーであるため、ブラウザでhttp://node-1_ip_address
を指定することでアクセスできます。 試してみる。 Nginxのデフォルトページが表示されます。
メッシュネットワークの魔法を使えば、あるノードで実行されているサービスに、クラスターの他のノードからアクセスできます。 たとえば、このNginxサービスには、実行中のノードだけでなく、クラスター内の任意のノードのIPアドレスをブラウザーで指定することによってもアクセスできます。 試してみる。
Docker Swarmのもう1つの機能は、サービスをスケーリングする機能です。つまり、サービスの追加のインスタンスを起動します。 以前に開始したwebserver
サービスを5つのインスタンスにスケーリングするとします。 これを行うには、次のコマンドを入力するだけで、システムはさらに4つのインスタンスを作成します。
- docker service scale webserver=5
また、docker service ps
の出力には、新しいインスタンスが開始されたノードが表示されます。
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago
1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago
d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago
これは、4つの新しいインスタンスのうち2つがnode-3
で開始され、1つがnode-1
で開始され、もう1つがnode-2
で開始されたことを示しています。
最後に、サービスがダウンした場合、元のノードが使用できなくなった場合は、同じノードまたは別のノードで自動的に再起動されます。
結論
DockerEngine1.12と新しいSwarmモードを使用してDockerSwarmをセットアップするのがいかに簡単かを見てきました。 また、クラスターでいくつかの管理タスクを実行する方法も確認しました。 しかし、まだまだあります。 使用可能なDockerSwarmコマンドを表示するには、Swarmマネージャーで次のコマンドを実行します。
- docker swarm --help
Docker Swarmの詳細については、公式ドキュメントページにアクセスしてください。 また、DigitaloOceanで他のDocker関連の記事を確認してください。