Ubuntu 16.04でDocker SwarmとDigitalOceanを使用してDockerコンテナーのクラスターを作成する方法

前書き

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

Docker 1.12より前は、Dockerホストのクラスターをセットアップしてデプロイするには、サービス検出にetcdConsulなどの外部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-1node-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を確認してください。

Related