web-dev-qa-db-ja.com

Docker + fig / compose + nginx + node.js + mysql + redis

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

  1. Node.js(Express 4)
  2. アプリデータベースのmysql
  3. key-Valueストアのredis
  4. 負荷分散と静的ファイルの提供のためのnginx。

明らかに各コンテナに1つずつ、さまざまなパーツをドッキングする必要があります。次に、Docker-Compose(以前はFigと呼ばれていました)を使用して、さまざまなコンテナを簡単に記述し、それらの間のリンクを設定します。マルチコンテナのアプローチについてはよくわかりません。
nginx用に1つ
Node.jsと私のエクスプレスアプリ用に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

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

15
Ajar

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

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

  • ポート3306でリッスンしているMySQL実行可能バージョンX
  • ディスクに保存されたMySQLdata
  • ポート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リンクを使用して行うことができます。

したがって、DockerComposeは次のようになります-

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にあることを前提としています。

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

使用されるイメージはDockerHUBからのblessedイメージであるため、それらのreadmeファイルはより多くの構成のために注意することが重要です-

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

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

26
Evgeny

Nginxとnodejsを別々のインスタンスに分割する必要はないと思います。現在、dockerでnodejsもセットアップしているので、すぐにここに戻って、質問に対して複雑な回答をしようとします。

そこで、dockerで同様のアーキテクチャをセットアップすることに関する有用な記事を見つけることができます http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/ 、違いDjango/nodejsは問題にならないはずです。

0
Damian Gądziak