16

Docker の複数のコンテナーで Node.js アプリをセットアップしようとしています。私のアプリは現在、1つのUbuntu DOドロップレットにあり、次を使用しています:

  1. Node.js (エクスプレス 4)
  2. アプリ データベースの mysql
  3. キー値ストアの redis
  4. nginx を使用して負荷分散を行い、静的ファイルを提供します。

コンテナーごとに 1 つずつ、さまざまなパーツを Docker 化する必要があります。それから、Docker-Compose (以前は Fig として知られていた) を使用して、さまざまなコンテナーを単純に記述し、それらの間のリンクをセットアップします。マルチコンテナのアプローチについてはよくわかりません。
nginx 用に
1 つ、Node.js 用に 1 つ、エクスプレス アプリ用
に 1 つ、MySql 用
に 1 つ、Redis 用に 1 つ

Docker-compose.yml はどのようになりますか? nginx、mysql、redis は変更されていない公式イメージになると思いますか? node.js には Dockerfile を指すビルド ディレクティブがありますが、node.js の公式イメージと構成手順に基づいていることに注意してください。たとえば、mysql と redis を構成/プロビジョニングする必要があるため、それぞれが独自の Dockerfile で分離する必要があるということですか?

コンテナ間をリンクするにはどうすればよいでしょうか。ボリュームを使用してファイルをコピーし、ポートを設定し、hosts ファイルを調整して some.domain.com を nginx IP にマップしますか?

次に、nodemon や PM2 などのいくつかの npm パッケージをグローバルにインストールし、いくつかの cron ジョブを設定する必要があります... (Node.js コンテナー上で?)

これが最初のドラフトです。この新しいセットアップをよりよく理解するために、何か助けていただければ幸いです。

Docker-compose.yml

nginx:
  image: nginx
  links:
    - "node"

node:
  build: .
  volumes:
    - "app:/src/app"
  ports:
    - "3030:3000"
  links:
    - "db:mysql"

db:
  image: mysql:5.6
  environment:
    - MYSQL_ROOT_PASSWORD=mypassword

Dockerfile

FROM node:0.12

RUN mkdir /src

RUN npm install nodemon pm2 -g

WORKDIR /src

ADD app/package.json /src/package.json

RUN npm install

ADD app/nodemon.json /src/nodemon.json

EXPOSE 3000

CMD npm start

この単純なプロジェクトをベースとして使用していますが、アプリには必要です

4

2 に答える 2

27

docker-compose 部分を構成する前に、システムのアーキテクチャを決定する必要があります。

あなたが持っている部品 -

  • ポート 3306 でリッスンする MySQL 実行可能バージョン X
  • ディスクに保存されたMySQLデータ
  • ポート 6379 でリッスンする Redis 実行可能バージョン Y
  • ディスク上のRedis バックアップデータ
  • ポート 3000 でリッスンする Node.js 実行可能バージョン Z
  • Express.js アプリケーションのファイル
  • ポート 80 でリッスンする Nginx 実行可能バージョン Q

追加のインフラストラクチャに関する考慮事項 -

  • 単一インスタンス、1 CPU/コア
  • 単一インスタンス、複数の CPU/コア
  • 複数のインスタンス
  • どのロードバランサーが使用されているか (使用されている場合)

すべてのコンポーネントを実行する単一のインスタンスの場合、おそらくロード バランサーも必要ありません。そのため、アプリケーションと一緒に静的ファイルを提供する必要がない限り、nginxを使用する意味はほとんどありません。何もしないからです。使える。

Express.js アプリケーションを 1 つのインスタンス (マルチコア/CPU の場合) または複数のインスタンスで実行する複数のコンテナーがある場合、おそらく nginx を使用して、何らかの負荷分散を行う必要があります。

コンテナーのファイルシステムは高度に変化するデータの処理に適していないため、コンテナー内でデータを処理することはお勧めしません。そのため、MySQL と Redis の場合、おそらくデータが存在する外部マウント ポイントが必要になるでしょう。

Express.js アプリケーションには、接続する必要がある Redis および MySQL サーバーの構成が必要です。これは、Docker リンクを使用して行うことができます。

したがって、Docker Compose は次のようになります。

redis:
  image: redis
  volumes:
    - /data/redis:/data

mysql:
  image: mysql:5.6
  environment:
    - MYSQL_ROOT_PASSWORD=verysecret
  volumes:
    - /data/mysql:/var/lib/mysql

application:
  image: node:0.12
  working_dir: /usr/src/myapp
  volumes:
    - /src/app:/usr/src/myapp
  ports:
    - 80:3000
  links:
    - redis
    - mysql

これは、MySQL と Redis のデータを のホスト ファイルシステムに格納し、ホスト ファイルシステム/dataのアプリケーションが にあると仮定しています/src/app

https://docs.docker.com/compose/yml/で使用できるさまざまなオプションすべてについて、Docker Compose YAML ファイル リファレンスを探すことをお勧めします。

使用されるイメージは Docker HUB からの祝福されたイメージであるため、詳細な構成のためにそれらの readme ファイルに注意することが重要です -

アプリケーションのインスタンスを追加するのは簡単ですが、nginx を追加して、着信トラフィックを複数のアプリケーション コンテナーに負荷分散する必要があります。

次に、複数のホストを使用してこの種のセットアップを実行する場合、docker-links が機能せず、コンテナーの IP アドレスとポートを検出する別の方法が必要になるため、はるかに複雑になります。また、ロード バランサーには、アプリケーションの複数のインスタンスのトラフィックを受け入れる単一のエンドポイントが必要になります。ここで、 https://consul.ioをよく見て助けを求めることをお勧めします。

于 2015-03-01T13:06:38.770 に答える