※このブログではサーバー運用、技術の検証等の費用のため広告をいれています。
記事が見づらいなどの問題がありましたらContactからお知らせください。


React+Docker+DockerComposeの開発環境の構築について説明

react web開発 フロント開発 Docker docker-compose

投稿日:2020年9月23日

このエントリーをはてなブックマークに追加
dockerとdocker-composeを使ったreactの開発・デプロイ環境の構築方法について、詳しく解説します!

はじめに

この記事について

Reactアプリケーションの開発において、開発環境の構築はなかなか頭を悩ますことだと思います。


この記事ではDockerとdocker-composeを利用して快適にreactの開発からデプロイまでを行う方法について解説します。
dockerとdocker-compose、create-react-appのコマンドを利用しています。まだ環境が用意できていない場合は以下のリンクを参考にインストールしましょう。

前提知識

この記事では以下の技術についてある程度理解している前提で話を進めていきます。

全く知らない物がある場合には公式サイトのチュートリアルを通しておくとスムーズに読み進められると思います。

  • react
  • Docker
  • docker-compose

環境

この記事は以下の環境で動作を確認しました。

  • Docker : Version 19.03.12
  • docker-compose : version 1.26.2
  • OS : macOS version 10.15.6


ディレクトリ構造

まずはじめに開発環境全体のディレクトリ構造について説明します。

.
├── docker-compose.prod.yml
├── docker-compose.yml
└── react_app
    ├── Dockerfile.dev
    ├── Dockerfile.prod
    └── src
        └── my-app
            ├── README.md
            ├── node_modules
            ├── package.json
            ├── public
            ├── src
            └── yarn.lock

まずはそれぞれのファイル、ディレクトリについて詳しく解説していきます!

react_app/src/my-app

これがreactアプリケーションのソースコードの実体です。

create-react-appフレームワークの
npx create-react-app my-appコマンドで生成されたディレクトリです。

react_app/Dockerfile.dev

開発環境のコンテナをImageをビルドするためのDockerfileで、
create-react-appで作成されたアプリケーションに、デフォルトで入っている開発用サーバーを起動させるようになっています。

react_app/Dockerfile.dev
FROM node:latest

COPY src /react_app
WORKDIR /react_app/my-app
ENTRYPOINT ["npm", "start"]

react_app/Dockerfile.prod

このDockerfileではreactアプリケーションをビルドして、生成されたディレクトリ(/react_app/my-app/build)をnginxから公開する設定になっています。

react_app/Dockerfile.prod
FROM node:latest AS builder
COPY src /react_app
WORKDIR /react_app/my-app
RUN npm install
RUN npm run build

FROM nginx:latest
RUN rm -r -f /usr/share/nginx/html
COPY --from=builder /react_app/my-app/build /usr/share/nginx/html

ここでdockerのmulti-stage buildの機能を使用しています。
npm run buildコマンドでreactによる静的ファイルが/react_app/my_app/buildディレクトリに生成されます。

次の行FROM nginx:latestで別のImageを利用します。


nginxのImageはデフォルトで/usr/share/nginx/htmlを公開する設定になっています。
/usr/share/nginx/htmlディレクトリにはnginxのサンプルページがあるのでRUN rm -r -f /usr/share/nginx/htmlのコマンドでそれを削除し、COPY --from=builder /react_app/my-app/build /usr/share/nginx/htmlコマンドでreactのビルドで生成されたディレクトリに置き換えています。

multi-state buildでは--fromオプションでそのDockerfile内で定義されている他のImageのディレクトリを参照できます。

react_app/docker-compose.yml

このファイルはローカルで開発する際のDockerコンテナの環境構築に利用するymlファイルです。

react_app/docker-compose.yml
version: "3"

services:
  react_app:
    build:
      context: ./react_app
      dockerfile: Dockerfile.dev
    image: gcr.io/myproject/react_app
    ports:
      - 3000:3000
    volumes:
      - ./react_app/src:/react_app

services > react_app > buildcontextdockerfileを指定しています。

  • context:ビルドするDockerfileの存在するディレクトリ
  • dockerfile:ビルドする対象のDockerfile

このパラメータの指定によってビルドする対象のDockerfileを指定できます。
この設定によってdev環境とデプロイするDockerfileを使い分けることができるという訳ですね!

react_app/docker-compose.prod.yml

このファイルは実際にサーバーにデプロイする環境を構築するdocker-composeのymlファイルです。

react_app/docker-compose.prod.yml
version: "3"

services:
  react_app:
    build:
      context: ./react_app
      dockerfile: Dockerfile.prod
    image: gcr.io/myproject/react_app   # 適宜で適切な値を設定
    ports:
      - 80:80

このymlファイルではreact_app/docker-copose.ymlとはdockerfileの参照が公開用のDockerfileに変わっています。

またimageというパラメータが利用されています。
自分は普段GCPを使用しているのですが、GCPのImageRegistryに作成したImageをあげる際にタグを付け直す必要があり、このタグを毎回付け直すのは面倒なため、docker-composeファイルで設定しています。

ちなみにGCPの場合このタグは

ホスト名/プロジェクトID/好きなレジストリ名

という規則になっています。タグについてはそのImageをどのサービスでどのように使用するのかによって変わってきます。適宜適切な値を設定しましょう。


開発から公開の流れ

上で説明したようなディレクトリを作成したあとは次のような手順で開発から公開まで流していきます。

Reactアプリケーションの開発

以下のようなコマンドでdocker-composeで開発環境を起動させreact_app/src/my-appディレクトリでアプリケーションを開発していきます。
自分が作成した環境の場合

http://localhost:3000

に開発用サーバーが起動しています。

ターミナル
$ cd react_app
$ sudo docker-compose up --build -d

開発を終了させる時にはちゃんとdownさせます。

ターミナル
$ sudo docker-compose down

ローカルでビルドして確認

ローカルで以下のようなコマンドでReactアプリケーションをビルドしてnginxサーバーから配信される状態を確認します。
自分が作った環境の場合

http://localhost
にnginxのサーバーが起動します。

ターミナル
$ cd react_app
$ sudo docker-compose -f docker-compose.prod.yml up -d --build

ここで使用している-fオプションを使うことで好きなファイル名のymlファイルをdocker-composeに利用できます。

公開

『ローカルでビルドして確認』で実行したコマンドで適切なタグのついたImageが作成されているはずです。そのImageを使用して好きなサービスにデプロイしましょう。

このエントリーをはてなブックマークに追加


関連記事

記事へのコメント