DockerSwarmを使用したクラスタリング

このチュートリアルでは、Java開発者にDockerSwarmを紹介します。多くのエンタープライズショップがDockerを介したコンテナー管理開発を採用している理由と、クラスタリングがDockerコンテナーを操作するための重要な手法である理由を学びます。また、2つの人気のあるDockerクラスタリングテクノロジー(AmazonECSとDockerSwarm)がどのように比較されているかを確認し、ショップやプロジェクトに適したソリューションを選択するためのクイックガイドを入手します。チュートリアルは、DockerSwarmを使用して2ノードのエンタープライズクラスターを開発および管理するための実践的なデモンストレーションで終わります。

今すぐ読む:Dockerを使用したコンテナ管理の開発

Docker Swarmに飛び込む前に、コンテナー管理の開発とDockerの基礎に精通することをお勧めします。以下に概要を示しますが、より詳細な説明については、Dockerの概要を参照してください。これらの基本に精通している開発者は、次のセクションにスキップする必要があります。

Dockerとの取引は何ですか?

Dockerは、分散アプリケーションを構築、出荷、実行するためのオープンプラットフォームです。Docker化されたアプリケーションは、開発者のマシン上でローカルに実行でき、クラウドベースのインフラストラクチャ全体で本番環境にデプロイできます。Dockerは迅速な開発に役立ち、他のテクノロジーとは異なり、継続的インテグレーションと継続的デプロイを可能にします。これらの機能があるため、すべての開発者が使用方法を知っておく必要があるプラットフォームです。

Dockerは仮想化テクノロジーではなく、コンテナー化テクノロジーであることを理解することが重要です。仮想マシンには完全なオペレーティングシステムが含まれており、ハイパーバイザーと呼ばれる重いプロセスによって管理されますが、コンテナーは非常に軽量で自己完結型になるように設計されています。各サーバーは、コンテナーを実行し、コンテナー内のオペレーティングシステムコールをホストオペレーティングシステム上のネイティブコールに変換するDockerエンジンと呼ばれるデーモンプロセスを実行します。コンテナは仮想マシンに似ていますが、はるかに小さいだけで、アプリケーション、ランタイム環境、およびベアボーンオペレーティングシステムをホストします。コンテナは通常、仮想マシンで実行されます。仮想マシンの起動には数分かかる場合がありますが、コンテナーは数秒で起動できます。

図1は、コンテナーと仮想マシンの違いを示しています。

Dockerコンテナーは自己完結型です。つまり、アプリケーションを実行するために必要なすべてのものが含まれています。たとえば、Tomcatで実行されているWebアプリケーションの場合、コンテナには次のものが含まれます。

  • WARファイル
  • Tomcat
  • JVM
  • 基本オペレーティングシステム

図2は、Dockerコンテナー内のWebアプリのアーキテクチャーを示しています。

Dockerの場合、各仮想マシンはDockerエンジンと呼ばれるデーモンプロセスを実行します。WARファイルなどのアプリケーションをビルドしてから、対応するDockerfileを作成します。Dockerfileは、Dockerイメージの構築方法を説明するテキストファイルです。これは、アプリケーションの実行に必要なすべてのものを含むバイナリファイルです。例として、ベースLinux OS、Javaランタイム、およびTomcatを含むTomcatベースイメージからDockerfileを構築できます。WARファイルをTomcatのwebappsディレクトリにコピーするようにDockerに指示した後、Dockerfileは、ベースOS、JVM、Tomcat、およびWARファイルで構成されるDockerイメージにコンパイルされます。Dockerイメージをローカルで実行できますが、最終的にはDockerリポジトリに公開します、DockerHubのように。

Docker Imageはコンテナーのバイナリバージョンですが、DockerImageのランタイムインスタンスはDockerコンテナーと呼ばます。Dockerコンテナーは、Dockerエンジンによって実行されます。Dockerエンジンを実行するマシンは、Dockerホストと呼ばれます。これは、アプリケーションの規模に応じて、ローカルのラップトップまたはクラウドプラットフォームになります。

このセクションの基本は、クラスタリングがDockerツールキットへの重要な追加である理由を理解するための基礎を提供します。詳細については、Dockerの概要を参照してください。

Dockerのクラスタリング

Dockerを使い始めるほとんどの開発者は、Dockerfileを作成し、ラップトップでローカルに実行します。ただし、コンテナ管理の開発には、個々のDockerコンテナをローカルで実行するだけではありません。Dockerの超能力は、コンテナーを動的にスケールアップまたはスケールダウンする機能です。本番環境では、これは、マシンまたは仮想マシンのホスト全体のクラスターでDockerを実行することを意味します。

さまざまなDockerクラスタリングテクノロジーを利用できますが、最も人気のある2つは、Amazon EC2 Container Service(ECS)とDockerSwarmです。

Amazon ECS

AmazonのDockerクラスタリングテクノロジーは、Amazon Web Services(AWS)を活用して、Dockerコンテナーを実行できる仮想マシンのクラスターを作成します。 ECSクラスターはマネージドECSインスタンスで構成されます。これは、DockerエンジンとECSエージェントを備えたEC2インスタンスです。 ECSは、自動スケーリンググループを使用して、CloudWatchポリシーに基づいてインスタンスの数を増減します。たとえば、ECSインスタンスの平均CPU使用率が高すぎる場合、自動スケーリンググループで定義されたインスタンスの最大数まで、より多くのインスタンスを開始するようにECSに要求できます。

DockerコンテナーはECSサービスによって管理され、コンテナーの実行に必要な計算容量(CPU)とRAMの量によって構成されます。 ECSサービスには、Elastic Load Balancer(ELB)が関連付けられています。 Dockerコンテナーを開始および停止すると、ECSサービスはそれらのコンテナーをELBに登録および登録解除します。クラスターのルールを設定すると、Amazon ECSにより、必要な数のコンテナーが実行され、それらのコンテナーすべてにELBからアクセスできるようになります。図3は、AmazonECSの概要を示しています。

ECSインスタンスタスクを区別することが重要です。ECSクラスターは、自動スケーリンググループで実行される特別なEC2インスタンスであるECSインスタンスを管理します。ECSサービスは、1つ以上のDockerコンテナーを含むことができ、クラスター上で実行されるタスクを管理します。ELBは、Dockerコンテナーを実行し、Dockerコンテナーに負荷を分散しているECSインスタンスの前に配置されます。ECSタスクとDockerコンテナーの関係は、タスク定義がECSサービスに実行するDockerコンテナーとそれらのコンテナーの構成を指示することです。ECSサービスは、Dockerコンテナーを開始するタスクを実行します。

VMTurbo.comでAmazonECSの紹介をご覧ください。

DockerSwarm

DockerのネイティブクラスタリングテクノロジーであるDockerSwarmを使用すると、仮想マシンのクラスター全体で複数のDockerコンテナーを実行できます。 Docker Swarmは、環境を管理し、コンテナーをさまざまなエージェントにデプロイし、クラスターのコンテナーステータスとデプロイメント情報を報告する仮想マシン上で実行されるマネージャーコンテナーを定義します。

Docker Swarmを実行する場合、マネージャーはDockerへの主要なインターフェイスです。エージェントは、仮想マシン上で実行される「Dockerマシン」であり、マネージャーに登録してDockerコンテナーを実行します。クライアントがコンテナーを開始する要求をマネージャーに送信すると、マネージャーはコンテナーを実行するために使用可能なエージェントを見つけます。使用率が最も低いアルゴリズムを使用して、実行するコンテナーの数が最も少ないエージェントが、新しく要求されたコンテナーを実行するようにします。図4は、次のセクションで開発するDockerSwarm構成のサンプルを示しています。

マネージャプロセスは、すべてのアクティブなエージェントとそれらのエージェントで実行されているコンテナを認識しています。エージェント仮想マシンが起動すると、それらはマネージャーに登録され、Dockerコンテナーを実行できるようになります。図4の例には、マネージャーに登録されている2つのエージェント(Agent1とAgent2)があります。各エージェントは2つのNginxコンテナーを実行しています。

DockerSwarmとAmazonECS

この記事ではDockerSwarmを取り上げていますが、コンテナーテクノロジーを比較すると便利です。Amazon ECSは十分に開発されたターンキーソリューションを提供しますが、Docker Swarmを使用すると、独自のインフラストラクチャをさらに自由に構成できます。例として、Amazon ECSはコンテナーとロードバランサーの両方を管理しますが、Docker Swarmでは、Cisco LocalDirector、F5 BigIp、ApacheまたはNginxソフトウェアプロセスなどの負荷分散ソリューションを構成します。

すでにAWSでアプリを実行している場合、ECSを使用すると、外部ソリューションよりもDockerコンテナーの実行と管理がはるかに簡単になります。AWS開発者は、おそらくすでに自動スケーリンググループ、ELB、仮想プライベートクラウド(VPC)、IDおよびアクセス管理(IAM)の役割とポリシーなどを活用しています。ECSはそれらすべてとうまく統合されるので、それが進むべき道です。ただし、AWSで実行していない場合は、DockerSwarmとDockerツールの緊密な統合が最適です。

ハイブリッドクラウドのAWSとDockerSwarm

Amazon Web Services can be configured for very high availability, scalability, and performance, which is probably why it services 25% of all internet traffic, including the massively scaled Netflix services infrastructure. Recently, however, there's been a push toward hybrid cloud environments. A hybrid cloud is a cloud in which part of the application, or sometimes a full copy of it, runs in a public cloud like AWS, and part of it runs in a private cloud. A popular option in this case is to run OpenStack in a private data center.

A hybrid cloud is a safe strategy for a company that is moving some or all operations to the cloud, but needs to go slowly and gain confidence in public clouds. When you choose a hybrid cloud option, you need to create an abstraction layer on top of the underlying cloud technologies, which means you can just as easily deploy to Docker Swarm running on OpenStack in your own data center as you can to ECS running on AWS. Tools like Chef and Puppet can help by allowing you to define your environments abstractly, delegating to them to handle many of the differences between the different environments.

Getting Started with Docker Swarm

In the previous section you saw a sample architecture for a two-node Docker Swarm cluster. Now you'll develop that cluster using two Nginx Docker container instances. Nginx is a popular web server, publicly available as a Docker image on DockerHub. Because this article is focused on Docker Swarm, I wanted to use a Docker container that it quick and easy to start and straightforward to test. You are free to use any Docker container you wish, but for illustrative purposes I chose Nginx for this example.

My introduction to Docker includes a guide to setting up Docker in your development environment. If you've installed and setup the Docker Toolbox then it includes everything that you need to run Docker Swarm. See Docker's official documentation for further setup instructions.

Docker Swarm on the command line

以前にDockerを使用したことがある場合は、dockerコマンドラインを使用してコンテナーを開始および停止することに慣れています。Docker Swarmを使用する場合は、と交換dockerdocker-machineます。Docker Machineは、Dockerドキュメントで次のように定義されています。

Docker Machineは、仮想ホストにDocker Engineをインストールし、docker-machineコマンドを使用してホストを管理できるツールです。Machineを使用して、ローカルのMacまたはWindowsボックス、会社のネットワーク、データセンター、またはAWSやDigitalOceanなどのクラウドプロバイダーにDockerホストを作成できます。docker-machineコマンドを使用して、管理対象ホストを開始、検査、停止、再起動し、Dockerクライアントとデーモンをアップグレードし、ホストと通信するようにDockerクライアントを構成できます。

If you've installed Docker then your installation already includes Docker Machine. To get started with Docker Swarm, start Docker and open a terminal on your computer. Execute the following docker-machine ls command to list all the VMs on your local machine:

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376 

If you've only run Docker from your local machine, then you should have the default Docker virtual machine running with an IP address of 192.168.99.100. To conserve resources on your local machine you can stop this virtual machine by executing: docker-machine stop default.

Create a swarm

A Docker swarm consists of two or virtual machines running Docker instances. For this demo, we'll create three new virtual machines: manager, agent1, and agent2. Create your virtual machines using the docker-machine create command:

$ docker-machine create -d virtualbox manager $ docker-machine create -d virtualbox agent1 $ docker-machine create -d virtualbox agent2 

このdocker-machine createコマンドは、新しい「マシン」を作成します。-d引数を渡すと、マシンの作成に使用するドライバーを指定できます。ローカルで実行している場合は、である必要がありますvirtualbox。作成される最初のマシンはmanager、マネージャプロセスをホストするです。最後の二つのマシン、agent1およびはagent2、エージェント・プロセスをホストするエージェントマシンです。

この時点で、仮想マシンは作成されていますが、実際のSwarmマネージャーまたはエージェントは作成されていません。仮想マシンとその状態を表示するには、docker-machine ls次のコマンドを実行します。

 $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS agent1 - virtualbox Running tcp://192.168.99.101:2376 v1.11.1 agent2 - virtualbox Running tcp://192.168.99.102:2376 v1.11.1 default - virtualbox Stopped Unknown manager * virtualbox Running tcp://192.168.99.100:2376 v1.11.1