CentOS7で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ノードはCentOS7を実行します。 数十、数百、または数千のDockerホストで構成されるクラスターを実行できますが、このチュートリアルでセットアップするクラスターは、マネージャーノードと2つのワーカーノードで構成され、合計3つのクラスターメンバーになります。 このチュートリアルを完了すると、クラスターにノードを簡単に追加できるようになります。
前提条件
このチュートリアルでは、次のものが必要です。
- Dockerがインストールされたローカルマシン。 ローカルマシンは、任意のLinuxディストリビューション、またはWindowsやmacOSを実行できます。 WindowsおよびmacOSの場合、公式インストーラーを使用してDockerをインストールします。 ローカルマシンでCentOS7を実行しているが、Dockerがインストールされていない場合は、 CentOS7にDockerをインストールして使用する方法を参照してください。
- DigitalOceanAPIトークン。 お持ちでない場合は、このガイドを使用して生成してください。 トークンを生成するときは、そのトークンに読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合は、読み取り/書き込み機能があります。 コマンドラインで使いやすくするために、その記事に記載されているように、必ずトークンを変数に割り当ててください。
- ローカルコンピューターにインストールされたDockerMachine。これを使用して3つのホストを作成します。 WindowsおよびmacOSでは、DockerインストールにDockerMachineが含まれます。 CentOS 7をローカルで実行している場合、インストール手順については、 CentOS7上のDockerマシンでリモートDockerホストをプロビジョニングおよび管理する方法を参照してください。
ステップ1—クラスターノードのプロビジョニング
クラスタ用に複数のDockerホストを作成する必要があります。 復習として、次のコマンドは単一のDockerizedホストをプロビジョニングします。 $DOTOKEN
DigitalOceanAPIトークンに評価される環境変数です。
- docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN machine-name
少なくとも3つのノードで構成されるクラスターをセットアップし、一度に1つのホストをプロビジョニングするために、これを実行する必要があると想像してください。
このコマンドをいくつかの単純なBashスクリプトと組み合わせて使用すると、任意の数のDockerホストをプロビジョニングするプロセスを自動化できます。 ローカルマシンでこのコマンドを実行して、名前が付けられた3つのDockerホストを作成します node-1
, node-2
、 と node-3
:
- for i in 1 2 3; do docker-machine create --driver digitalocean \
- --digitalocean-image centos-7-0-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—ClusterManagerの初期化
私たちはそれを決定しました 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 (2n4y8bwu6s7c1kwdryd945zv1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-57m6beujakwyx0t2j5mglpi9juf8czapp8kf2tj3gudkgjkoda-0eg0x08w7uvyxiacmmx0zv67o \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
出力には、ノードのID(この例では、 2n4y8bwu6s7c1kwdryd945zv1 )と、他のノードをクラスターに追加する方法の説明が含まれています。
これで、マネージャーが構成された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
4smt8qechkvb8qp02nwo2oe6t * node-1 Ready Active Leader
5wzik3knakgj0c24jmtmiy5oq node-2 Ready Active
7f6ws6oladh94xnmbfdhanokm node-3 Ready Active
この出力は、3ノードのDocker Swarmとそのノード(マネージャーと2人のワーカー)を処理していることを示しています。 マネージャノードで実行できる他の管理コマンドを表示するには、次のように入力します。
- docker node --help
クラスターの詳細については、マネージャーまたはワーカーで次のコマンドを使用できます(これは一般的なDockerコマンドです)。
- docker info
出力はこの種であり、クラスターのステータス(activeまたはpending)、クラスター内のノードの数、および特定のノードがマネージャーであるかどうかを示す必要があります。または労働者。
Output...
Network: null host overlay bridge
Swarm: active
NodeID: 4smt8qechkvb8qp02nwo2oe6t
Is Manager: true
ClusterID: 31i554ti23njgxg28av52hv47
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: 111.111.111.111
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-327.22.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
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
このコマンドでは、ポートをマッピングしています 80
Nginxコンテナで移植する 80
クラスタ上で、どこからでもデフォルトのNginxページにアクセスできるようにします。
クラスタで実行されているサービスを表示するには、次のように入力します。
- docker service ls
出力はこの形式になるはずです。 REPLICAS 列には、実行中のサービスのインスタンスの数が表示されます。
OutputID NAME REPLICAS IMAGE COMMAND
ch7xnvy8upho webserver 1/1 nginx
を使用して、サービスが実行されているノードを判別できます。 docker service ps
その後にサービス名が続きます。
- docker service ps webserver
出力は次のようになります。
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
4pfbvs7sh5mugtzckw4czhcfm webserver.1 nginx node-1 Running Running 2 minutes 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
4pfbvs7sh5mugtzckw4czhcfm webserver.1 nginx node-1 Running Running 3 minutes 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
そしてもう一方は node-2
.
最後に、サービスがダウンした場合、元のノードが使用できなくなった場合は、同じノードまたは別のノードで自動的に再起動されます。
結論
DockerEngine1.12と新しいSwarmモードを使用してDockerSwarmをセットアップするのがいかに簡単かを見てきました。 また、クラスターでいくつかの管理タスクを実行する方法も確認しました。 しかし、まだまだあります。 使用可能なDockerSwarmコマンドを表示するには、Swarmマネージャーで次のコマンドを実行します。
- docker swarm --help
Docker Swarmの詳細については、公式ドキュメントページにアクセスしてください。 また、DigitaloOceanで他のDocker関連の記事を確認してください。