はじめに
インプルの矢島です。
dockerでReactとExpressとMySQLの環境構築してみた方法をまとめました。
今までのdocker経験は実務でdocker compose up -dをするくらいで、個人ではdockerファイルを書いて、環境作って遊んでいるくらいです。そして、ReactとExpressはあまり触ったことないです。
環境構築
最終的なディレクトリ構造は以下のようになります。
app/
├── .env
├── api
├── db
├── docker-compose.yml
└── react
①dockerをインストールして起動します。インストールはこちら
②.envファイル作成(userやpasswordは好きに設定して大丈夫です)
DB_ROOT_HOST=%
DB_NAME=appname
DB_USER=username
DB_PASS=password
TZ=Asia/Tokyo
③docker-compose.ymlファイル作成します。
version: '3'
services:
db:
image: mysql
environment:
- MYSQL_ROOT_HOST=${DB_ROOT_HOST}
- MYSQL_DATABASE=${DB_NAME}
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_ROOT_PASSWORD=${DB_PASS}
- TZ=${TZ}
ports:
- '3306:3306'
volumes:
- ./db/conf:/etc/mysql/conf.d/:ro
- mysql_data:/var/lib/mysql
- ./db/logs:/var/log/mysql
networks:
backend:
ipv4_address: 172.28.1.5
api:
image: node
environment:
- MYSQL_SERVER=db
- MYSQL_USER=${DB_USER}
- MYSQL_PASSWORD=${DB_PASS}
- MYSQL_DATABASE=${DB_NAME}
- TZ=${TZ}
- CHOKIDAR_USEPOLLING=true
tty: true
ports:
- '3000:3000'
volumes:
- ./api:/app
working_dir: /app
command: npm run dev
networks:
backend:
ipv4_address: 172.28.1.10
depends_on:
- db
react:
image: node
environment:
- CHOKIDAR_USEPOLLING=true
tty: true
ports:
- '8080:8080'
volumes:
- ./react:/app
working_dir: /app
command: bash -c 'npm start && npm run build'
networks:
- backend
depends_on:
- api
networks:
backend:
driver: bridge
name: app_network
ipam:
config:
- subnet: 172.28.1.0/24
volumes:
mysql_data:
docker-compose.ymlファイルについて少し解説します。
versionとは、composeファイルのバージョンを定義します。公式は最新を指定することを推奨しているため、最新の3を定義します。
servicesでは、アプリケーションを構成するためのサービスの設定をします。今回は、dbとapiとwebを定義します。
imageとはコンテナのもととなるイメージというものを指定します。今回は、dbはmysqlのイメージで、apiとwebはnodeです。イメージはdockerhubから検索して使用可能です。
enviromentとは、コンテナ内で使用する環境変数を定義します。
portsとは、公開用のポートを設定します。ホスト側:コンテナ側のポートを指定できます。
volumesとは、コンテナで扱うデータを永続化する仕組みです。mysql_dataは名前付きで作成したので、最後の行にボリューム設定します。
networksとは、各コンテナのネットワークの設定ができます。下の方に、networksとして、backendというネットワークを準備しました。そこでサブネットを指定しています。そのサブネットの範囲でIP アドレスを指定します。
depends_onでは、アプリケーションの依存関係を表します。今回では、apiがdbに依存しているため、dbが起動した後にapiが立ち上がります。
ttyとは、コンテナを継続して立ち上げます。
working_dirとは、コンテナのカレントディレクトリを指定しています。後述するcommandを実行するディレクトリにもなります。
commandとは、起動時に実行するコマンドを指定します。
④環境構築の手順に戻ります。apiとdbのディレクトリを作成します。
$ mkdir api db //docker-compose.ymlが置いてある階層でapiとdbのディレクトリを作成
⑤apiのコンテナ内でexpressのインストール等を行います。
$ docker-compose run --rm --no-deps api /bin/bash
$ npm install -g npm
$ npm install express
$ npm install express-session
$ npx express-generator
$ npm install
$ npm install nodemon
$ exit
⑥reactのコンテナ内でreactのインストールを行います。
$ docker-compose run --rm --no-deps react /bin/bash
$ npm install -g npm
$ npm install -g create-react-app
$ npx create-react-app . //現在のディレクトリにreactアプリを作成する
$ npm install
$ exit
⑦api/composer.jsonにnodemonのscriptsを追加します。
"scripts": {
"dev": "nodemon ./bin/www", //これを追加
"start": "node ./bin/www"
},
⑧react/composer.jsonのstartを8080ポートで開くように修正(デフォルトは3000ポートでapiのポートとぶつかってしまうため)
"scripts": {
"start": "PORT=8080 react-scripts start", //このように変更
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
⑨コンテナを起動します。
$ docker-compose up -d
確認
Expressの起動状況を確認します。下記URLにアクセスします。
http://localhost:3000/
無事表示されていました!
次にReactの起動状況を確認します。下記URLにアクセスします。
http://localhost:8080/
Reactも無事表示されています!
最後にMySQLの起動状況を確認します。下記コマンドを実行してみます。
$ docker-compose exec db /bin/bash //コンテナの中にはいる
$ mysql -u username -p //usernameの部分は.envに記載したusernameにあたる。パスワードは.env記載のpasswordです。
上記コマンドでMySQLの中に入れたら成功です! databaseも正しく表示されています。
まとめ
いかがでしたでしょうか?
うまく環境構築できない場合は、nodemoduleを消して再度npm installを試してみてください。。
dockerって改めて便利だな〜って思いました。