世界を旅して人生を楽しもう。SwarmでDockerコンテナのオーケストレーション入門アプリケーションをDockerコンテナとして、本番環境で稼働させるにはオーケストレーションツールは無くてはならないものです。Swarmを使って、Dockerコンテナをオーケストレーションする方法を紹介します。関連記事はじめにDockerコンテナを開発環境や実証実験で使う機会は圧倒的に増えてきました。Composeを使いこなすエンジニアは増えました。次のステップとして、Dockerコンテナを本番環境に導入することを考えると思いますが、その場合はDockerコンテナのオーケストレーションを考える必要が出てきます。現状のDockerオーケストレーションツールのデファクトスターンダードはGoogle社のKubernetesですが、今回はDocker社がDockerネイティブとしてサポートしているSwarmを使う方法をDockerオーケストレーションの入門として紹介します。Machineとは、任意のホストの仮想環境上にDockerエンジンの実行環境を構築するプロビジョニングツールです。MacをインストールすることでDockerエンジンをローカルで実行し、そのDockerエンジン上でDockerコンテナを稼働させることになると思います。この仕組みにより、ドライバー(仮想環境の種類)を指定することで、VirtualBox上でもAWS上でもAzura上でも、好きなホストの仮想環境上でDockerエンジンを動かし、Dockerコンテナンを稼働させることができます。Swarmとは、Dockerコンテナのオーケストレーションツールです。新しく入れるツールというのではなく、Dockerにネイティブで組み込まれており、Swarmモードをアクティブにすることで利用可能になります。今回のメイントピックなので、細かい説明は抜きにして、次の章から手を動かしてい理解していきましょう。Machineを作り、Swarmのノード上にNginxのサービスをいくつか立ち上げてみましょう。事前に、Swarmのノードの構成が書かれた公式ドキュメントや、Swarmのサービスの構成が書かれた公式ドキュメントあたりに目を通しておくと理解が深まります。以下がインストールされている必要があります。MacVirtualBox細かいバージョンは「環境」を参照してください。Machineで「swarm-manager」という名前のノードを作り、Swarmモードを有効にします。MachineのデフォルトのドライバーはVirtualBoxなので、ノードはVirtualBox上に作成されます。18.06.1-ce「swarm-manager」ノードのSwarmがアクティブになり、Leaderになっていることが確認できます。これでマネージャーノードは完成です。Swarm用のワーカーノードを作る次に、ワーカーノードを2台(「swarm-wocker1」と「swarm-wocker2」)を作成し、Swarmのオーバーレイ・ネットワーク(ingressネットワーク)に追加します。追加したノードはSwarm内でルーティング・メッシュにより、自動的にロードバランスされます。先に「swarm-manager」ノード上でワーカーノードを追加するためのトークンを取得します。192.168.99.100:2377それから、ワーカーノードを作っていきます。18.06.1-ceこれで、「swarm-manager」というマネージャーノード1台、「swarm-worker1」と「swarm-worker2」のワーカーノード2台の構築が完了しました。Swarmビジュアライザーを追加するそれでは、ノード上にサービスを、、、と行きたいところですが、その前にSwarmの構成を可視化するツールであるSwarmビジュアライザーを導入してみましょう。swarm-manager192.168.99.100それでは、「192.168.99.100:8080」にアクセスしてみましょう。構築したSwarmの3台のノードと、マネージャーノード上にSwarmビジュアライザーが「viz」という名前のサービスとして起動していることが可視化されています。ちなみに、今回は「viz」というサービスとして起動しましたが、Swarmのサービスに含めたくない場合は、以下のように通常のコンテナとして起動することも可能です。dockersamples/visualizerこの場合はSwarmビジュアライザーにも表示されません。Swarmのノード上でサービスを作成するそれでは、Nginxのサービスを5つ作成してみましょう。(厳密にはSwarmではノード上の1つのアプリケーションを「タスク」と呼び、それをグループ化したものを「サービス」と呼んでいますが、この記事では便宜上、1つのアプリケーションを一般的な意味でサービスと表現しています。agoSwarmビジュアライザーで確認してみましょう。5つの「web」というサービスが各ノードに割り振られて作成され、稼働しています。各ノードのIPを確認して、Nginxが各ノード上で動いているかも確認してみましょう。swarm-worker2192.168.99.102「192.168.99.100:8000」にアクセスしてみましょう。「192.168.99.101:8000」にアクセスしてみましょう。「192.168.99.102:8000」にアクセスしてみましょう。全てのノード上でNginxのサービスが稼働していることが確認できました。scaleコマンドにより、サービスの数を自由に変更できます。今回は、5つある「web」のサービスを1つにしてみましょう。agoSwarmビジュアライザーで見てみましょう。サービスが1つに変更されていることが確認できました。この状態で、ブラウザで「192.168.99.100:8000」、「192.168.99.101:8000」、「192.168.99.102:8000」にアクセスすると、全てが同じサービスにルーティングされ、Nginxの画面が表示されます。ルーティング・メッシュが作成去れているからですね。サービスを削除する最後に、サービスを削除してみましょう。*:8080->8080/tcpSwarmビジュアライザーで確認します。「web」のサービスはきれいに削除されています。この状態で、ブラウザで「192.168.99.100:8000」、「192.168.99.101:8000」、「192.168.99.102:8000」にアクセスすると、当然「このサイトにアクセスできません」と表示されます。これでSwarmによるDockerオーケストレーションの基本は完了です。おまけ(AWSのEC2上でSwarmを実行する方法)ここまでは、ローカル環境で実施してきましたが、一歩進めてAWSのEC2上で同じことを実行してみましょう。amazonec2)だけでOKです。注意点としては、マネージャーノードは「2377」のポートを開放する必要があります。今回はSwarmビジュアライザー用に「8080」ポート、Webサーバ用に「8000」ポートを開放します。18.06.1-ceAWSコンソールからEC2インスタンスの状態を確認してみましょう。マネージャーノード1台、ワーカーノード2台がEC2インスタンスとして作成されていますね。Groupも確認してみましょう。想定通り、「2377」、「8080」、「8000」のポートが開放されています。Machineがデフォルトで使っているポートです。Swarmビジュアライザーを追加する先ほどと同じくSwarmビジュアライザーをサービスとして追加します。aws-swarm-manager152.90.91.140「52.90.91.140:8080」にアクセスしましょう。Swarmビジュアライザーが稼働していることが確認できました。サービスを作成する先ほどと同じく、Nginxのサービスを5つ作成してみましょう。aws-swarm-manager152.90.91.140「52.90.91.140:8080」にアクセスしましょう。サービスが想定どおりに稼働している事がわかります。ブラウザからサービスを表示してみましょう。aws-swarm-worker254.172.255.110「52.90.91.140:8000」にアクセスしましょう。「54.227.204.32:8000」にアクセスしましょう。「54.172.255.110:8000」にアクセスしましょう。問題なく動いていますね。Machineをきれいに削除して終わりにしましょう。ERRORSこれでAWSのEC2上のインスタンスもきれいに削除されました。Groupは残るので気をつけましょう。Swarmを使って、Dockerコンテナをオーケストレーションできるようになったことでしょう。最新の記事KD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。CLIにエイリアス(alias)を設定する方法AWS上のサービスを利用する場合、利便性の観点からもDevOpsの観点からもCLIを使いこなすことは有益です。2.0でdockerizeコマンドを使用可能にする方法Dockerのコンテナをコントロールするのによく使われるコマンドにdokerizeがあります。6日間ブートキャンプHerokuに入門したいエンジニア向けにこのブログの記事の中から厳選した記事を紹介します。HerokuはWe...データサイエンスのためのAnaconda環境構築とTensorflowのインストール方法(Docker編)データサイエンスのディープラーニング(深層学習)する上でAnacondaとTensorflowはもはや必須の知識となりま...初級JavascriptフルスタックエンジニアのためのReactとExpressの同時開発チュートリアル(Dockerコンテナ化してHerokuにデプロイ編)最近のアプリケーションはDocker上で稼働させるのが当たり前になりつつあります。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。AuthorKD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。0.0010このブログの運営のためにBitcoinでの寄付を募集しています。お気持ち程度の寄付を頂けると管理者の励みになります。最新の記事KD世界を旅し日本を愛するエンジニア。大学でコンピュータサイエンスの楽しさを学び、日本の大手IT企業で働く中で、新しい技術やスケールするビジネスが北米にある事に気づく。世界に挑戦するための最大の壁が英語であったため、フィリピン留学およびカナダ留学を経て英語を上達させた。現在は日本在住でエンジニアとして働きつつ、次の挑戦に備えて世界の動向を注視している。このブログでは、エンジニアやデザイナー向けの技術情報から、海外に留学したい人向けの留学情報、海外に興味がある人向けの海外旅行情報など、有益な情報を提供しています。CLIにエイリアス(alias)を設定する方法AWS上のサービスを利用する場合、利便性の観点からもDevOpsの観点からもCLIを使いこなすことは有益です。2.0でdockerizeコマンドを使用可能にする方法Dockerのコンテナをコントロールするのによく使われるコマンドにdokerizeがあります。6日間ブートキャンプHerokuに入門したいエンジニア向けにこのブログの記事の中から厳選した記事を紹介します。HerokuはWe...データサイエンスのためのAnaconda環境構築とTensorflowのインストール方法(Docker編)データサイエンスのディープラーニング(深層学習)する上でAnacondaとTensorflowはもはや必須の知識となりま...初級JavascriptフルスタックエンジニアのためのReactとExpressの同時開発チュートリアル(Dockerコンテナ化してHerokuにデプロイ編)最近のアプリケーションはDocker上で稼働させるのが当たり前になりつつあります。