DockerでNodejs開発を簡略化する1——開発環境
6999 ワード
Nodejsアプリケーションを開発するには通常複数のミドルウェアを使いますが、開発者はコードを実行するためには自分のマシンにミドルウェアをインストールし、手間がかかります.複数のプロジェクトを同時に開発するとさらに面倒になります.本論文では、Nodejs+MongoDBプロジェクトを例に、Dockerの基本的な使い方を示しながら、Dockerに対する友好的なコードを作成する方法を提供しています.
プロジェクトの説明
tms-app-gwはAPIゲートウェイプロジェクトであり、受信したhttp要求を業務規則に従って対応サービスに転送し、受信した要求ごとにログを記録してカウントし、結果はmonogodbに保存する.
Dockerを通じて以下の問題を解決したいです.は、mongodbの配置を簡略化し、開発者が現地でアプリケーションを実行するのに便利である. は、nodejsアプリケーションをパッケージ化し、全体的なリリースを実現し、オペレータの配置を容易にする. Docker
まず、公式サイトの説明に従って、Dockerをインストールしてください.
参考:https://docs.docker.com/get-started/#install-docker-desktop
Dockerを使用するには、まず
参考:https://docs.docker.com/reference/
私たちが必要とする
次はプロジェクトのニーズに合わせて、Dockerを具体的に走ります.
モングDB
ベースミラーを探します.
docker search mongo
鏡像を地元に引き寄せる.
docker pull mono
コンテナを生成して実行します.
docker run--rm--name tms-api-gw-mono-p 27017:27017-d monto:latest
容器に入ってデータを確認します.
docker exec-it tms-api-gw-mono/bin/bash
容器内で
この時、地元で使えるMongoDBの例があります.データは容器に保存されています.容器を削除するたびにデータが消去され、常に「清潔」なMongoDBで開発されます.
MongoDBのデータを永続的に保持する必要がある場合は、コンテナにローカルディレクトリにデータを書き込むことができ、
docker run--rm--name tms-appi-gw-mongo-p 27017:27017-v/PWD/storage/mongo db:/data/db-d monto:latest
容器を管理するためにはいくつかのコマンドが必要です.
docker ps-a〓はすべての容器を調べて、-aパラメータをプラスしないで運行のだけを表示します.
docker stop container_name〓〓停止指定の容器
docker rm container_name〓〓指定の容器を削除します.
Docker命令の参考:https://docs.docker.com/engine/reference/commandline/cli/
Nodejs
まず、Nodejs公式サイトのこの記事を見てください.https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/以下はこの文章をもとに調整します.
dockerのイメージを作ります.
プロジェクトのルートディレクトリに
docker build-t tms-appi-gw-node.
docker imagsで既存の鏡像を見ることができます.
コンテナを実行
docker run--rm--name tms-apps-gw-node-p 5678:3000-v/config:/usr/src/config-d tms-app-app-gw-node
複数のプロジェクトを同時に開発すれば、ポート衝突の問題がよく発生します.
同じコードは複数の環境で実行する必要があります.開発、テスト、生産などを含みます.私たちは通常構成ファイルを使ってコードと運行環境を結合させます.Dockerを利用して、コードとコードに依存する標準的な環境をイメージして、コンテナを生成する時に環境に関する配置ファイルを指定することができます.このようにDockerミラー像の全体はリリースユニットになります.したがって、Docker fileでは、空の
前に紹介したプロジェクトの基本状況については、mongodbにapiアクセスデータを記憶する必要があります.アプリケーションとmongodbが容器の中で運行している時に問題が発生しました.mongodbの住所は何ですか?
現地開発環境では、私たちは通常
コンテナがバックグラウンドで実行されている場合、Nodejsアプリケーション出力のログを確認したいです.以下のコマンドを使います.
docker logs tms-appi-gw-node
ミラーは
docker exec-it tms-appi-gw-node/bin/sh
これで、私たちはすでに容器の中でNodejsアプリケーションを実行できます.
参考:https://github.com/nodejs/docker-node/blob/master/README.md#how-to-use-this-mage
参考:NodejsがDockerを使用するための最適な実践について、https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md
docker-compose
すでに容器でNodejsを応用して走ることができますが、まだ不便です.mongodbとnodejs容器はそれぞれ開けて止まって、命令はまだ長いです.もっと簡単にできますか?はい、docker-composeを使います.
参考:https://docs.docker.com/compose/compose-file/
Docker for MacはすでにComposeを含んでいますので、Macユーザーは単独でComposeをインストールする必要はありません.
起動容器
docker-compse up-d
容器を閉じる
docker-compose down
ミラーを更新
docker-compse build
鏡像の更新を繰り返すと、無効な鏡像が発生し、これらの不要な鏡像は次のコマンドで削除されます.
docker imags cb 7 a 87 c 0359 b 22 minutes ago 170 MB
締め括りをつける
Dockerは全体的に複雑ですが、開発者として基本概念と常用命令を身につけるだけで、Dockerを走ることができます.現地開発環境の管理作業を大幅に簡略化できます.
次の研究はどうやってDockerを利用してNodejsアプリケーションの展開を行いますか?
このシリーズの他の文章
DockerでNodejs開発を簡略化します.2、開発環境からテスト環境まで.
DockerでNodejs開発を簡略化する3——webhookで自動更新を実現する.
プロジェクトの説明
tms-app-gwはAPIゲートウェイプロジェクトであり、受信したhttp要求を業務規則に従って対応サービスに転送し、受信した要求ごとにログを記録してカウントし、結果はmonogodbに保存する.
Dockerを通じて以下の問題を解決したいです.
まず、公式サイトの説明に従って、Dockerをインストールしてください.
参考:https://docs.docker.com/get-started/#install-docker-desktop
Dockerを使用するには、まず
image
とcontainer
の概念を理解する必要があり、簡単に言えば、image
は実行環境のモジュラスであり、container
はモジュラスに従って作成された例である.image
はDockerfile
で定義されており、Dockerfile
はバッチ処理コマンドであると考えられ、コマンドを実行することにより、ミラー上にパケットをインストールし、ファイルをコピーし、パラメータを設定する.image
があればrun
コマンドでコンテナを生成でき、生成時に実行時のパラメータを指定できます.関連する複数のコンテナがあれば、docker-compose
を介して全体管理が可能である.docker-compose
は、管理されているコンテナを編成ファイルdocker-compose.yml
に基づいて説明し、docker-compose up
コマンドで起動し、docker-compose down
は、そのため、各コンテナに対してコマンドを個別に実行しなくてもよい.参考:https://docs.docker.com/reference/
私たちが必要とする
image
は基本バージョンがすでにあります.hub.docker.com
上で検索できます.各ミラー像は通常バージョンの山がありますが、最も重要な違いはimage
がどのlinuxバージョンで構築されているかということです.このバージョンが一番小さいので、alpine
を使用することを勧めています.次はプロジェクトのニーズに合わせて、Dockerを具体的に走ります.
モングDB
ベースミラーを探します.
docker search mongo
鏡像を地元に引き寄せる.
docker pull mono
コンテナを生成して実行します.
docker run--rm--name tms-api-gw-mono-p 27017:27017-d monto:latest
--rm
は、容器が終了すると自動的に削除される.--name tms-api-gw-mongo
は容器の名前を指定し、後から容器を操作する時に使うものです.-p 27017:27017
は、コンテナ内部の27017ポートをホストの27017ポートにマッピングする.-d
は、バックグラウンドで動作するように指定されている.容器に入ってデータを確認します.
docker exec-it tms-api-gw-mono/bin/bash
容器内で
exit
コマンドで容器から退出します.この時、地元で使えるMongoDBの例があります.データは容器に保存されています.容器を削除するたびにデータが消去され、常に「清潔」なMongoDBで開発されます.
MongoDBのデータを永続的に保持する必要がある場合は、コンテナにローカルディレクトリにデータを書き込むことができ、
run
コマンドを実行するときにパラメータを指定します.docker run--rm--name tms-appi-gw-mongo-p 27017:27017-v/PWD/storage/mongo db:/data/db-d monto:latest
-v $PWD/db:/data/db
は、ホスト内の現在のディレクトリのdbをコンテナの/data/dbにマウントし、monoデータとしてディレクトリを格納する.容器を管理するためにはいくつかのコマンドが必要です.
docker ps-a〓はすべての容器を調べて、-aパラメータをプラスしないで運行のだけを表示します.
docker stop container_name〓〓停止指定の容器
docker rm container_name〓〓指定の容器を削除します.
Docker命令の参考:https://docs.docker.com/engine/reference/commandline/cli/
Nodejs
まず、Nodejs公式サイトのこの記事を見てください.https://nodejs.org/zh-cn/docs/guides/nodejs-docker-webapp/以下はこの文章をもとに調整します.
dockerのイメージを作ります.
プロジェクトのルートディレクトリに
Dockerfile
ファイルを新規作成しました.ファイルの内容は以下の通りです.Nodejs公式サイトの文章と一致しないところに注釈をつけました.FROM node:alpine
# cnpm
RUN npm install cnpm -g
WORKDIR /usr/src/app
COPY package*.json ./
# dependencies , devDependencies ; 。
RUN cnpm install --production \
&& cnpm install log4js
COPY . .
#
RUN mkdir config
#
ENV TMS_API_GW_ENV='docker'
EXPOSE 3000
CMD [ "node", "./app.js" ]
COPY . .
は、ローカル・カレント・ディレクトリの下のコンテンツをミラーにコピーしたワーク・ディレクトリの下の/usr/src/app
であるが、node_modules
、config
は、これらのコンテンツはコピーする必要がないので、.dockerignore
ファイルを作成し、コピーが不要なコンテンツを指定する..*
node_modules
config
example
鏡像を作成します.一番後ろの点を失わないように注意してください.docker build-t tms-appi-gw-node.
docker imagsで既存の鏡像を見ることができます.
コンテナを実行
docker run--rm--name tms-apps-gw-node-p 5678:3000-v/config:/usr/src/config-d tms-app-app-gw-node
複数のプロジェクトを同時に開発すれば、ポート衝突の問題がよく発生します.
-p
パラメータを通してコンテナを起動する時にポートを指定することができます.同じコードは複数の環境で実行する必要があります.開発、テスト、生産などを含みます.私たちは通常構成ファイルを使ってコードと運行環境を結合させます.Dockerを利用して、コードとコードに依存する標準的な環境をイメージして、コンテナを生成する時に環境に関する配置ファイルを指定することができます.このようにDockerミラー像の全体はリリースユニットになります.したがって、Docker fileでは、空の
config
ディレクトリを作成し、パラメータ-v $PWD/config:/usr/src/app/config
を介して実行環境を使用したローカルなプロファイルを指定しました.前に紹介したプロジェクトの基本状況については、mongodbにapiアクセスデータを記憶する必要があります.アプリケーションとmongodbが容器の中で運行している時に問題が発生しました.mongodbの住所は何ですか?
現地開発環境では、私たちは通常
localhost
と書きますが、容器の中のlocalhost
はコンテナであり、ホストではなく、アプリケーションはmongodbにアクセスできません.この問題を解決するために、プロジェクトに環境変数を導入し、コードconfig/gateway.sample.js
を参照してください.let host, port
if (process.env.TMS_API_GW_ENV === 'docker') {
host = 'docker.for.mac.host.internal'
port = 3000
} else {
host = 'localhost'
port = 5678
}
module.exports = {
...
}
前のDockerfile
に環境変数ENV TMS_API_GW_ENV='docker'
が指定されていますが、コードはこの環境変数に応じて設定されてもよく、コンテナdocker.for.mac.host.internal
はシンクホストのアドレスを表しています.そうでなければlocalhost
を使って、指定ポートはDockerfile
のEXPOSE
のポートと一致しています.コンテナがバックグラウンドで実行されている場合、Nodejsアプリケーション出力のログを確認したいです.以下のコマンドを使います.
docker logs tms-appi-gw-node
ミラーは
alpine
をベースに作られているので、コンテナに入るコマンドは調整が必要で、bash
をsh
に変更します.docker exec-it tms-appi-gw-node/bin/sh
これで、私たちはすでに容器の中でNodejsアプリケーションを実行できます.
参考:https://github.com/nodejs/docker-node/blob/master/README.md#how-to-use-this-mage
参考:NodejsがDockerを使用するための最適な実践について、https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md
docker-compose
すでに容器でNodejsを応用して走ることができますが、まだ不便です.mongodbとnodejs容器はそれぞれ開けて止まって、命令はまだ長いです.もっと簡単にできますか?はい、docker-composeを使います.
参考:https://docs.docker.com/compose/compose-file/
Docker for MacはすでにComposeを含んでいますので、Macユーザーは単独でComposeをインストールする必要はありません.
docker-compose.yml
ファイルを作成します.version: '3.7'
services:
app:
build: ./
image: tms-api-gw-node:latest
container_name: tms-api-gw-node
ports:
- '5678:3000'
volumes:
- ./config:/usr/src/app/config
depends_on:
- mongodb
mongodb:
image: mongo:latest
container_name: tms-api-gw-mongo
ports:
- '27017:27017'
logging:
driver: none
上のこのファイルで指定されたロジックと前のrun
コマンドによってそれぞれコンテナを実行するのは完全に等価です.起動容器
docker-compse up-d
容器を閉じる
docker-compose down
ミラーを更新
docker-compse build
鏡像の更新を繰り返すと、無効な鏡像が発生し、これらの不要な鏡像は次のコマンドで削除されます.
docker imags cb 7 a 87 c 0359 b 22 minutes ago 170 MB
docker rmi $(docker images | grep "^" | awk "{print $3}")
ヒント:実際に本マシンでコードを書く時、Nodejsアプリケーションをイメージして実行する必要はありません.このようにコードを修正するたびにbuildを更新します.時間もかかりますし、無駄なミラー像もたくさん発生します.ここでのデモNodejsアプリケーションミラーは主に次のリリースのために準備されています.締め括りをつける
Dockerは全体的に複雑ですが、開発者として基本概念と常用命令を身につけるだけで、Dockerを走ることができます.現地開発環境の管理作業を大幅に簡略化できます.
次の研究はどうやってDockerを利用してNodejsアプリケーションの展開を行いますか?
このシリーズの他の文章
DockerでNodejs開発を簡略化します.2、開発環境からテスト環境まで.
DockerでNodejs開発を簡略化する3——webhookで自動更新を実現する.