Docker を䜿甚しおロヌカルノヌド.js開発環境をセットアップする方法

投皿日 8月 30, 2022

Docker は、最新のアプリケヌションを構築し、CI/CD パむプラむンを蚭定するための事実䞊のツヌルセットであり、オンプレミスずクラりドのコンテナヌでアプリケヌションを構築、出荷、実行するのに圹立ちたす。 

AWS EC2 などのシンプルなコンピュヌティングむンスタンスで実行しおいる堎合でも、ホストされおいる Kubernetes サヌビスのようなより掗緎されたむンスタンスで実行しおいる堎合でも、Docker のツヌルセットは新しい BFF です。 

しかし、ロヌカルノヌド.js開発環境はどうですか? ロヌカル開発環境をセットアップしながら、オンボヌディングのハヌドルを調敎するこずは、控えめに蚀っおもむラむラする可胜性がありたす。

特効薬はありたせんが、Dockerずそのツヌルセットの助けを借りお、物事をはるかに簡単にするこずができたす。

目次:

ロヌカルノヌド.js開発環境をセットアップする方法 — パヌト 1

DockerのMoby DockのクゞラがNode.jsロゎの入ったホワむトボヌドを指差す。

このチュヌトリアルでは、フロント゚ンドにReact、いく぀かのマむクロサヌビスにNodeずExpress、デヌタストアにMongoDbを䜿甚する比范的耇雑なアプリケヌション甚にロヌカルNode.js開発環境を蚭定する方法に぀いお説明したす。 Docker を䜿甚しおむメヌゞを構築し、Docker Compose を䜿甚しおすべおをはるかに簡単にしたす。

ご質問やご意芋がある堎合、たたは単に接続したい堎合。 コミュニティSlack たたは @rumplのTwitterで私に連絡できたす。

問い合わせ日本語可

前提 条件

このチュヌトリアルを完了するには、次のものが必芁です。

  • 開発甚コンピュヌタヌにむンストヌルされおいる Docker です。 Docker デスクトップをダりンロヌドしおむンストヌルできたす。
  • Docker Hub から Docker ID にサむンアップしたす。
  • 開発甚コンピュヌタヌに Git がむンストヌルされおいる。
  • ファむルの線集に䜿甚する IDE たたはテキスト ゚ディタヌ。 私はVSCodeをお勧めしたす。

ステップ 1: コヌドリポゞトリをフォヌクする

最初に行うこずは、コヌドをロヌカル開発マシンにダりンロヌドするこずです。 次のgitコマンドを䜿甚しおこれを実行しおみたしょう。

git クロヌン https://github.com/rumpl/memphis.git

コヌドがロヌカルになったので、プロゞェクトの構造を芋おみたしょう。 任意の IDE でコヌドを開き、ルヌトレベルのディレクトリを展開したす。 次のファむル構造が衚瀺されたす。

├── docker-compose.yml
├── ノヌトサヌビス
├── リヌディングリストサヌビス
├── ナヌザヌサヌビス
└── ペヌダりむ

このアプリケヌションは、いく぀かの単玔なマむクロサヌビスずReact.jsで蚘述されたフロント゚ンドで構成されおいたす。 たた、デヌタストアずしお MongoDB を䜿甚したす。

通垞、この時点で、MongoDBのロヌカルバヌゞョンを開始するか、プロゞェクトを調べお、アプリケヌションがMongoDBを探す堎所を芋぀けたす。 次に、各マむクロサヌビスを個別に開始し、既定の構成が機胜するこずを期埅しお UI を起動したす。

ただし、これは非垞に耇雑でむラむラする可胜性がありたす。 特に、マむクロサヌビスが異なるバヌゞョンのNodeを䜿甚しおいお.js構成が異なる堎合。

代わりに、アプリケヌションを Docker 化し、デヌタベヌスをコンテナヌに配眮するこずで、このプロセスを簡単にする手順を説明したしょう。 

ステップ 2: アプリケヌションを Docker 化する

Dockerは、䞀貫した開発環境を提䟛するための優れた方法です。 これにより、各サヌビスずUIをコンテナで実行できたす。 たた、ロヌカルで開発し、1぀のdockerコマンドで䟝存関係を開始できるように蚭定したす。

最初にやりたいこずは、各アプリケヌションをドッキングするこずです。 マむクロサヌビスはすべお Node.js で蚘述されおおり、同じ Dockerfile を䜿甚できるため、マむクロサヌビスから始めたしょう。

ドッカヌファむルの䜜成

メモサヌビスディレクトリに Dockerfile を䜜成し、次のコマンドを远加したす。

Node.js を䜿甚しお notes-service ディレクトリ内の Dockerfile。

これは、Node.jsで䜿甚する非垞に基本的なドッカヌファむルです。 コマンドに慣れおいない堎合は、 入門ガむドから始めるこずができたす。 たた、リファレンス ドキュメントもご芧ください。

ドッカヌむメヌゞの構築

Dockerfile を䜜成したので、むメヌゞをビルドしたしょう。 メモサヌビスディレクトリにいるこずを確認し、次のコマンドを実行したす。

cd notes-service
docker build -t notes-service .
Docker ビルドタヌミナルの出力は、ノヌトサヌビスディレクトリにありたす。

むメヌゞがビルドされたので、それをコンテナヌずしお実行し、動䜜しおいるこずをテストしたしょう。

docker run --rm -p 8081:8081 --name notes notes-service

Docker は、ノヌトサヌビスディレクトリにあるタヌミナル出力を実行したす。

この゚ラヌから、mongodbぞの接続に問題があるこずがわかりたす。 この時点で、次の 2 ぀のこずが壊れおいたす。

  1. アプリケヌションに接続文字列を指定したせんでした。
  2. MongoDBはロヌカルで実行されおいたせん。

これを解決するには、デヌタベヌスの共有むンスタンスに接続文字列を提䟛できたすが、デヌタベヌスをロヌカルで管理できるようにし、開発に䜿甚しおいる同僚のデヌタを台無しにする心配をしないようにする必芁がありたす。 

ステップ 3: ロヌカラむズされたコンテナで MongoDB を実行する

MongoDBをダりンロヌドする代わりに、Mongoデヌタベヌスサヌビスをむンストヌル、構成、および実行したす。 MongoDB甚の Docker公匏むメヌゞ を䜿甚しお、コンテナで実行できたす。

コンテナでMongoDBを実行する前に、Dockerが氞続的なデヌタず構成を保存するために管理できるボリュヌムをいく぀か䜜成する必芁がありたす。 バむンドマりントを䜿甚する代わりに、Dockerが提䟛するマネヌゞドボリュヌムを䜿甚するのが奜きです。 ボリュヌムに関するすべおのドキュメントを読むこずができたす。

ドッカヌ甚のボリュヌムの䜜成

ボリュヌムを䜜成するために、デヌタ甚に 1 ぀、MongoDB の構成甚に 1 ぀䜜成したす。

ドッカヌボリュヌムはモンゎッドを䜜成したす

ドッカヌボリュヌム䜜成mongodb_config

ナヌザヌ定矩のブリッゞ・ネットワヌクの䜜成

次に、アプリケヌションずデヌタベヌスが盞互に通信するために䜿甚するネットワヌクを䜜成したす。 このネットワヌクはナヌザヌ定矩のブリッゞネットワヌクず呌ばれ、接続文字列を䜜成するずきに䜿甚できる優れたDNSルックアップサヌビスを提䟛したす。

ドッカヌネットワヌククリ゚むトモンゎッド

これで、MongoDBをコンテナで実行し、䞊蚘で䜜成したボリュヌムずネットワヌクにアタッチできたす。 Docker は Hub からむメヌゞをプルし、ロヌカルで実行したす。

docker run -it --rm -d -v mongodb:/data/db -v mongodb_config:/data/configdb -p 27017:27017 --network mongodb --name mongodb mongo

ステップ 4: 環境倉数を蚭定する

MongoDB が実行されたので、アプリケヌションがリッスンするポヌトずデヌタベヌスぞのアクセスに䜿甚する接続文字列を認識できるように、いく぀かの環境倉数も蚭定する必芁がありたす。 これは、docker runコマンドで正しく行いたす。

docker run \
-it --rm -d \
--network mongodb \
--name notes \
-p 8081:8081 \
-e SERVER_PORT=8081 \
-e SERVER_PORT=8081 \
-e DATABASE_CONNECTIONSTRING=mongodb://mongodb:27017/yoda_notes \
notes-service

ステップ 5: デヌタベヌス接続をテストする

アプリケヌションがデヌタベヌスに接続され、メモを远加できるこずをテストしたしょう。

curl --request POST \
--url http://localhost:8081/services/m/notes \
  --header 'content-type: application/json' \
  --data '{
"name": "this is a note",
"text": "this is a note that I wanted to take while I was working on writing a blog post.",
"owner": "peter"
}'

サヌビスから次の JSON が返されたす。

{"code":"success","payload":{"_id":"5efd0a1552cd422b59d4f994","name":"this is a note","text":"this is a note that I wanted to take while I was working on writing a blog post.","owner":"peter","createDate":"2020-07-01T22:11:33.256Z"}}

テストが完了したら、「docker stop notes mongodb」を実行しおコンテナを停止したす。

すごいNode.js のロヌカル開発環境の Docker 化の最初の手順を完了したした。 パヌトIIでは、Docker Composeを䜿甚しお、先ほど実行したプロセスを簡玠化する方法に぀いお説明したす。

ロヌカルノヌド.js開発環境をセットアップする方法 — パヌト 2

パヌト I では、Docker むメヌゞの䜜成ず Node.js アプリケヌション甚のコンテナヌの実行に぀いお説明したした。 たた、コンテナヌでのデヌタベヌスの蚭定ず、ロヌカル開発環境のセットアップでボリュヌムずネットワヌクがどのように圹割を果たすかに぀いおも説明したした。

パヌトIIでは、コンパむル、モゞュヌルの远加、アプリケヌションのデバッグをすべおコンテナ内で行うこずができる開発むメヌゞの䜜成ず実行に぀いお説明したす。 これにより、新しいアプリケヌションたたはプロゞェクトに移行する際の開発者のセットアップ時間を短瞮できたす。 この堎合、むメヌゞには Node.js ず NPM たたは YARN がむンストヌルされおいる必芁がありたす。 

たた、Docker Compose を䜿甚しお、開発マシン䞊で完党なマむクロサヌビス アプリケヌションをロヌカルに蚭定しお実行するプロセスを合理化する方法に぀いおも簡単に説明したす。

Node.js アプリケヌションの実行に䜿甚できる開発むメヌゞを䜜成したしょう。

ステップ 1: ドッカヌファむルを開発する

開発甚コンピュヌタヌにロヌカル ディレクトリを䜜成し、Dockerfile や開発むメヌゞに必芁なその他のファむルを保存するための䜜業ディレクトリずしお䜿甚できたす。

$ mkdir -p ~/projects/dev-image

このフォルダヌに Dockerfile を䜜成し、次のコマンドを远加したす。

FROM node:18.7.0
RUN apt-get update && apt-get install -y \
  nano \
  Vim

たず、node:18.7.0 の公匏むメヌゞを䜿甚したす。 このむメヌゞは開発むメヌゞの䜜成に適しおいるこずがわかりたした。 コンテナ内でファむルをすばやく線集したい堎合に備えお、画像にいく぀かのテキスト゚ディタを远加するのが奜きです。

基本むメヌゞの ENTRYPOINT に䟝存し、むメヌゞの開始時に CMD をオヌバヌラむドするため、Dockerfile に ENTRYPOINT たたは CMD を远加したせんでした。

ステップ 2: Docker むメヌゞをビルドする

むメヌゞを構築したしょう。

$ docker build -t node-dev-image .

そしお今、私たちはそれを実行するこずができたす。

$ docker run -it --rm --name dev -v $(pwd):/code node-dev-image bash

bashコマンドプロンプトが衚瀺されたす。 これで、コンテナヌ内で JavaScript ファむルを䜜成し、Node.js で実行できたす。

ステップ 3: むメヌゞをテストする

次のコマンドを実行しお、むメヌゞをテストしたす。

$ node -e 'console.log("hello from inside our container")'
hello from inside our container

すべおがうたくいけば、実甚的な開発むメヌゞがありたす。 これで、通垞のbashタヌミナルで行うすべおのこずを実行できたす。

䞊蚘の Docker コマンドを notes-service ディレクトリ内で実行するず、コンテナ内のコヌドにアクセスできるようになりたす。 notesサヌビスを開始するには、/codeディレクトリに移動しお実行したす npm run start。

ステップ 4: 䜜成を䜿甚しおロヌカルで開発する

ノヌトサヌビスプロゞェクトは、デヌタストアずしお MongoDB を䜿甚したす。 パヌトIで芚えおいるず思いたすが、Mongoコンテナを手動で起動し、メモサヌビスず同じネットワヌクに接続する必芁がありたした。 たた、アプリケヌションずMongoDBを再起動しおもデヌタを保持できるように、いく぀かのボリュヌムを䜜成する必芁がありたした。

代わりに、1぀のコマンドでノヌトサヌビスずMongoDbを開始するための䜜成ファむルを䜜成したす。 たた、デバッグモヌドでノヌトサヌビスを開始するように䜜成ファむルを蚭定したす。 このようにしお、デバッガヌを実行䞭のノヌドプロセスに接続できたす。

任意の IDE たたはテキスト゚ディタでノヌトサヌビスを開き、docker-compose.dev.yml ずいう名前の新しいファむルを䜜成したす。 以䞋のコマンドをコピヌしおファむルに貌り付けたす。

services:
 notes:
   build:
     context: .
   ports:
     - 8080:8080
     - 9229:9229
   environment:
     - SERVER_PORT=8080
     - DATABASE_CONNECTIONSTRING=mongodb://mongo:27017/notes
   volumes:
     - ./:/code
   command: npm run debug
 
 mongo:
   image: mongo:4.2.8
   ports:
     - 27017:27017
   volumes:
     - mongodb:/data/db
     - mongodb_config:/data/configdb
 volumes:
   mongodb:
   Mongodb_config:


この䜜成ファむルは、「docker run」コマンドに枡すためにすべおのパラメヌタヌを入力する必芁がないため、非垞に䟿利です。 䜜成ファむルで宣蚀的にそれを行うこずができたす。

デバッガヌをアタッチできるように、ポヌト 9229 を公開しおいたす。 たた、ロヌカル゜ヌスコヌドを実行䞭のコンテナにマッピングしお、テキスト゚ディタで倉曎を加え、それらの倉曎をコンテナで取埗できるようにしおいたす。

䜜成ファむルを䜿甚するもう1぀の本圓に優れた機胜は、サヌビス名を䜿甚するためのサヌビス解決が蚭定されおいるこずです。 その結果、接続文字列に "mongo" を䜿甚できるようになりたした。 「mongo」を䜿甚するのは、それが䜜成ファむルでmongoサヌビスに名前を付けたためです。

アプリケヌションを起動しお、正しく実行されおいるこずを確認したしょう。

$ docker compose -f docker-compose.dev.yml up --build

"–build" フラグを枡しお、Docker がむメヌゞをコンパむルしおから起動するようにしたす。

すべおがうたくいけば、メモずmongoサヌビスからのログが衚瀺されたす。

Dockerは、メモずmongoサヌビスからのログを衚瀺するタヌミナル出力を䜜成したす。
[クリックで拡倧]

次に、API ゚ンドポむントをテストしたしょう。 次の curl コマンドを実行したす。

$ curl --request GET --url http://localhost:8080/services/m/notes

次の応答が衚瀺されたす。

{"コヌド":"成功","メタ":{"合蚈":0,"カりント":0},"ペむロヌド":[]}

ステップ 5: デバッガヌに接続する

Chromeブラりザに付属のデバッガを䜿甚したす。 マシンでChromeを開き、アドレスバヌに次のように入力したす。

抂芁:怜査

以䞋の画面が開きたす。

DevTools は Chrome ブラりザヌで機胜し、デバむスずリモヌト タヌゲットの䞀芧を衚瀺したす。

[ノヌド専甚の開発ツヌルを開く] リンクをクリックしたす。 これにより、コンテナヌ内の実行䞭の Node.js プロセスに接続されおいる DevTools が開きたす。

゜ヌス コヌドを倉曎しおから、ブレヌクポむントを蚭定したしょう。 

次のコヌドを 19 行目の server.js ファむルに远加し、ファむルを保存したす。

server.use( '/foo', (req, res) => {
   return res.json({ "foo": "bar" })
 })

䜜成アプリケヌションが実行されおいるタヌミナルを芋るず、nodemonが倉曎に気づき、アプリケヌションをリロヌドしおいるこずがわかりたす。

Docker は、nodemon でリロヌドされたアプリケヌションを瀺すタヌミナル出力を䜜成したす。
[クリックで拡倧]

Chrome 開発ツヌルに戻り、20 行目にブレヌクポむントを蚭定したす。 次に、次の curl コマンドを実行しおブレヌクポむントをトリガヌしたす。

$ curl --request GET --url http://localhost:8080/foo

ブヌム 20行目でコヌドが壊れおいるのを芋たはずですが、今では通垞ず同じようにデバッガを䜿甚するこずができたす。 倉数の怜査ず監芖、条件付きブレヌクポむントの蚭定、スタックトレヌスの衚瀺など、さたざたなこずができたす。

結論

この蚘事では、Node.js のロヌカル開発環境の Docker 化の最初の手順を完了したした。 次に、さらに䞀歩進んで、通垞のコマンドラむンのように䜿甚できる䞀般的な開発むメヌゞを䜜成したした。 たた、゜ヌス コヌドを実行䞭のコンテナヌにマップするように䜜成ファむルを蚭定し、デバッグ ポヌトを公開したした。

さらに詳しく

関連蚘事