React + Node + Docker + Postgres (#3 Docker構築)

React、Node環境をDockerで起動できるようにします。
(前回の記事は下記になります)

Docker構築

Dockerのインストールの手順は省略します。
フロントエンドとバックエンドのDockerファイルを作成します。

touch ./src/front/Dockerfile.front
touch ./src/app/Dockerfile.app

Dockerfile.front

FROM node:12-alpine AS BUILD_IMAGE

WORKDIR /nrdp

COPY ./package*.json ./
RUN npm ci

COPY ./config ./config
COPY ./src/front ./src/front
RUN mkdir dist

ENV CHOKIDAR_USEPOLLING=true
EXPOSE 8080

CMD ["npm", "run", "front"]

Dockerfile.app

FROM node:12-alpine AS BUILD_IMAGE

WORKDIR /nrdp

COPY ./package*.json ./
RUN npm ci

COPY ./src/app ./src/app

EXPOSE 3000

CMD ["npm", "run", "app"]

フロントエンド、バックエンドを起動するdocker-composeファイルを作成します。

touch ./docker-compose.yml

docker-compose.yml

version: "3"

services:
 app:
   build:
     context: .
     dockerfile: ./src/app/Dockerfile.app
   ports:
     - "3000:3000"
   volumes:
     - ./src/app:/nrdp/src/app
   tty: true
   networks: 
     - react-node-docker-postgres

 front:
   build:
     context: .
     dockerfile: ./src/front/Dockerfile.front
   ports:
    - "8080:8080"
   volumes:
     - ./src/front:/nrdp/src/front
   tty: true
   networks: 
     - react-node-docker-postgres

networks: 
   react-node-docker-postgres:

Dockerで起動するので、フロントエンド - バックエンド連携の設定を変更します。webpack.configのdevServerのhost、proxyを修正します。
proxyのtargetで指定するURLのホスト名はdocker-compose.ymlで指定したサービス名となります。

webpack.config

 devServer: {
 historyApiFallback: true,
 inline: true,
 open: true,
 host: '0.0.0.0',
 port: 8080,
 proxy: {
   '/api/**': {
     target: 'http://app:3000',
     secure: false,
     logLevel: 'debug'
   }
 },
},

Dockerを起動します。

docker-compose up -build

localhost:8080でアクセスできるようになります。
起動したまま、バックエンドとフロントエンドを修正してみます。

src/app/js/main.js

app.get('/api/docker', (req, res) => {
 const dockerMsg = 'Connected Docker!';
 res.send({ docker: dockerMsg });
});

src/front/js/node/Node.jsx

import React, { Component } from 'react';
import { getJSON } from "../utils/HttpUtils";

export default class NodeApp extends React.Component {

 state = {
   nodeResult: "",
   dockerResult: ""
 }
   
 componentDidMount() {
   const responseJson = getJSON("/api/node")
   .then(responseJson => this.setState({ nodeResult: responseJson.api }));

   const dockerResponseJson = getJSON("/api/docker")
   .then(dockerResponseJson => this.setState({ dockerResult: dockerResponseJson.docker }));
 }
 
 render() {
   return (
     <div className="NodeApp">
       <div>
         {this.state.nodeResult}
       </div>
       <div>
         {this.state.dockerResult}
       </div>
     </div>
   );
 }
}

Dockerの再起動しなくてもブラウザが更新されます。

画像1


Dockerでのデバッグ

Dockerコンテナにデバッグできるようにlaunch.jsonを修正します。

launch.json

{
   // IntelliSense を使用して利用可能な属性を学べます。
   // 既存の属性の説明をホバーして表示します。
   // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
   "version": "0.2.0",
   "configurations": [
       {
           "type": "node",
           "request": "attach",
           "name": "Docker: Attach to Node",
           "port": 9229,
           "address": "localhost",
           "localRoot": "${workspaceFolder}/src/app/js",
           "remoteRoot": "/nrdp/src/app/js",
           "protocol": "inspector"
       }
   ]
}

バックエンドの起動をデバッグモードで起動できるように「app-debug」を追加します。

package.json

  "scripts": {
   "front": "webpack-dev-server --config ./config/webpack.config.js --open --mode development",
   "app": "nodemon src/app/js/main.js  --exec babel-node",
   "app-debug": "nodemon -L --inspect-brk=0.0.0.0:9229 src/app/js/main.js  --exec babel-node",
   "dev": "concurrently \"npm run front\" \"npm run app\""
 },

Dockerfile.app

FROM node:12-alpine AS BUILD_IMAGE

WORKDIR /nrdp

COPY ./package*.json ./
RUN npm ci

COPY ./src/app ./src/app

EXPOSE 3000

CMD ["npm", "run", "app-debug"]

デバッグ用のポートをDockerコンテナ(app)が受け付けられるように修正します。

services:
 app:
   build:
     context: .
     dockerfile: ./src/app/Dockerfile.app
   ports:
     - "3000:3000"
     - "9229:9229"
   volumes:
     - ./src/app:/nrdp/src/app
   tty: true
   networks: 
     - react-node-docker-postgres

「docker-compose up -build」で起動します。
起動後、VSCode左メニューバーのデバッグをクリックし、「Docker: Attach to Node」を選択します。

画像2

①ブレークポイントを貼りたい箇所をクリック
②左のブレークポイントにファイル名が表示されるので、クリック

画像3

ブラウザでアプリを更新するとブレークポイントで止まります。
変数の値を確認、更新することができます。

画像4

画像5

ここまでのものはこちらになります。
【デバッグあり】
https://github.com/YosukeKondo/react-node-docker-postgres/releases/tag/v3.0_docker
【デバッグなし】
https://github.com/YosukeKondo/react-node-docker-postgres/releases/tag/v3.1_docker

次回はDockerでPostgreSQLを起動させ、NodeからSequelizeを利用しアクセスできるようにします。


この記事が気に入ったらサポートをしてみませんか?