投稿日:2020年9月23日
dockerとdocker-composeを使ったreactの開発・デプロイ環境の構築方法について、詳しく解説します!
Reactアプリケーションの開発において、開発環境の構築はなかなか頭を悩ますことだと思います。
この記事ではDockerとdocker-composeを利用して快適にreactの開発からデプロイまでを行う方法について解説します。
dockerとdocker-compose、create-react-appのコマンドを利用しています。まだ環境が用意できていない場合は以下のリンクを参考にインストールしましょう。
この記事では以下の技術についてある程度理解している前提で話を進めていきます。
全く知らない物がある場合には公式サイトのチュートリアルを通しておくとスムーズに読み進められると思います。
この記事は以下の環境で動作を確認しました。
まずはじめに開発環境全体のディレクトリ構造について説明します。
.
├── 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アプリケーションのソースコードの実体です。
create-react-appフレームワークの
npx create-react-app my-appコマンドで生成されたディレクトリです。
開発環境のコンテナをImageをビルドするためのDockerfileで、
create-react-appで作成されたアプリケーションに、デフォルトで入っている開発用サーバーを起動させるようになっています。
FROM node:latest
COPY src /react_app
WORKDIR /react_app/my-app
ENTRYPOINT ["npm", "start"]
このDockerfileではreactアプリケーションをビルドして、生成されたディレクトリ(/react_app/my-app/build)をnginxから公開する設定になっています。
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のディレクトリを参照できます。
このファイルはローカルで開発する際のDockerコンテナの環境構築に利用する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 > buildでcontextとdockerfileを指定しています。
このパラメータの指定によってビルドする対象のDockerfileを指定できます。
この設定によってdev環境とデプロイするDockerfileを使い分けることができるという訳ですね!
このファイルは実際にサーバーにデプロイする環境を構築するdocker-composeの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をどのサービスでどのように使用するのかによって変わってきます。適宜適切な値を設定しましょう。
上で説明したようなディレクトリを作成したあとは次のような手順で開発から公開まで流していきます。
以下のようなコマンドでdocker-composeで開発環境を起動させreact_app/src/my-appディレクトリでアプリケーションを開発していきます。
自分が作成した環境の場合
に開発用サーバーが起動しています。
$ 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を使用して好きなサービスにデプロイしましょう。