Dockerの複数のコンテナーにNode.jsアプリをセットアップしようとしています。私のアプリは現在、1つのUbuntu DOドロップレット上にあり、次のものを使用しています。
明らかに各コンテナに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
私はこれを使用しています 単純なプロジェクト ベースとして使用していますが、私のアプリは必要です
Docker-composeパーツを構成する前に、システムのアーキテクチャーを決定する必要があります。
あなたが持っている部品-
追加のインフラストラクチャに関する考慮事項-
すべてのコンポーネントを実行する単一のインスタンスの場合、おそらくロードバランサーは必要ありません。したがって、アプリケーションと一緒に静的ファイルを提供する必要がない限り、ここで持つ意味はほとんどありません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 をよく見て助けを求めることをお勧めします。
Nginxとnodejsを別々のインスタンスに分割する必要はないと思います。現在、dockerでnodejsもセットアップしているので、すぐにここに戻って、質問に対して複雑な回答をしようとします。
そこで、dockerで同様のアーキテクチャをセットアップすることに関する有用な記事を見つけることができます http://blog.stxnext.com/posts/2015/01/development-with-docker-and-fig/ 、違いDjango/nodejsは問題にならないはずです。