前書き

Docker Swarmは、DockerホストのクラスターをデプロイするためのDockerネイティブソリューションです。 これを使用して、ローカルマシンまたはサポートされているクラウドプラットフォームで実行されているDockerホストのクラスターをすばやく展開できます。

Docker 1.12より前では、Dockerホストのクラスターをセットアップしてデプロイするには、https://coreos.com/etcd/ [etcd]やhttps://www.consul.io/[Consulなどの外部キーと値のストアを使用する必要がありました。 ]サービスの発見。 ただし、Docker 1.12では、外部のディスカバリサービスは不要になりました。Dockerには、そのまま使用できるメモリ内のキーと値のストアが付属しているためです。

このチュートリアルでは、DigitalOceanでDocker 1.12のSwarm機能を使用してDockerマシンのクラスターをデプロイする方法を学びます。 クラスター内の各DockerノードはUbuntu 16.04を実行します。 数十、数百、または数千のDockerホストで構成されるクラスターを実行できますが、このチュートリアルで設定するクラスターは、マネージャーノードと2つのワーカーノードで構成され、合計3つのクラスターメンバーになります。 。 このチュートリアルを完了すると、クラスターにノードを簡単に追加できるようになります。

前提条件

このチュートリアルでは、次のものが必要です。

  • Dockerがインストールされたローカルマシン。 ローカルマシンは、任意のLinuxディストリビューション、またはWindowsまたはmacOSを実行できます。 WindowsおよびmacOSの場合、https://www.docker.com/products/docker-desktop [公式インストーラー]を使用してDockerをインストールします。 ローカルマシンでUbuntu 16.04を実行しているが、Dockerがインストールされていない場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-を参照してください手順については、04 [Ubuntu 16.04でDockerをインストールして使用する方法]。

  • DigitalOcean APIトークン。 持っていない場合は、https://www.digitalocean.com/community/tutorials/how-to-use-the-digitalocean-api-v2 [このガイド]を使用して生成してください。 トークンを生成するときは、読み取り/書き込みスコープがあることを確認してください。 これがデフォルトであるため、生成中にオプションを変更しない場合、読み取り/書き込み機能があります。 コマンドラインで使いやすくするために、その記事で与えられているように変数にトークンを割り当ててください。

  • ローカルコンピューターにインストールされたDocker Machine。これを使用して3つのホストを作成します。 WindowsおよびmacOSでは、DockerインストールにはDocker Machineが含まれます。 Ubuntu 16.04をローカルで実行している場合は、https://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-ubuntu-を参照してくださいインストール手順については、16-04 [Ubuntu 16.04上のDockerマシンでリモートDockerホストをプロビジョニングおよび管理する方法]。

手順1-クラスターノードのプロビジョニング

クラスター用にいくつかのDockerホストを作成する必要があります。 復習として、次のコマンドは単一のDockerizedホストをプロビジョニングします。ここで、「+ $ DOTOKEN +」はDigitalOcean APIトークンに評価される環境変数です。

docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token

少なくとも3つのノードで構成されるクラスターをセットアップし、一度に1つのホストをプロビジョニングするために、これを行う必要があることを想像してください。

このコマンドをいくつかの簡単なBashスクリプトと組み合わせて使用​​することで、任意の数のDockerホストのプロビジョニングプロセスを自動化できます。 ローカルマシンで次のコマンドを実行して、「+ node-1 」、「 node-2 」、「 node-3 +」という3つのDockerホストを作成します。

for i in ; do docker-machine create --driver digitalocean \
--digitalocean-image  ubuntu-16-04-x64 \
--digitalocean-access-token  $i; done

コマンドが正常に完了したら、DigitalOceanダッシュボードにアクセスするか、次のコマンドを入力して、すべてのマシンが作成されたことを確認できます。

docker-machine ls

出力は次のようになり、ノードのIPアドレスを検索するためのクイックリファレンスとして機能します。

OutputNAME     ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
  -        digitalocean   Running   tcp://             v1.12.2
  -        digitalocean   Running   tcp://           v1.12.2
  -        digitalocean   Running   tcp://         v1.12.2

この時点で、3つのDockerizedホストがすべて作成され、各ホストのIPアドレスがあります。 また、すべてDocker 1.12.xを実行していますが、まだDockerクラスターの一部ではありません。 次の手順では、ノードをクラスターのメンバーとして機能させるファイアウォールルールを構成し、ノードの1つを選択してDocker Swarmマネージャーにし、残りをDocker Swarmワーカーとして構成します。

ステップ2-Docker Swarmトラフィックを許可するためのファイアウォールルールの設定

クラスターには、マネージャーとして機能する少なくとも1つのノードが必要ですが、実稼働セットアップでは、3つのマネージャーをお勧めします。 このセットアップでは、最初のノードを選択してSwarmマネージャーにします。 他の2つのノードはワーカーノードになります。

クラスタが正常に機能するには、クラスタの一部となるノードで特定のネットワークポートを開く必要があります。 それには、これらのポートを通過するトラフィックを許可するようにファイアウォールを構成する必要があります。 そのタスクを実行するために使用できる3つの異なるファイアウォールアプリケーションがあるため、各ファイアウォールアプリケーションのノードで実行する必要があるコマンドは、別の記事に記載されています。 https://www.digitalocean.com/community/tutorials/how-to-configure-the-linux-firewall-for-docker-swarm-on-ubuntu-16-04 [このガイド]に従って、それぞれのファイアウォールを設定しますホスト。 マネージャーで適切なポートを開き、繰り返して2つのクライアントノードでポートを開きます。

この手順を完了したら、クラスターマネージャーを初期化できます。

手順3-Cluster Managerの初期化

「++」がクラスターマネージャーになることを決定したので、ローカルマシンからノードにログインします。

docker-machine ssh

コマンドプロンプトは、その特定のノードにログインしているという事実を反映して変更されます。 ノードをSwarmマネージャーとして構成するには、次のコマンドを入力します。

docker swarm init --advertise-addr

`+ node_ip_address `はノードのIPアドレスです。 ` docker-machine ls +`の出力またはDigitalOceanダッシュボードから取得できます。

次のような出力が表示されます。

OutputSwarm initialized: current node () 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-クラスターへのノードの追加

このステップを完了するには、別のターミナルを開いて、今のところSwarmマネージャーへのログインに使用したターミナルタブまたはウィンドウをそのままにしておくことをお勧めします。

まず、ローカルマシンから `+ node-2 +`に接続します。

docker-machine ssh

次に、このコマンドを実行します。「+ your_swarm_token 」は前の手順でクラスターを作成したときに受け取ったトークンで、「 manager_node_ip_address +」はSwarmマネージャーのIPです。

docker swarm join \
--token  \
:2377

コマンドが正常に実行されると、次の応答が表示されます。

OutputThis node joined a swarm as a worker.

「」からログアウトし、「」でこのプロセスを繰り返してクラスターに追加します。

これで、2つのワーカーノードがクラスターに追加されました。 ファイアウォールルールが正しく構成されていれば、機能するDocker Swarmがあり、すべてのノードが同期されています。

ステップ5-クラスターの管理

マネージャーおよびワーカーノードをクラスターに割り当てた後、すべてのDocker Swarm管理コマンドをマネージャーノードで実行する必要があります。 したがって、マネージャーの追加に使用したターミナルに戻り、このコマンドを入力してクラスターのすべてのメンバーを表示します。

docker node ls

出力は次のようになります。

OutputID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer        Ready   Active
6yqh4bjki46p5uvxdw6d53gc0        Ready   Active
a35hhzdzf4g95w0op85tqlow1 *      Ready   Active        Leader

この出力は、3ノードのDocker Swarmとそのノード(マネージャーと2人のワーカー)を扱っていることを示しています。 マネージャーノードで実行できる他の管理コマンドを表示するには、次のように入力します。

docker node --help

クラスターの詳細情報については、マネージャーまたはワーカーで次のコマンドを使用できます(汎用のDockerコマンドです)。

docker info

出力はこのようなものであり、クラスターのステータス(アクティブ*または*保留中)、クラスター内のノードの数、および特定のノードがマネージャーかワーカーかを示す必要があります。

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 +`が表示されます。

それでは、クラスタでサービスを実行してみましょう。

ステップ6-Docker Swarmでサービスを実行する

Docker Swarmを起動して実行したので、テストコンテナーを実行して、マネージャーがそれをどのように処理するかを見てみましょう。 Docker Engine 1.12以降を実行しているマシンでは、コンテナは `+ docker service `コマンドを使用してサービスとしてデプロイされます。 そして、「 docker node」コマンドと同様に、「+ docker service」コマンドはマネージャーノードでのみ実行できます。

それでは、公式のNginxコンテナイメージを使用してWebサーバーサービスを展開しましょう。

docker service create -p 80:80 --name  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

出力は次のようになります。

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:// +」を指定することでアクセスできます。 試してみる。 Nginxのデフォルトページが表示されます。

メッシュネットワーキングの魔法により、ノードで実行されているサービスには、クラスターの他のノードでアクセスできます。 たとえば、このNginxサービスには、ブラウザで実行しているノードだけでなく、クラスター内の任意のノードのIPアドレスを指定することでもアクセスできます。 試してみる。

Docker Swarmのもう1つの機能は、サービスをスケーリングする機能です。つまり、サービスの追加インスタンスをスピンアップします。 以前に開始した `+ webserver +`サービスを5つのインスタンスにスケーリングしたいとします。 そのためには、次のコマンドを入力するだけで、システムはさらに4つのインスタンスを作成します。

docker service scale =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の詳細については、https://docs.docker.com/engine/swarm/ [公式ドキュメントページ]をご覧ください。 そして、DigitaloOceanの他のhttps://www.digitalocean.com/community/tags/docker?type=tutorials[Docker関連の記事]をチェックしてください。