Docker Composeを使用した開発用のNode.jsアプリケーションのコンテナー化

前書き

アプリケーションを積極的に開発している場合は、https://www.docker.com/ [Docker]を使用すると、ワークフローを簡素化し、アプリケーションを運用環境にデプロイするプロセスを簡素化できます。 開発中のコンテナを使用すると、次の利点があります。

  • 環境は一貫しているため、システムの競合を心配することなく、プロジェクトに必要な言語と依存関係を選択できます。

  • 環境が分離されているため、問題のトラブルシューティングや新しいチームメンバーの参加が容易になります。

  • 環境は移植性があり、コードをパッケージ化して他のユーザーと共有できます。

このチュートリアルでは、Dockerを使用してhttps://nodejs.org/[Node.js]アプリケーションの開発環境をセットアップする方法を示します。 Nodeアプリケーション用とhttps://www.mongodb.com/[MongoDB]データベース用の2つのコンテナをhttps://docs.docker.com/compose/[Docker Compose]で作成します。 このアプリケーションはNodeおよびMongoDBで動作するため、セットアップでは次のことを行います。

  • ホスト上のアプリケーションコードをコンテナ内のコードと同期して、開発中の変更を容易にします。

  • 再起動せずに、アプリケーションコードへの変更が機能することを確認します。

  • アプリケーションのデータ用にユーザーとパスワードで保護されたデータベースを作成します。

  • このデータを保持します。

このチュートリアルの最後に、Dockerコンテナーで実行される動作するサメ情報アプリケーションがあります。

image:https://assets.digitalocean.com/articles/node_docker_dev/persisted_data.png [サメの完全コレクション]

前提条件

このチュートリアルを実行するには、次のものが必要です。

手順1-プロジェクトの複製と依存関係の変更

このセットアップを構築する最初のステップは、プロジェクトコードを複製し、プロジェクトの依存関係を含むhttps://docs.npmjs.com/files/package.json [+ package.json +]ファイルを変更することです。 https://www.npmjs.com/package/nodemon [+ nodemon +]をプロジェクトのhttps://docs.npmjs.com/files/package.json#devdependencies [+ devDependencies +]に追加し、指定します開発中に使用します。 `+ nodemon +`でアプリケーションを実行すると、コードを変更するたびに自動的に再起動されます。

まず、https://github.com/do-community [DigitalOcean Community GitHubアカウントからhttps://github.com/do-community/nodejs-mongo-mongoose [`+ nodejs-mongo-mongoose +`リポジトリ]のクローンを作成します]。 このリポジトリには、https://www.digitalocean.com/community/tutorials/how-to-integrate-mongodb-with-your-node-application [MongoDBとノードアプリケーションを統合する方法]で説明されているセットアップのコードが含まれています。 Mongooseを使用して、MongoDBデータベースを既存のNodeアプリケーションと統合する方法を説明しています。

リポジトリを `++`というディレクトリにクローンします:

git clone https://github.com/do-community/nodejs-mongo-mongoose.git

`++`ディレクトリに移動します:

cd

+ nano`またはお気に入りのエディターを使用してプロジェクトの + package.json`ファイルを開きます。

nano package.json

プロジェクトの依存関係の下で、閉じ中括弧の上に、 `+ nodemon `を含む新しい ` devDependencies +`オブジェクトを作成します。

〜/ node_project / package.json

...
"dependencies": {
   "ejs": "^2.6.1",
   "express": "^4.16.4",
   "mongoose": "^5.4.10"
 }



}

編集が終了したら、ファイルを保存して閉じます。

プロジェクトコードを配置し、依存関係を変更したら、コンテナ化されたワークフローのコードのリファクタリングに進むことができます。

ステップ2-コンテナを操作するためのアプリケーションの構成

コンテナ化されたワークフロー用にアプリケーションを変更するということは、コードをよりモジュール化することを意味します。 コンテナは環境間の移植性を提供します。コードは、基礎となるオペレーティングシステムから可能な限り分離したままにすることで、それを反映する必要があります。 これを実現するために、コードをリファクタリングして、ノードのhttps://nodejs.org/api/process.html#process_process_env[process.env]プロパティをより活用します。このプロパティは、実行時にユーザー環境に関する情報を含むオブジェクトを返します。 コードでこのオブジェクトを使用して、実行時に環境変数を使用して構成情報を動的に割り当てることができます。

まず、メインアプリケーションのエントリポイントである「+ app.js +」から始めましょう。 ファイルを開きます。

nano app.js

内部では、 + port + constantの定義とhttps:/が表示されます。 /expressjs.com/en/4x/api.html#app.listen [+ listen + function]は、この定数を使用して、アプリケーションがリッスンするポートを指定します。

〜/ home / node_project / app.js

...
const port = 8080;
...
app.listen(port, function () {
 console.log('Example app listening on port 8080!');
});

実行時に `+ process.env `オブジェクトを使用して動的に割り当てられるように、 ` port `定数を再定義しましょう。 定数の定義と ` listen +`関数に次の変更を加えます。

〜/ home / node_project / app.js

...

...
app.listen(port, function () {
 console.log();
});

新しい定数定義は、実行時に渡される値または `+ 8080 `を使用して ` port `を動的に割り当てます。 同様に、https://www.digitalocean.com/community/tutorials/how-to-work-with-strings-in-javascript#string-literals-and-stringを使用するように「 listen +」関数を書き直しました-values [テンプレートリテラル]。接続をリッスンするときにポート値を補間します。 ポートを他の場所にマッピングするため、これらの改訂により、環境の変化に合わせてこのファイルを継続的に改訂する必要がなくなります。

編集が終了したら、ファイルを保存して閉じます。

次に、データベース接続情報を変更して、構成資格情報を削除します。 次の情報を含む「+ db.js +」ファイルを開きます。

nano db.js

現在、ファイルは次のことを行います。

  • Mongooseをインポートします。これは、アプリケーションデータのスキーマとモデルの作成に使用している_Object Document Mapper_(ODM)です。

  • ユーザー名とパスワードを含むデータベース資格情報を定数として設定します。

  • https://mongoosejs.com/docs/api.html#connection_Connection [`+ mongoose.connect +`メソッド]を使用してデータベースに接続します。

ファイルの詳細については、https://www.digitalocean.com/community/tutorials/how-to-integrate-mongodb-with-your-node-application#step-3-%E2%80%94-を参照してください。 creating-mongoose-schemas-and-models [Step 3] of MongoDBとユーザーを統合する方法ノードアプリケーション]。

ファイルを変更する最初のステップは、機密情報を含む定数を再定義することです。 現在、これらの定数は次のようになっています。

〜/ node_project / db.js

...
const MONGO_USERNAME = '';
const MONGO_PASSWORD = '';
const MONGO_HOSTNAME = '127.0.0.1';
const MONGO_PORT = '27017';
const MONGO_DB = '';
...

この情報をハードコーディングする代わりに、 `+ process.env +`オブジェクトを使用して、これらの定数のランタイム値をキャプチャできます。 ブロックを次のように変更します。

〜/ node_project / db.js

...
const {
 MONGO_USERNAME,
 MONGO_PASSWORD,
 MONGO_HOSTNAME,
 MONGO_PORT,
 MONGO_DB
} = process.env;
...

編集が終了したら、ファイルを保存して閉じます。

この時点で、アプリケーションの環境変数で動作するように「+ db.js 」を変更しましたが、これらの変数をアプリケーションに渡す方法が必要です。 実行時にアプリケーションに渡すことができる値を持つ ` .env +`ファイルを作成しましょう。

ファイルを開きます。

nano .env

このファイルには、 `+ db.js +`から削除した情報(アプリケーションのデータベースのユーザー名とパスワード、ポート設定とデータベース名)が含まれます。 ここにリストされているユーザー名、パスワード、データベース名を自分の情報で更新することを忘れないでください。

〜/ node_project / .env

MONGO_USERNAME=
MONGO_PASSWORD=
MONGO_PORT=27017
MONGO_DB=

最初に `+ db.js`にあったホスト設定を*削除*していることに注意してください。 ここで、ホストをDocker Composeファイルのレベルで定義し、サービスとコンテナーに関するその他の情報を追加します。

編集が終了したら、このファイルを保存して閉じます。

`+ .env `ファイルには機密情報が含まれているため、バージョン管理やコンテナにコピーされないように、プロジェクトの ` .dockerignore `および ` .gitignore +`ファイルに含まれるようにする必要があります。

`+ .dockerignore`ファイルを開きます:

nano .dockerignore

ファイルの最後に次の行を追加します。

〜/ node_project / .dockerignore

...
.gitignore

編集が終了したら、ファイルを保存して閉じます。

このリポジトリの `+ .gitignore `ファイルにはすでに ` .env +`が含まれていますが、そこにあることを確認してください:

nano .gitignore

~~ / node_project / .gitignore

...
.env
...

この時点で、プロジェクトコードから機密情報を正常に抽出し、この情報をコピーする方法と場所を制御する手段を講じました。 データベース接続コードに堅牢性を追加して、コンテナ化されたワークフロー用に最適化できるようになりました。

手順3-データベース接続設定の変更

次のステップは、アプリケーションがデータベースへの接続に失敗した場合を処理するコードを追加することにより、データベース接続方法をより堅牢にすることです。 Composeを使用してコンテナを操作する場合、アプリケーションコードにこのレベルの復元力を導入するのはhttps://docs.docker.com/compose/startup-order/ [推奨されるプラクティス]です。

編集のために `+ db.js +`を開きます:

nano db.js

前に追加したコードと、Mongoの接続URIの + url +`定数およびhttps://mongoosejs.com/docs/api.html#mongoose_Mongoose-connect[Mongoose `+ connect +]メソッドが表示されます。

〜/ node_project / db.js

...
const {
 MONGO_USERNAME,
 MONGO_PASSWORD,
 MONGO_HOSTNAME,
 MONGO_PORT,
 MONGO_DB
} = process.env;

const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`;

mongoose.connect(url, {useNewUrlParser: true});

現在、 `+ connect `メソッドは、Mongooseにhttps://mongoosejs.com/docs/deprecations.html[new URL parser]を使用するように指示するオプションを受け入れます。 このメソッドにいくつかのオプションを追加して、再接続を試行するためのパラメーターを定義しましょう。 これを行うには、新しいURLパーサーオプションに加えて、関連情報を含む ` options `定数を作成します。 Mongo定数の下に、 ` options +`定数の次の定義を追加します。

〜/ node_project / db.js

...
const {
 MONGO_USERNAME,
 MONGO_PASSWORD,
 MONGO_HOSTNAME,
 MONGO_PORT,
 MONGO_DB
} = process.env;







...

`+ reconnectTries `オプションは、無期限に接続を試行し続けるようMongooseに指示し、 ` reconnectInterval `は接続試行の間隔をミリ秒単位で定義します。 ` connectTimeoutMS +`は、接続試行に失敗する前にMongoドライバーが待機する期間として10秒を定義します。

Mongooseの `+ connect `メソッドで、新しい ` options +`定数を使用して、Mongoose接続設定を微調整できるようになりました。 また、潜在的な接続エラーを処理するためにhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises[promise]を追加します。

現在、Mongooseの `+ connect +`メソッドは次のようになっています。

〜/ node_project / db.js

...
mongoose.connect(url, {useNewUrlParser: true});

既存の `+ connect `メソッドを削除し、 ` options +`定数とプロミスを含む次のコードに置き換えます。

〜/ node_project / db.js

...

接続が成功した場合、関数は適切なメッセージを記録します。それ以外の場合は、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch [+ catch +]でエラーを記録し、トラブルシューティングを行います。

完成したファイルは次のようになります。

〜/ node_project / db.js

const mongoose = require('mongoose');

const {
 MONGO_USERNAME,
 MONGO_PASSWORD,
 MONGO_HOSTNAME,
 MONGO_PORT,
 MONGO_DB
} = process.env;

const options = {
 useNewUrlParser: true,
 reconnectTries: Number.MAX_VALUE,
 reconnectInterval: 500,
 connectTimeoutMS: 10000,
};

const url = `mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@${MONGO_HOSTNAME}:${MONGO_PORT}/${MONGO_DB}?authSource=admin`;

mongoose.connect(url, options).then( function() {
 console.log('MongoDB is connected');
})
 .catch( function(err) {
 console.log(err);
});

編集が終了したら、ファイルを保存して閉じます。

これで、アプリケーションがデータベースへの接続に失敗する可能性がある場合に対処するために、アプリケーションコードに復元力が追加されました。 このコードを配置したら、Composeを使用してサービスの定義に進むことができます。

ステップ4-Docker Composeを使用したサービスの定義

コードをリファクタリングすると、サービス定義を使用して `+ docker-compose.yml `ファイルを作成する準備が整います。 Composeの_service_は実行中のコンテナーであり、サービス定義( ` docker-compose.yml +`ファイルに含める)には、各コンテナーイメージの実行方法に関する情報が含まれています。 Composeツールを使用すると、複数のサービスを定義してマルチコンテナアプリケーションを構築できます。

ただし、サービスを定義する前に、https://github.com/Eficode/wait-for [+ wait-for +]というプロジェクトにツールを追加して、アプリケーションがデータベースへの接続を1回だけ試行するようにしますデータベースの起動タスクが完了しました。 このラッパースクリプトはhttps://www.digitalocean.com/community/tutorials/how-to-use-netcat-to-establish-and-test-tcp-and-udp-connections-on-a-vps[`+ netcat + `]は、特定のホストとポートがTCP接続を受け入れているかどうかをポーリングします。 これを使用すると、データベースが接続を受け入れる準備ができているかどうかをテストすることにより、アプリケーションがデータベースに接続する試行を制御できます。

Composeではhttps://docs.docker.com/compose/compose-file/#depends_on [+ depends_on + option]を使用してサービス間の依存関係を指定できますが、この順序はコンテナーが実行されているかどうかに基づいていますその準備よりも。 「+ depends_on 」を使用することはセットアップに最適ではありません。ユーザーとパスワードを「 admin 」認証データベースに追加するなど、データベースの起動タスクが完了したときにのみアプリケーションを接続するためです。 ` wait-for +`およびその他のツールを使用して起動順序を制御する方法の詳細については、関連するhttps://docs.docker.com/compose/startup-order/[Composeドキュメントの推奨事項]を参照してください。

`+ wait-for.sh +`というファイルを開きます:

nano wait-for.sh

次のコードをファイルに貼り付けて、ポーリング機能を作成します。

〜/ node_project / app / wait-for.sh

#!/bin/sh

# original script: https://github.com/eficode/wait-for/blob/master/wait-for

TIMEOUT=15
QUIET=0

echoerr() {
 if [ "$QUIET" -ne 1 ]; then printf "%s\n" "$*" 1>&2; fi
}

usage() {
 exitcode="$1"
 cat << USAGE >&2
Usage:
 $cmdname host:port [-t timeout] [-- command args]
 -q | --quiet                        Do not output any status messages
 -t TIMEOUT | --timeout=timeout      Timeout in seconds, zero for no timeout
 -- COMMAND ARGS                     Execute command with args after the test finishes
USAGE
 exit "$exitcode"
}

wait_for() {
 for i in `seq $TIMEOUT` ; do
   nc -z "$HOST" "$PORT" > /dev/null 2>&1

   result=$?
   if [ $result -eq 0 ] ; then
     if [ $# -gt 0 ] ; then
       exec "$@"
     fi
     exit 0
   fi
   sleep 1
 done
 echo "Operation timed out" >&2
 exit 1
}

while [ $# -gt 0 ]
do
 case "$1" in
   *:* )
   HOST=$(printf "%s\n" "$1"| cut -d : -f 1)
   PORT=$(printf "%s\n" "$1"| cut -d : -f 2)
   shift 1
   ;;
   -q | --quiet)
   QUIET=1
   shift 1
   ;;
   -t)
   TIMEOUT="$2"
   if [ "$TIMEOUT" = "" ]; then break; fi
   shift 2
   ;;
   --timeout=*)
   TIMEOUT="${1#*=}"
   shift 1
   ;;
   --)
   shift
   break
   ;;
   --help)
   usage 0
   ;;
   *)
   echoerr "Unknown argument: $1"
   usage 1
   ;;
 esac
done

if [ "$HOST" = "" -o "$PORT" = "" ]; then
 echoerr "Error: you need to provide a host and port to test."
 usage 2
fi

wait_for "$@"

コードの追加が終了したら、ファイルを保存して閉じます。

スクリプトを実行可能にします。

chmod +x wait-for.sh

次に、 `+ docker-compose.yml +`ファイルを開きます:

nano docker-compose.yml

まず、ファイルに次のコードを追加して、 `+ nodejs +`アプリケーションサービスを定義します。

〜/ node_project / docker-compose.yml

version: '3'

services:
 nodejs:
   build:
     context: .
     dockerfile: Dockerfile
   image: nodejs
   container_name: nodejs
   restart: unless-stopped
   env_file: .env
   environment:
     - MONGO_USERNAME=$MONGO_USERNAME
     - MONGO_PASSWORD=$MONGO_PASSWORD
     - MONGO_HOSTNAME=db
     - MONGO_PORT=$MONGO_PORT
     - MONGO_DB=$MONGO_DB
   ports:
     - "80:8080"
   volumes:
     - .:/home/node/app
     - node_modules:/home/node/app/node_modules
   networks:
     - app-network
   command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js

`+ nodejs +`サービス定義には次のオプションが含まれます。

  • + build +:これは、Composeがアプリケーションイメージをビルドするときに適用される、 + context`や + dockerfile`などの構成オプションを定義します。 Docker Hubなどのレジストリの既存のイメージを使用する場合は、https://docs.docker.com/compose/compose-file/#image [代わりに、ユーザー名、リポジトリ、画像タグに関する情報を含む「+ image + `命令」。

  • + context +:これは、イメージビルドのビルドコンテキスト(この場合は現在のプロジェクトディレクトリ)を定義します。

  • + dockerfile +:これは、Composeがアプリケーションイメージのビルドに使用するファイルとして、現在のプロジェクトディレクトリ内の `+ Dockerfile +`を指定します。 このファイルの詳細については、https://www.digitalocean.com/community/tutorials/how-to-build-a-node-js-application-with-docker [Node.jsアプリケーションをビルドする方法Docker]。

  • + image ++ container_name +:これらは画像とコンテナに名前を適用します。

  • + restart +:これは再起動ポリシーを定義します。 デフォルトは「+ no +」ですが、停止しない限りコンテナを再起動するように設定しています。

  • + env_file +:これは、構築コンテキストにある `+ .env +`というファイルから環境変数を追加したいことをComposeに伝えます。

  • + environment +:このオプションを使用すると、 `+ .env `ファイルで定義したMongo接続設定を追加できます。 これはhttps://expressjs.com/[Express's] https://github.com/expressjs/express/blob/dc538f6e810bd462c98ee7e6aae24c64d4b1da93/lib/applicationであるため、「 NODE_ENV 」を「 development 」に設定していないことに注意してください。 ` NODE_ENV `が設定されていない場合のjs#L71 [default]の動作。 本番環境に移行する場合、これをhttps://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-productionに「 production 」に設定できます[ビューのキャッシュを有効にし、より詳細なエラーを少なくしますメッセージ]。 また、https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-で説明されているように、ホストとして「 db +」データベースコンテナを指定していることにも注意してくださいdocker-compose#step-2-%E2%80%94-configuring-your-application-to-work-with-containers [ステップ2]。

  • + ports +:ホストのポート `+ 80 `をコンテナのポート ` 8080 +`にマッピングします。

  • + volumes +:ここには2種類のマウントが含まれています:

  • 1つはhttps://docs.docker.com/storage/bind-mounts/[bind mount]で、ホスト上のアプリケーションコードをコンテナの `+ / home / node / app +`ディレクトリにマウントします。 これにより、ホストコードに加えた変更がコンテナにすぐに入力されるため、迅速な開発が促進されます。

  • 2つ目は、https://docs.docker.com/storage/volumes/ [volume]、 + node_modules +`という名前です。 Dockerがアプリケーション `+ Dockerfile +`にリストされている `+ npm install +`命令を実行すると、 `+ npm +`は新しいhttps://docs.npmjs.com/files/folders.html#node-modules[+node_modules+を作成しますアプリケーションの実行に必要なパッケージを含むコンテナの `]ディレクトリ。 ただし、作成したバインドマウントは、この新しく作成された `+ node_modules `ディレクトリを非表示にします。 ホスト上の ` node_modules `は空であるため、バインドは空のディレクトリをコンテナにマップし、新しい ` node_modules `ディレクトリをオーバーライドしてアプリケーションの起動を防ぎます。 名前付きの ` node_modules `ボリュームは、 ` / home / node / app / node_modules +`ディレクトリの内容を永続化してコンテナにマウントすることにより、この問題を解決します。 バインドを非表示にします。 + このアプローチを使用するときは、次の点に注意してください

  • バインドはコンテナの `+ node_modules `ディレクトリの内容をホストにマウントし、このディレクトリはDockerによって作成されたため、このディレクトリは ` root +`によって所有されます。

  • ホスト上に既存の `+ node_modules `ディレクトリがある場合、コンテナ上に作成された ` node_modules `ディレクトリをオーバーライドします。 このチュートリアルで作成するセットアップでは、既存の「 node_modules 」ディレクトリが「*ない」ことを前提としており、ホストで「 npm +」を操作しないことを前提としています。 これは、実行環境間の依存関係を最小限に抑えるhttps://12factor.net/ [アプリケーション開発への12因子アプローチ]に準拠しています。

  • + network +:これは、アプリケーションサービスがファイルの下部で定義する `+ app-network +`ネットワークに参加することを指定します。

  • + command +:このオプションを使用すると、Composeがイメージを実行するときに実行するコマンドを設定できます。 これは、アプリケーションで設定した + Dockerfile +`の `+ CMD +`命令をオーバーライドすることに注意してください。 ここでは、 `+ wait-for`スクリプトを使用してアプリケーションを実行します。これは、ポート + 27017 + + db`サービスをポーリングし、データベースサービスの準備ができているかどうかをテストします。 準備テストが成功すると、スクリプトは設定したコマンド「+ / home / node / app / node_modules / .bin / nodemon app.js 」を実行し、「 nodemon +」でアプリケーションを起動します。 これにより、アプリケーションを再起動することなく、コードに加えた将来の変更がリロードされます。

次に、アプリケーションサービス定義の下に次のコードを追加して、 `+ db +`サービスを作成します。

〜/ node_project / docker-compose.yml

...
 db:
   image: mongo:4.1.8-xenial
   container_name: db
   restart: unless-stopped
   env_file: .env
   environment:
     - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
     - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
   volumes:
     - dbdata:/data/db
   networks:
     - app-network

+ nodejs +`サービスに対して定義した設定の一部は同じままですが、 `+ image ++ environment +、および `+ volumes +`定義に対して以下の変更も加えました。

  • + image +:このサービスを作成するために、ComposeはDocker Hubから + 4.1.8-xenial + Mongo imageを取得します。 Mongoのイメージが変更されたときに起こりうる競合を回避するために、特定のバージョンを固定しています。 バージョンのピン留めの詳細については、https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ [Dockerfileベストプラクティス]のDockerドキュメントを参照してください。

  • + MONGO_INITDB_ROOT_USERNAME ++ MONGO_INITDB_ROOT_PASSWORD ++ mongo +`イメージにより、これらのhttps://docs.docker.com/samples/library/mongo/#environment-variables [環境変数]が使用可能になり、初期化を変更できますデータベースインスタンスの。 `+ MONGO_INITDB_ROOT_USERNAME +`と `+ MONGO_INITDB_ROOT_PASSWORD +`は、一緒に `+ admin +`認証データベースに `+ root +`ユーザーを作成し、コンテナーの起動時に認証が有効になるようにします。 `+ .env +`ファイルの値を使用して `+ MONGO_INITDB_ROOT_USERNAME +`と `+ MONGO_INITDB_ROOT_PASSWORD +`を設定し、 `+ env_file +`オプションを使用して `+ db +`サービスに渡します。 これを行うと、「++」アプリケーションユーザーは、データベースインスタンス上のhttps://docs.mongodb.com/manual/reference/built-in-roles/#root [+ root +` user]になり、アクセス権が付与されます。そのロールのすべての管理特権と操作特権。 本番環境で作業する場合は、適切なスコープの特権を持つ専用のアプリケーションユーザーを作成する必要があります。

  • + dbdata:/ data / db +:名前付きボリューム + dbdata +`は、Mongoのhttps://docs.mongodb.com/manual/reference/configuration-options/#storage.dbPath [デフォルトのデータディレクトリに保存されたデータを永続化します]、 `+ / data / db +。 これにより、コンテナを停止または削除した場合にデータが失われないようになります。

また、「+ networks」オプションを使用して、「+ app-network 」ネットワークに「 db」サービスを追加しました。

最後のステップとして、ファイルの下部にボリュームとネットワークの定義を追加します。

〜/ node_project / docker-compose.yml

...
networks:
 app-network:
   driver: bridge

volumes:
 dbdata:
 node_modules:

ユーザー定義のブリッジネットワーク「+ app-network 」は、コンテナが同じDockerデーモンホスト上にあるため、コンテナ間の通信を可能にします。 これにより、同じブリッジネットワーク上のコンテナ間のすべてのポートが開かれ、ポートが外部に公開されないため、アプリケーション内のトラフィックと通信が合理化されます。 したがって、 ` db `コンテナと ` nodejs `コンテナは互いに通信でき、アプリケーションへのフロントエンドアクセス用にポート ` 80 +`を公開するだけで済みます。

トップレベルの「+ volumes 」キーは、ボリューム「 dbdata 」と「 node_modules 」を定義します。 Dockerがボリュームを作成すると、ボリュームの内容はDockerによって管理されるホストファイルシステムの一部である ` / var / lib / docker / volumes / `に保存されます。 各ボリュームの内容は、「 / var / lib / docker / volumes / 」の下のディレクトリに保存され、ボリュームを使用するコンテナにマウントされます。 このようにして、ユーザーが作成するサメ情報データは、 ` db `コンテナを削除して再作成しても、 ` dbdata +`ボリュームに保持されます。

完成した `+ docker-compose.yml +`ファイルは次のようになります。

〜/ node_project / docker-compose.yml

version: '3'

services:
 nodejs:
   build:
     context: .
     dockerfile: Dockerfile
   image: nodejs
   container_name: nodejs
   restart: unless-stopped
   env_file: .env
   environment:
     - MONGO_USERNAME=$MONGO_USERNAME
     - MONGO_PASSWORD=$MONGO_PASSWORD
     - MONGO_HOSTNAME=db
     - MONGO_PORT=$MONGO_PORT
     - MONGO_DB=$MONGO_DB
   ports:
     - "80:8080"
   volumes:
     - .:/home/node/app
     - node_modules:/home/node/app/node_modules
   networks:
     - app-network
   command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js

 db:
   image: mongo:4.1.8-xenial
   container_name: db
   restart: unless-stopped
   env_file: .env
   environment:
     - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
     - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
   volumes:
     - dbdata:/data/db
   networks:
     - app-network

networks:
 app-network:
   driver: bridge

volumes:
 dbdata:
 node_modules:

編集が終了したら、ファイルを保存して閉じます。

サービス定義を配置したら、アプリケーションを起動する準備が整いました。

ステップ5-アプリケーションのテスト

+ docker-compose.yml +`ファイルを配置したら、https://docs.docker.com/compose/reference/up/ [+ docker-compose up +]コマンドでサービスを作成できます。 +docker-compose down + `

Related