この記事は、Docker(Docker-Compose)を利用しReactの開発環境・本番環境(Nginx,Let’sEncrypt)の構築方法を紹介します。
◆動作検証環境
・OS:mac Big Sur
・Docker desktop:4.1.1(Engine:20.10.8, Compose:1.29.2)
【リモート環境】
・さくらVPSサーバー:メモリ 512M, ストレージ:SSD 25GB, CPU:1コア
・OS:Ubuntu 20.04
・Docker:20.10.7
・Docker Compose:1.23.2
【共通環境】
・Node:16
・Nginx:1.19.0
プロジェクトファイルの設定
まずは、ローカル環境でDockerを利用しReactを開発する環境を準備します。
Reactプロジェクトの作成
プロジェクトを作成するディレクトリに移動して、Reactプロジェクトを作成します。
1 2 3 | $ npx create-react-app react-nginx-docker |
Dockerfileの作成
作成したReactプロジェクトのルートディレクトリにDockerfileを作成します。
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | FROM node:16-alpine WORKDIR /app COPY package.json ./ COPY package-lock.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["npm", "start"] |
.dockerignoreファイルの作成
作成したReactプロジェクトのルートディレクトリに.dockerignoreを作成します。
.dockerignore
1 2 3 4 5 6 7 | node_modules npm-debug.log Dockerfile .dockerignore .gitignore |
docker-compose.ymlファイルの作成
作成したReactプロジェクトのルートディレクトリにdocker-compose.ymlファイルの作成を作成します。
docker-compose.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 | version: "3" services: app: build: context: . dockerfile: Dockerfile volumes: - ./src:/app/src ports: - "3000:3000" |
ローカル用コンテナのイメージ作成、コンテナ作成、起動
ここまで設定ができたら一度イメージの作成、コンテナの作成、起動を行い、Dockerエンジンを利用した状態でReactのウェルカムページの確認を行います。
ローカル環境へのDockerのインストールがまだの場合は、下記のサイトからインストールします。
コンテナの作成、起動
この段階でディレクトリ構造は以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | react-nginx-docker ├── Dockerfile ├── README.md ├── docker-compose.yml ├── node_modules │ ├──... │ ... ├── package-lock.json ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.txt └── src ├── App.css ├── App.js ├── App.test.js ├── index.css ├── index.js ├── logo.svg ├── reportWebVitals.js └── setupTests.js |
-dのオプションをつけて、コンテナのの作成後、バックグラウンドで起動
1 2 3 | $ docker-compose up -d |
作成したイメージの確認
以下のコマンドで作成したイメージを確認する事ができます。
1 2 3 | $ docker-compose images |
以下のように表示されます。
1 2 3 4 5 | Container Repository Tag Image Id Size ------------------------------------------------------------------------------------ react-nginx-docker_app_1 react-nginx-docker_app latest 12954dcb13ff 370.3 MB |
作成したコンテナの確認
以下のコマンドで確認する事が可能です。
1 2 3 | $ docker-compose ps |
以下のように表示されます(起動していないときStateの項目はExit)。
1 2 3 4 5 | Name Command State Ports ------------------------------------------------------------------------------------------ react-nginx-docker_app_1 docker-entrypoint.sh npm start Up 0.0.0.0:3000->3000/tcp |
ブラウザで表示を確認
http://localhost:3000
ぐるぐるが確認できればOK
以下のコマンドでログを確認します。
1 2 3 | $ docker-compose logs -f |
確認ができたら、コンテナの起動を停止、削除します。
1 2 3 | $ docker-compose down |
コンテナの停止のみ行う場合は以下のコマンドを実行します。
1 2 3 | $ docker-compose stop |
(本番環境用プロジェクトのBuild)
ローカル環境を利用してbuildした状態のプロジェクトの表示・動作を確認します。
※確認の必要がなければスキップしてください。
本番環境用としてBuildディレクトリを作成するためにbuidコマンドを実行します。
1 2 3 | $ npm run build |
1 2 3 | $ npx serve -s build |
1 2 3 4 5 6 7 8 9 10 11 12 | ┌───────────────────────────────┐ │ │ │ Serving! │ │ │ │ - Local: http://localhost:3000 │ │ - On Your Network: http://192.168.xxx.xx:3000 │ │ │ │ Copied local address to clipboard! │ │ │ └───────────────────────────────┘ |
本番環境用ファイル設定
Nginxの設定
本番環境でWebサーバーとして利用するNginxの設定を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | server { listen 80; listen [::]:80; server_name yoursite.com; root /usr/share/nginx/html; index index.html; location ^~ /.well-known/acme-challenge/ { root /usr/share/nginx/html; } } |
本番環境用Dockerfileの作成
ReactプロジェクトのルートディレクトリにDockerfile.prodを作成します。
prod/Dockerfile.prod
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | FROM node:16-alpine AS builder WORKDIR /app COPY package.json ./ COPY package-lock.json ./ RUN npm install COPY . . RUN npm run build FROM nginx:1.19-alpine AS server COPY ./etc/nginx.conf /etc/nginx/conf.d/default.conf RUN apk update \ && apk upgrade \ && apk add --no-cache openssl \ && apk add --no-cache certbot COPY --from=builder ./app/build /usr/share/nginx/html EXPOSE 80 |
本番環境用docker-compose.ymlの作成
Reactプロジェクトのルートディレクトリにdocker-compose.prod.ymlを作成します。
これ以降の方法は、有料記事として紹介しています。
【Docker(Docker-Compose)】Reactの開発・本番環境構築【Nginx,Let’sEncrypt利用】
有料記事内で解説している内容は以下のとおりです。
・GitHubへプロジェクトのpushとリモートサーバーからのclone方法
・本番環境(リモートサーバー)へのDockerとDockerComposeのインストールと初期設定
・本番環境でのサイト表示、動作確認①(独自ドメイン使用)
・本番環境でのサイト表示、動作確認②(SSL(https)対応表示)
・letsencryptの証明書更新の自動化
・開発、本番環境での開発方法