前書き
Docker Swarmは、DockerホストのクラスターをデプロイするためのDockerネイティブソリューションです。 これを使用して、ローカルマシンまたはサポートされているクラウドプラットフォームで実行されているDockerホストのクラスターをすばやく展開できます。
Docker 1.12より前は、Dockerホストのクラスターをセットアップしてデプロイするには、サービス検出にetcdやConsulなどの外部Key-Valueストアを使用する必要がありました。 ただし、Docker 1.12では、外部のディスカバリサービスは不要になりました。Dockerには、そのまま使用できるメモリ内のキーと値のストアが付属しているためです。
このチュートリアルでは、DigitalOceanでDocker 1.12のSwarm機能を使用してDockerマシンのクラスターをデプロイする方法を学びます。 クラスター内の各DockerノードはUbuntu 16.04を実行します。 数十、数百、または数千のDockerホストで構成されるクラスターを実行できますが、このチュートリアルで設定するクラスターは、マネージャーノードと2つのワーカーノードで構成され、合計3つのクラスターメンバーになります。 。 このチュートリアルを完了すると、クラスターにノードを簡単に追加できるようになります。
前提条件
このチュートリアルでは、次のものが必要です。
-
Dockerがインストールされたローカルマシン。 ローカルマシンは、任意のLinuxディストリビューション、またはWindowsまたはmacOSを実行できます。 WindowsおよびmacOSの場合、official installerを使用してDockerをインストールします。 ローカルマシンでUbuntu16.04を実行しているが、Dockerがインストールされていない場合は、How To Install and Use Docker on Ubuntu 16.04を参照してください。
-
DigitalOcean APIトークン。 ない場合は、this guideを使用して生成します。 トークンを生成するときは、読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合、読み取り/書き込み機能があります。 コマンドラインで使いやすくするために、その記事で与えられているように変数にトークンを割り当ててください。
-
ローカルコンピューターにインストールされたDocker Machine。これを使用して3つのホストを作成します。 WindowsおよびmacOSでは、DockerインストールにはDocker Machineが含まれます。 Ubuntu 16.04をローカルで実行している場合、インストール手順についてはHow To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04を参照してください。
[[step-1 -—- provisioning-the-cluster-nodes]] ==ステップ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つのDockerizedホストがすべて作成され、各ホストのIPアドレスがあります。 また、すべてDocker 1.12.xを実行していますが、まだDockerクラスターの一部ではありません。 次の手順では、ノードをクラスターのメンバーとして機能させるファイアウォールルールを構成し、ノードの1つを選択してDocker Swarmマネージャーにし、残りをDocker Swarmワーカーとして構成します。
[[step-2 -—- configuring-firewall-rules-to-allow-docker-swarm-traffic]] ==ステップ2— DockerSwarmトラフィックを許可するファイアウォールルールの構成
クラスターには、マネージャーとして機能する少なくとも1つのノードが必要ですが、実稼働セットアップでは、3つのマネージャーをお勧めします。 このセットアップでは、最初のノードを選択してSwarmマネージャーにします。 他の2つのノードはワーカーノードになります。
クラスタが正常に機能するには、クラスタの一部となるノードで特定のネットワークポートを開く必要があります。 それには、これらのポートを通過するトラフィックを許可するようにファイアウォールを構成する必要があります。 そのタスクを実行するために使用できる3つの異なるファイアウォールアプリケーションがあるため、各ファイアウォールアプリケーションのノードで実行する必要があるコマンドは、別の記事に記載されています。 this guideに従い、各ホストのファイアウォールを構成します。 マネージャーで適切なポートを開き、繰り返して2つのクライアントノードでポートを開きます。
この手順を完了したら、クラスターマネージャーを初期化できます。
[[step-3 -—- initializing-the-cluster-manager]] ==ステップ3— ClusterManagerの初期化
node-1
をクラスターマネージャーにすることを決定したので、ローカルマシンからノードにログインします。
docker-machine ssh node-1
コマンドプロンプトは、その特定のノードにログインしているという事実を反映して変更されます。 ノードをSwarmマネージャーとして構成するには、次のコマンドを入力します。
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)と、他のノードをクラスターに追加する方法の説明が含まれています。
これで、マネージャーが構成されたDocker Swarmができました。 残りのノードをワーカーとして追加しましょう。
[[ステップ-4 -—-クラスターへのノードの追加]] ==ステップ4—クラスターへのノードの追加
このステップを完了するには、別のターミナルを開いて、今のところSwarmマネージャーへのログインに使用したターミナルタブまたはウィンドウをそのままにしておくことをお勧めします。
まず、ローカルマシンから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つのワーカーノードがクラスターに追加されました。 ファイアウォールルールが正しく構成されていれば、機能するDocker Swarmがあり、すべてのノードが同期されています。
[[step-5 -—- managing-the-cluster]] ==ステップ5—クラスターの管理
マネージャーおよびワーカーノードをクラスターに割り当てた後、すべてのDocker Swarm管理コマンドをマネージャーノードで実行する必要があります。 したがって、マネージャーの追加に使用したターミナルに戻り、このコマンドを入力してクラスターのすべてのメンバーを表示します。
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
...
ワーカーノードで同じコマンドを繰り返すと、Is Manager行にfalse
が表示されます。
[.tip]#Tip:クラスターからノードをいつでも追加または削除できます。 さらに、ワーカーノードをマネージャーに昇格させ、マネージャーをワーカーに変換することができます。
#
それでは、クラスタでサービスを実行してみましょう。
[[step-6 -—- running-services-in-the-docker-swarm]] ==ステップ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
で開始されたことを示しています。
最後に、サービスがダウンした場合、元のノードが使用できなくなった場合、同じノードまたは別のノードでサービスが自動的に再起動されます。
結論
Docker Engine 1.12と新しいSwarmモードを使用してDocker Swarmをセットアップするのがどれほど簡単かを見てきました。 また、クラスターでいくつかの管理タスクを実行する方法も確認しました。 しかし、まだあります。 使用可能なDocker Swarmコマンドを表示するには、Swarmマネージャーで次のコマンドを実行します。
docker swarm --help
Docker Swarmの詳細については、official documentation pageにアクセスしてください。 また、DigitaloOceanで他のDocker-related articlesを確認してください。