開発者ドキュメント

Ubuntu16.04でRancherを使用してNode.jsとMongoDBアプリケーションをデプロイする方法

序章

Rancher は、本番環境でコンテナーを実行および簡単に管理するための、オープンソースの自己ホスト型の完全なプラットフォームです。 Dockerイメージ自体であるため、RancherサーバーはDockerが使用可能なすべてのLinuxホストで動作します。

ランチャーを魅力的なソリューションにする主な機能のいくつかは次のとおりです。

このガイドでは、 MongoDB を使用したデータストレージをサポートする、負荷分散されたNode.jsアプリケーションをデプロイするためのRancherクラスターを構築します。

このチュートリアルの最後に、単純なNode.jsアプリケーションの4つの負荷分散されたインスタンスと、永続ストレージ用の個別のデータコンテナーを備えたMongoDBサーバーがあります。

前提条件

また、コンテナー、イメージ、DockerファイルなどのDockerの概念の基本的な知識も必要です。 Dockerの使用方法の詳細については、 Ubuntu16.04にDockerをインストールして使用する方法を参照してください。

ステップ1—Node.jsアプリケーションを探索する

このチュートリアルでは、Hapi.jsフレームワークに基づく単純なNode.jsアプリケーションを使用して、メッセージを受信して記録し、以前に送信されたすべてのメッセージを一覧表示します。 アプリケーションがどのように機能し、構成値を受け取る方法を調べて、イメージを作成するときにDockerでそれらの値を設定できるようにします。

サーバーではなく、ローカル開発マシンでアプリケーションとDockerイメージを準備します。

次のコマンドを使用して、サンプルアプリケーションをローカルマシンにクローンします。

  1. git clone https://github.com/do-community/hapi-example

次に、プロジェクトディレクトリに移動します。

  1. cd hapi-example

アプリケーションのメインファイルを見てみましょう。 server.js. これには、MongoDB接続とサーバーを初期化するためのコードが含まれています。 このファイルをローカルのテキストエディタで開くと、次の内容が表示されます。

server.js
const Hapi = require('hapi');
const mongojs = require('mongojs');

// Loads environment variables
// Used only in development
require('dotenv').config({silent: true});

const server = new Hapi.Server();
server.connection({ port: process.env.PORT || 3000 });

// Connect with the database
server.app.db = mongojs(process.env.MONGO_HOST + '/api');

// Add the routes
server.register(require('./routes'), (err) => {

  if (err) {
    console.error('Failed to load plugin:', err);
  }

  // Start the server
  server.start((err) => {
    if (err) {
      throw err;
    }

    console.log('Server running at:', server.info.uri);
  });
});

このチュートリアルでは、スペースを節約するためにルートのコードがHapi.jsプラグインとしてカプセル化されていますが、興味がある場合は、ファイルを確認してください。 routes.js.

の重要な部分 server.js ファイルは次のとおりです。

server.js
require('dotenv').config({silent: true});

これは dotenv から環境変数をロードするNode.jsパッケージ .env ファイル。 のドキュメントを確認できます dotenv 動作に興味がある場合は、Githubリポジトリにパッケージ化してください。 このファイルには、開発プロセスのためだけに変数を保存します。 ターミナルで変数を手動で書き込むよりも簡単です。 本番環境では、Rancherを介してDockerから変数を取得します。

次に、と呼ばれる環境変数を使用して、サーバーのポートを設定します PORT、フォールバック値は 3000、変数が定義されていない場合:

server.js
server.connection({ port: process.env.PORT || 3000 });

ポート 3000 Node.jsアプリケーションの一般的な規則です。 この値は必要に応じて変更できます。 唯一の要件は、1023より上で65535より下である必要があることです。

最後に、ルートを読み込んでサーバーを起動する前に、MongoDBサーバーに接続します。 MONGO_HOST:

server.js
server.app.db = mongojs(process.env.MONGO_HOST + '/api');

この環境値は、MongoDBコンテナーを作成すると、MongoDBサーバーのホスト名を使用してRancherを介して定義されます。 値 api は接続するデータベースの名前であり、データベースが存在しない場合は自動的に設定されます。

アプリが何を探しているのか、ポートとデータベース接続をどのように構成するのかについての背景がわかったところで、Dockerを紹介しましょう。

ステップ2—Dockerイメージを構築する

RancherはDockerイメージを使用してアプリケーションをサーバーにデプロイするので、アプリケーション用のDockerイメージを作成しましょう。 アプリのDockerイメージを作成するには、次のファイルが必要です。 Dockerfile これには、イメージをビルドするときにDockerが実行する一連の手順が含まれています。 このファイルは、複製したアプリケーションリポジトリにすでに含まれています。 その内容を見て、どのように機能するかを理解しましょう。 テキストエディタで開くと、次のコードが表示されます。

Dockerfile
FROM node:6
MAINTAINER James Kolce <contact@jameskolce.com>

RUN mkdir -p /usr/api
COPY . /usr/api
WORKDIR /usr/api
RUN npm install --production

ENV PORT 3000
EXPOSE  $PORT

CMD ["npm", "start"]

各ステップを詳しく見ていきましょう。 まず、次の行が表示されます。

Dockerfile
FROM node:6

この行は、DockerHubの公式Node.jsイメージの上にイメージが構築されていることを宣言しています。アプリはその中でのみ利用可能なES6機能を使用しているため、Node.jsのバージョン6を選択しています。バージョン以上。 アプリを壊す可能性のある変更を回避するために、本番環境で latest を使用するのではなく、特定のバージョンを選択することをお勧めします。

その行の後に、作業ディレクトリを設定します。

Dockerfile
RUN mkdir -p /usr/api
COPY . /usr/api
WORKDIR /usr/api

まず、 mkdir と呼ばれる新しいディレクトリを作成するコマンド /usr/api、これは私たちのアプリケーションが存在する場所です。 The -p フラグはそれを意味します mkdir 必要に応じて中間ディレクトリを作成します。 次に、画像の内容をそのディレクトリにコピーします。 次に、この新しいディレクトリを作業ディレクトリとして設定し、後続のコマンドがそのディレクトリから実行されるようにします。

次の行は npm コマンドを実行し、アプリの本番依存関係をインストールします。

Dockerfile
RUN npm install --production

次に、次の2行が表示されます。

Dockerfile
ENV PORT 3000
EXPOSE  $PORT

最初の行は、と呼ばれる環境変数を定義します PORT これをアプリケーションがリスニングポートに使用します。 この変数が定義されていない場合に備えて、 3000 デフォルト値として。 次に、そのポートを公開して、コンテナの外部からアクセスできるようにします。 環境変数を使用すると、アプリケーションコードを書き直すことなく、これを簡単に変更できます。 また、アプリケーションはこれらの環境変数を使用するように設計されていることを忘れないでください。

Dockerfileの最後のステップでは、Node.jsサーバーを実行します。 npm start 指図:

Dockerfile
CMD ["npm", "start"]

このファイルからアプリケーションのDockerイメージを作成するには、 hapi-example ターミナルのフォルダを開き、次のコマンドを実行します。

  1. docker build -t your_dockerhub_username/hapi-example .

このコマンドは、を使用してDockerイメージを作成します Dockerfile. コマンドの最後にあるドットに注意してください。 これは、へのパスを指定します Dockerfile、現在のフォルダにあります。 The -t フラグは画像のタグを設定し、使用します your_dockerhub_username/hapi-example タグの場合、これは画像に適用するラベルであり、画像からコンテナインスタンスを作成するために使用できます。 テスト後にこのイメージを公開する準備をしているため、Docker Hubのユーザー名をプレフィックスとして使用します。また、DockerイメージのローカルタグはDockerHubのリポジトリ名と一致する必要があります。

:メッセージを受信した場合 Cannot connect to the Docker daemon. Is the docker daemon running on this host? このコマンドを実行するときは、Dockerアプリが実行されていること、およびDockerが起動していることを確認してください。 その後、コマンドを再実行してください。

次に、作成したイメージをテストして、すべてが期待どおりに機能していることを確認します。 前に見たように、アプリケーションはMongoDBに依存しているので、アプリがデータを格納するために使用できるMongoDBコンテナーを作成しましょう。 次のコマンドを実行して、公式のMongoDBDockerイメージに基づいてMongoDBコンテナーを作成して開始します。

  1. docker run --name testdb -p 27017:27017 -d mongo:3

コンテナに一時的な名前を割り当てます。 --name オプション; アプリケーションのテストが終了したら、その名前を使用してサーバーを停止します。 ホストポートもバインドします 27017 ローカルWebブラウザーを使用して、MongoDBが実行されていることをテストできるように、コンテナーによって公開されているポートに接続します。 最後に、使用する画像を指定します。 アプリケーションが開発されたのと同じバージョンのMongoDBを使用して、すべてが期待どおりに機能することを確認することをお勧めします。この場合、バージョンを指定します。 3.

そのコマンドを実行した後、 http://localhost:27017 ブラウザに次のメッセージが表示されます。 It looks like you are trying to access MongoDB over HTTP on the native driver port これは、MongoDBが実行されていることを意味します。

次に、アプリケーションコンテナーを実行し、次のコマンドを実行して、アプリケーションコンテナーをMongoDBコンテナーにリンクします。

  1. docker run --name hapi-app -p 3000:3000 -d -e MONGO_HOST=testdb --link testdb your_dockerhub_username/hapi-example

このコマンドは、MongoDBコンテナーを起動するために使用したコマンドに似ていますが、今回はアプリケーションイメージを使用します(your_dockerhub_username/hapi-example)およびマップポート 3000 コンテナによって公開されたポートを持つホストの。 これは、作成時に使用したものと同じポートです。 Dockerfile. また、という環境変数を追加します MONGO_HOST これは、アプリケーションがデータベースサーバーに接続するために使用するMongoDBコンテナーの名前を指定します。 The --link testdb パラメータを使用すると、データベースコンテナの名前をアプリケーションのコンテナ内のホストとして使用できます。

コマンドを実行した後、次のWebサイトにアクセスしてアプリケーションをテストします。 http://localhost:3000 ブラウザで。 エラーなしで空のページが表示されるはずです

:空の配列が表示される場合もあります([ ])または訪問したときのFirefoxのJSONビュー http://localhost:3000. これらの結果はどちらも問題ありません。

Dockerイメージがローカルで機能することが証明されたので、ローカルコンテナーを停止して削除しましょう。 コンテナを削除することは、画像を削除することと同じではないことに注意してください。 イメージはそのまま残り、後でコンテナを再作成したり、イメージをランチャーにプッシュしたりできます。これは、ローカル環境をクリーンアップした後に実行します。

まず、前に定義した名前を使用してデータベースコンテナを停止します。

  1. docker stop testdb

コンテナが停止したので、もう必要ないので、マシンからコンテナを削除できます。

  1. docker rm testdb

アプリケーションコンテナに対して同じ手順を繰り返します。 最初に停止してから削除します。

  1. docker stop hapi-app && docker rm hapi-app

それでは、Rancherで使用できるように、作業イメージを公開しましょう。

ステップ3—イメージをDockerHubにアップロードする

Rancherを使用してコンテナーをデプロイするには、 Dockerレジストリにアクセスする必要があります。ここで、Dockerイメージを格納するためのリポジトリを作成できます。 Dockerの公式レジストリであるDockerHubを使用します。 Docker Hubは、パブリックリポジトリに無料で使用できます。

ユーザー名とパスワードを使用してDockerHubにログインします。 ログインしたら、画面右側のリポジトリ作成ボタンをクリックします。 次のようにフィールドに入力します。

:リポジトリをプライベートとして設定する場合は、RancherUIのインフラストラクチャ->レジストリページでDockerHubのクレデンシャルを追加する必要があります。

すべての必須フィールドに入力したら、作成ボタンをクリックします。 プロセスが完了すると、新しいリポジトリサイトにリダイレクトされます。

Dockerイメージをアップロードするには、DockerHubにログインする必要があります。 docker 指図。 ターミナルに戻り、次のコマンドを実行します。

  1. docker login

ユーザー名とパスワードの入力を求められます。 ほとんどのCLIツールと同様に、入力時にパスワードは表示されません。

ログインしたら、次のコマンドを使用してイメージをDocker Hubにアップロードします。このコマンドにより、すべてのファイルがリポジトリにアップロードされます。

  1. docker push your_dockerhub_username/hapi-example

ローカルインターネット接続によっては、画像のプッシュに数分かかる場合があります。 画像が正常に公開されたら、Rancherを使用してホストを設定できます。

ステップ4—Rancherでのホストサーバーの作成とラベル付け

Rancherを使用して、サービスを展開するために必要なすべてのホストを作成しましょう。 Node.jsアプリケーション用に2つ、MongoDBサーバー用に1つ、ロードバランサー用に1つ必要です。 DigitalOceanのAPIを使用して、RancherUI内でこれらすべてを実行します。

にアクセスして、ブラウザでランチャーインターフェイスにアクセスします http://your_rancher_ip_address 次の手順に従って、必要な4つのホストを作成します。

  1. インフラストラクチャ>ホストに移動し、ページ上部のホストの追加ボタンをクリックします。
  2. ホストプロバイダーとしてDigitalOceanを選択します。
  3. 生成したDigitalOceanアプリケーショントークンをアクセストークンフィールドに貼り付け、次へ:ドロップレットの構成をクリックします。
  4. 名前を割り当てます。 入る host、から名前を自動的に生成します host1host4.
  5. 数量スライダーを4ホストに移動します。
  6. Image には、デフォルト値の Ubuntu 16.04.1×64を使用します。
  7. サイズには、デフォルト値の 1gb RAM、30gbディスク、1vCPUを使用します。
  8. SSHUserフィールドはrootのままにしておくことができます。
  9. 作成ボタンをクリックし、サーバーが作成されてランチャーに追加されるまで数分待ちます。

ランチャーがすべてのホストの作成を完了したら、各ホストにラベルを追加してタイプを分類し、各コンポーネントを配置する場所を整理できるようにします。 ホストにラベルを付けることで、サーバーのタイプに応じてサーバーを拡張することもできます。 たとえば、アプリケーションに対する需要が多すぎる場合は、そのタイプのサーバーの数を増やすことができ、Rancherは適切なDockerコンテナーを自動的にデプロイします。 作成するラベルは次のとおりです。 loadbalancer, applicationdatabase.

最初のラベルを作成しましょう、 loadbalancer.

  1. インフラストラクチャ>ホストに移動し、最初のホストを選択します。 host1.
  2. オプションボタン(ページ上部に縦に3つの点があるアイコン)をクリックし、編集オプションを選択します。
  3. +ラベルの追加ボタンをクリックし、キー入力に単語を入力します type、次に入力します loadbalancer Value入力で。
  4. 保存ボタンをクリックします。

:ホストは次のように表示される場合があります host1.localdomain; これは正常な動作であり、環境によって変わる可能性があります。

次に、アプリケーションホストにラベルを付けます。 次の2つのホストで前のプロセスを繰り返しますが、今回は application Value入力で。

最後のホストについては、プロセスをもう一度繰り返しますが、 database Value入力で。

4つのホストすべてにラベルが付いているはずなので、サービスを設定しましょう。 データベースから始めましょう。

ステップ5—MongoDBサーバーをデプロイする

DockerHubの公式MongoDBDockerイメージを使用して、データベースサーバーをデプロイします。 MongoDBコンテナーには、すべてのデータを格納するためのsidekickコンテナーもあります。 両方のコンテナは、次のラベルが付いたホストにデプロイされます database.

これを行うには、Rancherユーザーインターフェイスで次の手順に従います。

  1. スタックメニューを選択し、ユーザーオプションを選択して、サービスの定義ボタンをクリックします。
  2. サービスの追加ページで、スケールスライダーが1コンテナーの実行に設定されていることを確認します。
  3. サービスの名前には、 MongoDB.
  4. 画像には、次のように入力します mongo:3.
  5. 上部のサイドキックコンテナの追加ボタンをクリックします。
  6. この新しいコンテナに名前を付けます Data. このコンテナーは、MongoDBデータを格納するためのボリュームとして使用されます。
  7. このコンテナはデータのみに使用するため、 busybox 画像。
  8. 下のコマンドタブで、 AutorestartオプションをNever(Start Once)に切り替えます。これは、このコンテナーをストレージにのみ使用するためです。
  9. ボリュームタブに切り替え、ボリュームの追加ボタンをクリックして新しいボリュームを追加します。 入る /data/db 表示されるテキストフィールドに入力します。 これは、MongoDBがデータを保存するデフォルトのパスです。
  10. Scheduling タブに切り替え、 Add Schedule Rule ボタンをクリックして、次のパラメーターを入力します。 The Host must have a host label of type = database. ドロップダウンを使用して、このルールを作成します。
  11. MongoDB サービスタブをクリックし、 Command タブまでスクロールダウンして、AutorestartオプションがAlwaysに設定されていることを確認します。
  12. Volumes タブに切り替え、 VolumesFromオプションでDataを選択します。
  13. Scheduling タブに切り替えて、次のパラメーターを使用して新しいスケジューリングルールを追加します。 The Host must have a host label of type = database
  14. 最後に、下部にある作成ボタンをクリックし、サービスがアクティブになるまで数分待ちます。

次に、アプリケーションサービスを構成しましょう。

ステップ6—Node.jsアプリケーションのデプロイ

同様のアプローチを使用して、前に準備したNode.jsアプリケーションをデプロイします。 Docker Hubに保存したイメージは、ラベルの付いたホストにデプロイされます application、およびデータを保存してアクセスするためにMongoDBサービスにリンクされます。 したがって、Rancherユーザーインターフェイスで次の手順に従います。

  1. スタックメニューを選択し、ユーザーオプションを選択してから、デフォルトスタックのサービスの追加ボタンをクリックします。
  2. Scale セクションで、オプション常にこのコンテナーの1つのインスタンスをすべてのホストで実行するオプションを選択します。
  3. このサービスに使用する名前は次のとおりです。 NodeJS.
  4. イメージには、DockerHubにデプロイしたイメージを使用します。 入る your_dockerhub_username/hapi-example.
  5. Service Links ボタンをクリックし、 Destination Service を選択して、MongoDBを選択します。 次に、名前としてを選択し、次のように入力します db、だから私たちの NodeJS サービスは、この名前を使用してMongoDBサービスにアクセスできます。
  6. ページ下部のコマンドタブで、環境変数の追加ボタンをクリックし、次の名前の変数を追加します。 MONGO_HOST の値で db、前の手順で使用した宛先サービス名にマップされます。 私たちのアプリケーションは、データベースサーバーを見つけるためにこの環境変数に依存していることを忘れないでください。
  7. Scheduling タブに切り替え、 Add Scheduling Rule ボタンをクリックし、ドロップダウンを使用して、次のようなルールを作成します。 The Host must have a host label of type = application.
  8. 最後に、 [作成]をクリックして、Rancherがサービスをセットアップするのを待ちます。

すぐに、新しいことがわかります NodeJS サービスは2つのコンテナを立ち上げました。 インフラストラクチャメニューを選択し、ホストをクリックすると、両方のホストにラベルが付いていることがわかります。 application 現在、この新しいサービスを実行しています。 複数あるので、これらのホストの両方を効果的に使用できるようにロードバランサーを設定しましょう。

ステップ7—ロードバランサーのデプロイ

ロードバランサーは NodeJS アプリケーションホスト全体のすべてのコンテナ間でワークロードのバランスを取るためのサービス。

  1. ロードバランサーを作成するには、 Stacks メニューを選択し、Userオプションを選択します。 今回は、サービスの追加ボタンの横にある矢印をクリックし、ドロップダウンリストからロードバランサーの追加を選択します。
  2. 名前に次のように入力します LoadBalancer.
  3. ポートルールセクションで、リクエストホストポート(最初のポートフィールド)を次のように設定します。 80、およびターゲットポート(2番目のポート)から 3000 これが私たちの港です NodeJS コンテナが露出しています。
  4. ターゲットサービスオプションで、最近作成したサービスであるNodeJSを選択します。
  5. ページ下部のSchedulingタブで、 Add Scheduling Rule ボタンをクリックして、次のようなルールを作成します。 The Host must have a host label of type = loadbalancer.
  6. 最後に、 [作成]をクリックして、Rancherがサービスをアクティブ化するまで待ちます。

サービスを作成するたびに、作成したラベルを使用して、サービスの展開方法を決定しました。 これにより、将来、追加のホストを簡単に管理できるようになります。 それでは、物事が機能することを確認しましょう。

ステップ8—アプリケーションのテスト

アプリケーションをテストするには、ロードバランサーホストのアドレスを取得する必要があります。 LoadBalancer サービスを選択すると、ポートタブにIPアドレスが表示されます。

アプリケーションが機能していることをテストするには、ターミナルで次のコマンドを実行します。

curl your_load_balancer_ip

このコマンドは、サーバーにGET要求を送信します。 空の配列を含む応答が表示されます([])データベースが空であるため。

次のコマンドを実行してデータベースにメッセージを追加し、アプリケーションがデータを保存できることを確認します。

curl -i -X POST -H "Content-Type:application/json" your_load_balancer_ip -d '{"message":"This is a test"}'

このコマンドは、POSTリクエストを以下を含むJSONオブジェクトとともにサーバーに送信します。 message の値を持つキーこれはテストです。 リクエストを送信した後、レスポンスとして送信したのと同じメッセージと、 _id MongoDBから。 これは、MongoDBサーバーとの接続が機能しており、アプリケーションがデータを保存したことを意味します。

このアプリケーションは、 message キー、他の名前は破棄されます。

ここで、アプリケーションが正しく機能することを再確認するために、最初のコマンドを再度実行すると、前の手順で追加したメッセージが表示されます。

curl your_load_balancer_ip

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

HTTP/1.1 200 OK
content-type: application/json; charset=utf-8
cache-control: no-cache
content-length: 61
Date: Wed, 05 Jan 2017 20:07:02 GMT
Connection: keep-alive

{"message":"This is a test","_id":"e64d85579aee7d1000b075a2"}

警告:このサンプルアプリケーションは安全ではありません。 アドレスとAPIを知っている人なら誰でも、システムにメッセージを追加できます。 このチュートリアルが終了したら、Rancherでサービスを削除して、このアプリケーションを無効にすることをお勧めします。

この時点で、2つのアプリケーションサーバー、データベース、およびロードバランサーが構成され、使用できるようになります。 より多くのトラフィックを処理するためにサービスを拡張する方法を見てみましょう。

ステップ9—Node.jsサーバーのスケーリング

アプリケーションが多くの需要を獲得し始め、サーバーが負荷を処理できない場合、Node.jsサーバーの数を増やすことができ、負荷はアプリケーションホスト全体のコンテナー間で自動的に分散されます。 次の手順に従って、アプリケーションをスケーリングします。

  1. インフラストラクチャ>ホストページに移動し、ホストの追加ボタンをクリックします。
  2. 同じ名前のフィールドにDigitalOceanアクセストークンを追加します。
  3. 使用する host5 最初の新しいホストの名前として、最後に作成したホストは host4. 2つの新しいホストを作成するため、Rancherは次のホストに自動的に名前を付けます。 host6.
  4. 必要な数量を選択します。 この場合、2ホストを追加します。
  5. Image には、デフォルト値の Ubuntu 16.04.1×64を使用します。
  6. サイズには、デフォルト値の 1gb RAM、30gbディスク、1vCPUを使用します。
  7. ラベルの追加ボタンをクリックし、キー入力に次のように入力します type、次に入力します application Value入力で。
  8. 作成ボタンをクリックし、新しいホストがアクティブ化されてランチャーに追加されるまで待ちます。

新しいホストがオンラインになった後、それらはアプリケーションホストとしてラベル付けされているため、 NodeJS アプリケーションは自動的に構成およびデプロイされ、ロードバランサーは4つのホスト間で4つのコンテナー間でワークロードを分散します。

結論

このチュートリアルでは、MongoDBを使用したデータストレージをサポートする機能的なNode.jsアプリケーションを準備、デプロイ、スケーリングする方法を学びました。 ご覧のとおり、RancherとそのGUIを使用すると、プロセスは非常に直感的であり、完全なアプリケーションを簡単にスケーリングできます。 また、Rancherのスケジューリング機能のおかげで、アプリが大ヒットしたときに、負荷を簡単に処理できるようになります。

モバイルバージョンを終了