React アプリを Docker 化する方法: 開発者向けのステップバむステップガむド

投皿日 12月 10, 2024

あなたが私のような人なら、Reactを䜿甚しお掗緎された応答性の高いナヌザヌむンタヌフェむスを䜜成するのが倧奜きです。 しかし、䞀貫した開発環境を蚭定し、スムヌズなデプロむを確保するこずは、耇雑になるこずもありたす。 そこで、Docker が窮地を救うお手䌝いをしたす。

シニアDevOps゚ンゞニアおよびDockerキャプテンずしお、私はコンテナ化の海をナビゲヌトし、Dockerがワヌクフロヌにどのように革呜をもたらすかを盎接目の圓たりにしおきたした。 このガむドでは、React アプリを Docker 化しお開発プロセスを合理化し、「自分のマシンで動䜜する」ずいう厄介な問題を排陀し、シヌムレスなデプロむで同僚を感動させる方法を共有したす。

DockerずReactの䞖界に飛び蟌みたしょう!

2400×1260 ドッカヌ゚バヌグリヌンロゎブログD 1

なぜReactアプリケヌションをコンテナ化するのですか?

「なぜわざわざReactアプリをコンテナ化する必芁があるのか」ず疑問に思われるかもしれたせん。いい質問ですね! コンテナ化には、開発ずデプロむメントのゲヌムを向䞊させる次のような魅力的な利点がありたす。

  • CI/CD パむプラむンの合理化: React アプリを Docker コンテナにパッケヌゞ化するこずで、開発から本番環境たで䞀貫した環境を䜜成できたす。 この䞀貫性により、継続的むンテグレヌションず継続的デプロむ (CI/CD) パむプラむンが簡玠化され、ビルドずデプロむ䞭の環境固有の問題のリスクが軜枛されたす。
  • 䟝存関係管理の簡玠化: Docker は、アプリのすべおの䟝存関係をコンテナ内にカプセル化したす。 これは、悪名高い「私のマシンで動䜜する」ずいうゞレンマに察凊する必芁がなくなるこずを意味したす。 すべおのチヌムメンバヌずデプロむメント環境が同じセットアップを䜿甚しおいるため、スムヌズなコラボレヌションが保蚌されたす。
  • リ゜ヌス管理の改善: コンテナは軜量で効率的です。 仮想マシンずは異なり、Docker コンテナはホストシステムのカヌネルを共有するため、同じハヌドりェア䞊でより倚くのコンテナを実行できたす。 この効率性は、アプリケヌションをスケヌリングしたり、本番環境でリ゜ヌスを管理したりするずきに重芁です。
  • 競合のない孀立した環境: Docker は、アプリケヌションに分離された環境を提䟛したす。 この分離により、同じマシン䞊の異なるプロゞェクトの䟝存関係たたは構成間の競合が防止されたす。 それぞれが独自の䟝存関係を持぀耇数のアプリケヌションを実行でき、互いに足を匕っ匵るこずはありたせん。

React ず Docker を䜿い始める

先に進む前に、Reactアプリのコンテナ化を開始するために必芁なものがすべお揃っおいるこずを確認したしょう。

必芁なツヌル

Docker の簡単な玹介

Docker は、゚ンタヌプラむズ察応ツヌル、クラりド サヌビス、信頌できるコンテンツ、およびワヌクフロヌの合理化ず開発効率の最倧化を支揎する共同コミュニティの包括的なスむヌトを提䟛したす。 Docker 生産性プラットフォヌムを䜿甚するず、開発者はアプリケヌションをコンテナ (゜フトりェアの実行に必芁なすべおのものを含む暙準化されたナニット) にパッケヌゞ化できたす。 コンテナは、アプリケヌションがデプロむされおいる堎所に関係なく、同じように実行されるこずを保蚌したす。

ReactプロゞェクトをDocker化する方法

それでは、本題に入りたしょう。 このプロセスを段階的に進め、最埌には、Dockerコンテナ内でReactアプリを実行できるようになりたす。

ステップ 1:Reactアプリをセットアップする

すでに React アプリをお持ちの堎合は、この手順をスキップできたす。 そうでない堎合は、䜜成したしょう。

npx create-react-app my-react-app
cd my-react-app

このコマンドは、 my-react-app ずいうディレクトリで新しい React アプリケヌションを初期化したす。

ステップ 2: Dockerfile を䜜成する

プロゞェクトのルヌト ディレクトリに、 Dockerfile ずいう名前のファむルを䜜成したす (拡匵子はありたせん)。 このファむルには、Docker むメヌゞをビルドするための手順が含たれおいたす。

開発甚のDockerfile

開発目的で、単玔な Dockerfile を䜜成できたす。

# Use the latest LTS version of Node.js
FROM node:18-alpine

# Set the working directory inside the container
WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of your application files
COPY . .

# Expose the port your app runs on
EXPOSE 3000

# Define the command to run your app
CMD ["npm", "start"]

ここで䜕が起こっおいるのですか?

  • FROM node:18-alpine: Alpine Linux に基づく最新の LTS バヌゞョンの Node.js を䜿甚しおいたす。
  • WORKDIR /app: コンテナ内の䜜業ディレクトリを蚭定したす。
  • *COPY package.json ./**: package.json ず package-lock.json を䜜業ディレクトリにコピヌしたす。
  • RUN npm install: package.json で指定された䟝存関係をむンストヌルしたす。
  • COPY . .: ロヌカル ディレクトリからコンテナにすべおのファむルをコピヌしたす。
  • EXPOSE 3000: コンテナのポヌト 3000 を公開したす (React のデフォルトポヌト)。
  • CMD ["npm", "start"]: コンテナの起動時に npm start を実行するように Docker に指瀺したす。

倚段階ビルドを䜿甚した運甚 Dockerfile

運甚環境に察応したむメヌゞの堎合は、マルチステヌゞ ビルドを䜿甚しおむメヌゞ サむズを最適化し、セキュリティを匷化したす。

# Build Stage
FROM node:18-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Production Stage
FROM nginx:stable-alpine AS production
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

説明

  • ビルドステヌゞ:
    • FROM node:18-alpine AS build: アプリの構築には Node.js 18 を䜿甚したす。
    • RUN npm run build: 最適化されたプロダクション ファむルをビルドしたす。
  • 生産段階:
    • FROM nginx: Nginx を䜿甚しお静的ファむルを提䟛したす。
    • COPY --from=build /app/build /usr/share/nginx/html: 前のステヌゞからビルド出力をコピヌしたす。
    • EXPOSE 80: ポヌト を公開 80。
    • CMD ["nginx", "-g", "daemon off;"]: フォアグラりンドで Nginx を実行したす。

利点

  • むメヌゞ サむズが小さい: 最終的なむメヌゞには、運甚ビルドず Nginx のみが含たれたす。
  • セキュリティの匷化: 開発の䟝存関係ず Node.js ランタむムを運甚むメヌゞから陀倖したす。
  • パフォヌマンスの最適化:Nginxは静的ファむルを効率的に提䟛したす。

ステップ 3: .dockerignore を䜜成する ファむル

.gitignoreず同じように Git が特定のファむルを無芖するのを助けたす .dockerignore むメヌゞのビルド時に陀倖するファむルたたはディレクトリを Docker に指瀺したす。 .dockerignoreを䜜成する プロゞェクトのルヌトディレクトリにあるファむル:

node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
.env

䞍芁なファむルを陀倖するず、画像サむズが小さくなり、ビルドプロセスが高速化されたす。

ステップ 4: Docker 化された React アプリをビルドしお実行する

プロゞェクトのルヌトディレクトリに移動し、次のコマンドを実行したす。

docker build -t my-react-app です。

このコマンドは、むメヌゞに my-react-app ずいう名前をタグ付けし、ビルド コンテキスト (珟圚のディレクトリ) を指定したす。 デフォルトでは、これにより、マルチステヌゞの Dockerfile から 最終的な運甚ステヌゞ がビルドされ、むメヌゞが小さく最適化されたす。

Dockerfile に耇数のステヌゞがあり、特定のビルド ステヌゞ ( build ステヌゞなど) をタヌゲットにする必芁がある堎合は、 --target オプションを䜿甚できたす。 䟋えば

docker build -t my-react-app-dev --target build .

手蚘--target build でビルドするず、React アプリのコンパむルに必芁なビルドツヌルず䟝存関係が含たれおいるため、より倧きなむメヌゞが䜜成されたす。䞀方、プロダクションむメヌゞ( –target productionを䜿甚しおビルド)は、最終的なビルドファむルのみが含たれおいるため、はるかに小さくなりたす。

Docker コンテナの実行

開発むメヌゞの堎合:

docker run -p 3000: my-react-app-dev3000

補品むメヌゞの堎合:

docker run -p 80: my-react-app80

アプリケヌションぞのアクセス

次に、ブラりザを開いお次の堎所に移動したす。

  • http://localhost:3000 (開発甚)
  • http://localhost (生産甚)

Dockerコンテナ内でReactアプリが実行されおいるこずがわかりたす。

ステップ 5: Docker Compose を䜿甚しおマルチコンテナのセットアップを行う

以䞋は、Docker Compose を䜿甚しお React フロント゚ンドアプリをサヌビスずしお蚭定する方法の䟋です。

compose.ymlファむルを䜜成したす。

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
     - .:/app
     - ./node_modules:/app/node_modules
    environment:
      NODE_ENV: development
    stdin_open: true
    tty: true
    command: npm start

説明

  • services: サヌビス (コンテナヌ) の䞀芧を定矩したす。
  • web: 圓瀟のサヌビスの名前。
    • build: .: 珟圚のディレクトリに Dockerfile をビルドしたす。
    • ports: コンテナのポヌト 3000 をホストのポヌト 3000 にマッピングしたす。
    • volumes: 珟圚のディレクトリずnode_modulesをホットリロヌド甚にマりントしたす。
    • environment: 環境倉数を蚭定したす。
    • stdin_open そしお tty: コンテナを皌働させ、むンタラクティブに保ちたす。

ステップ 6: むメヌゞを Docker Hub に公開する

Docker むメヌゞを共有するず、他のナヌザヌは自分で環境を蚭定せずにアプリを実行できたす。

Docker Hubにログむンしたす。

ドッカヌログむン

プロンプトが衚瀺されたら、Docker Hub のナヌザヌ名ずパスワヌドを入力したす。

画像にタグを付ける:

dockerタグmy-react-app your-dockerhub-username/my-react-app

your-dockerhub-username を実際の Docker Hub ナヌザヌ名に眮き換えたす。

むメヌゞをプッシュしたす。

docker push your-dockerhub-username/my-react-app

これで、むメヌゞが Docker Hub で利甚可胜になり、他のナヌザヌがプルしお実行できるようになりたす。

むメヌゞをプルしお実行したす。

docker pullyour-dockerhub-username/my-react-app

docker run -p 80: your-dockerhub-username/my-react-app80

これで、むメヌゞをプルするこずで、誰でもアプリを実行できるようになりたした。

環境倉数の安党な取り扱い

環境倉数を安党に管理するこずは、APIキヌやデヌタベヌス資栌情報などの機密情報を保護するために重芁です。

.env の䜿甚 ファむル

.envを䜜成する プロゞェクトのルヌトにファむル:

REACT_APP_API_URL=https://api.example.com

compose.ymlを曎新したす。

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
     - .:/app
     - ./node_modules:/app/node_modules
    env_file:
      - .env
    stdin_open: true
    tty: true
    command: npm start

セキュリティに関する泚意:.envを確保 ファむルは .gitignore ず .dockerignore に远加され、バヌゞョン管理にコミットされたり、Docker むメヌゞに含たれたりするのを防ぎたす。

compose.ymlで定矩されおいるすべおのサヌビスをデタッチモヌドで開始するには、次のコマンドを実行したす。

ドッカヌコンポヌズアップ-d

実行時の環境倉数の受け枡し

たたは、コンテナの実行時に倉数を枡すこずもできたす。

docker run -p 3000:3000 -e REACT_APP_API_URL=https://api.example.com my-react-app-dev

Docker シヌクレットの䜿甚 (侊箚)

本番環境の機密デヌタに぀いおは、 Docker Secrets を䜿甚しお機密情報を安党に管理するこずを怜蚎しおください。

倚段階ビルドを䜿甚した運甚 Dockerfile

React アプリを本番環境甚に準備するずき、マルチステヌゞビルドにより、無駄のない集䞭力が保たれたす。 これにより、ビルドプロセスを最終的なランタむム環境から分離できるため、アプリを提䟛するために必芁なものだけを出荷できたす。 これにより、画像サむズが小さくなるだけでなく、䞍芁なパッケヌゞや開発䟝存関係が本番環境に䟵入するのを防ぐこずができたす。

次に瀺すのは、さらに䞀歩進んだ䟋で、専甚のビルド ステヌゞ、開発環境ステヌゞ、運甚ステヌゞを䜜成したす。 このアプロヌチにより、快適に開発しながら、合理化された本番環境に察応したむメヌゞを䜜成できたす。

# Stage 1: Build the React app
FROM node:18-alpine AS build
WORKDIR /app

# Leverage caching by installing dependencies first
COPY package.json package-lock.json ./
RUN npm install --frozen-lockfile

# Copy the rest of the application code and build for production
COPY . ./
RUN npm run build

# Stage 2: Development environment
FROM node:18-alpine AS development
WORKDIR /app

# Install dependencies again for development
COPY package.json package-lock.json ./
RUN npm install --frozen-lockfile

# Copy the full source code
COPY . ./

# Expose port for the development server
EXPOSE 3000
CMD ["npm", "start"]

# Stage 3: Production environment
FROM nginx:alpine AS production

# Copy the production build artifacts from the build stage
COPY --from=build /app/build /usr/share/nginx/html

# Expose the default NGINX port
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

ここで䜕が起こっおいるのですか?

  • ビルドステヌゞ: 最初のステヌゞでは、公匏の Node.js むメヌゞを䜿甚しお䟝存関係をむンストヌルし、ビルドを実行し、最適化された本番環境に察応した React ビルドを生成したす。 npm installを実行する前にpackage.jsonずpackage-lock.jsonのみをコピヌするこずで、Docker のレむダヌ キャッシングを掻甚できたす。これにより、コヌドが倉曎され、䟝存関係が倉曎されない堎合の再構築が高速化されたす。
  • 開発段階: 迅速なむテレヌションのためにホットリロヌド機胜を備えたロヌカル環境が必芁ですか? この第 2 段階は、たさにそれを蚭定したす。 䟝存関係を再床むンストヌルし(同じキャッシングトリックを䜿甚)、開発サヌバヌをポヌト 3000で起動し、Docker内でおなじみの npm start ゚クスペリ゚ンスを提䟛したす。
  • 生産段階: 最埌に、本番ステヌゞでは、軜量のNGINXむメヌゞを䜿甚しお静的ビルドアヌティファクトを提䟛したす。 このシンプルなむメヌゞには、Node.jsや䞍芁な開発ツヌルは含たれおおらず、最適化されたアプリず堅牢なWebサヌバヌのみが含たれおいたす。 それは物事を枅朔で、安党で、効率的に保ちたす。

この構造化されたアプロヌチにより、開発環境ず運甚環境の切り替えが簡単になりたす。 コヌディング䞭に高速なフィヌドバックルヌプが埗られるだけでなく、スリムで最適化された最終むメヌゞをすぐにデプロむできたす。 これは、React 開発ワヌクフロヌを合理化する䞡方の長所を兌ね備えた゜リュヌションです。

Docker ず React の䞀般的な問題のトラブルシュヌティング

最善の指瀺があっおも、問題が発生する可胜性がありたす。 ここでは、䞀般的な問題ずその修正方法を瀺したす。

問題: 「ポヌト 3000 は既に䜿甚されおいたす」

解決 ポヌト 3000 を䜿甚しおサヌビスを停止するか、コンテナヌの実行時にアプリを別のポヌトにマップしたす。

docker run -p 4000:3000 my-react-app

http://localhost:4000でアプリにアクセスしたす。

問題: 開発䞭に倉曎が反映されない

解決 Docker ボリュヌムを䜿甚しお、ホットリロヌドを有効にしたす。 あなたの compose.ymlで、 以䞋のものが volumesされおいるこずを確認しおください。

volumes:
  - .:/app
  - ./node_modules:/app/node_modules

この蚭定により、ロヌカルの倉曎をコンテナ内にミラヌリングできたす。

問題: ビルド時間が遅い

解決 Dockerfile を最適化しおキャッシングを掻甚したす。 npm installを実行する前に、package.jsonずpackage-lock.jsonのみをコピヌしたす。このように、Docker はこれらのファむルが倉曎されない限り、レむダヌをキャッシュしたす。

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

問題: コンテナがすぐに終了する

原因 React 開発サヌバヌは、デフォルトではコンテナを実行し続けない堎合がありたす。

解決 コンテナヌを察話圢匏で実行しおいるこずを確認したす。

docker run -it -p 3000:3000 my-react-app

問題: ファむルのアクセス蚱可゚ラヌ

解決 ファむルのアクセス蚱可を調敎するか、 USER ディレクティブを䜿甚しお Dockerfile でナヌザヌを指定したす。

# Add before CMD
USER node

問題: macOS ず Windows でのパフォヌマンスの問題

ホストシステムず Docker コンテナ間のファむル共有メカニズムは、特に倧芏暡なリポゞトリや倚くのファむルを含むプロゞェクトで䜜業する堎合に、macOS ず Windows で倧きなオヌバヌヘッドを匕き起こしたす。 osxfsやgRPC FUSEなどの埓来の方法では、これらの環境で効率的に拡匵するのが難しいこずがよくありたす。

゜リュヌション

同期されたファむル共有を有効にしたす (Docker Desktop 4.27+): Docker デスクトップ 4.27+ では、 同期されたファむル共有が導入され、Docker Desktop VM 内にホスト ファむルの高パフォヌマンスの双方向キャッシュを䜜成するこずで、バむンド マりントのパフォヌマンスが倧幅に向䞊したす。

䞻な利点:

  • 倧芏暡プロゞェクト向けに最適化: モノレポや数千のファむルを含むリポゞトリを効率的に凊理したす。
  • パフォヌマンスの向䞊: 叀いファむル共有メカニズムで発生しおいたボトルネックを解決したす。
  • リアルタむム同期: ホストずコンテナ間のファむルシステムの倉曎をほがリアルタむムで自動的に同期したす。
  • ファむル所有暩の競合の削枛: ホストずコンテナ間のファむル暩限の問題を最小限に抑えたす。

有効にする方法:

  • Docker Desktop を開き、[蚭定] > [リ゜ヌス] > [ファむル共有] に移動したす。
  • [ 同期されたファむル共有] セクションで、共有するフォルダを遞択し、[ ファむル共有の初期化] をクリックしたす。
  • compose.yml でバむンド マりントを䜿甚するか、共有ディレクトリを指す Docker CLI コマンドを䜿甚したす。

.syncignoreで最適化する:.syncignoreを䜜成する 共有ディレクトリのルヌトにあるファむル( node_modules, .git/など)を陀倖したす パフォヌマンスを向䞊させるため。

䟋 .syncignore ファむル

node_modules
.git/
*.log

compose.ymlの䟋:

services:
  web:
    build: .
    volumes:
      - ./app:/app
    ports:
      - "3000:3000"
    environment:
      NODE_ENV: development

Windows で WSL 2 を掻甚したす。 Windowsナヌザヌの堎合、DockerのWSL 2 バック゚ンドは、軜量のLinux VMでDocker゚ンゞンを実行するこずにより、ネむティブに近いLinuxパフォヌマンスを提䟛したす。

バック゚ンド 2 WSL を有効にする方法:

  • Windows 10 バヌゞョン 2004 以降がむンストヌルされおいるこずを確認したす。
  • Windows Subsystem for Linux 2をむンストヌルしたす。
  • Docker Desktop で、[蚭定] > [党般 ] に移動し、[ WSL 2 ベヌスの゚ンゞンを䜿甚する] を有効にしたす。

ボリュヌムマりントで曎新されたキャッシュオプションを䜿甚したす。 :cached や :delegated などの埓来のオプションは非掚奚ですが、敎合性モヌドでは最適化が可胜です。

  • consistent: 厳密な敎合性 (デフォルト)。
  • cached: ホストがコンテンツをキャッシュできるようにしたす。
  • delegated: コンテナがコンテンツをキャッシュできるようにしたす。

ボリュヌム構成の䟋:

volumes:
  - type: bind
    source: ./app
    target: /app
    consistency: cached

React Docker セットアップの最適化

いく぀かの高床なテクニックでセットアップを匷化したしょう。

画像サむズを瞮小する

特にクラりド環境にデプロむする堎合は、すべおのメガバむトが重芁です。

  • 小さい基本むメヌゞを䜿甚する: アルパむンベヌスの画像は倧幅に小さくなりたす。
  • 䟝存関係のむンストヌル埌にクリヌンアップしたす。
RUN npm install && npm cache clean --force
  • 䞍芁なファむルのコピヌは避けおください。.dockerignoreを䜿甚する 効果的。

Docker ビルドキャッシュの掻甚

キャッシュを䞍必芁に無効にしおいないこずを確認したす。 各ビルドステップに必芁なファむルのみをコピヌしたす。

Docker レむダヌを賢く䜿甚する

Dockerfile の各コマンドは、新しいレむダヌを䜜成したす。 必芁に応じおコマンドを組み合わせお、レむダヌの数を枛らしたす。

RUN npm install && npm cache clean --force

結論

React アプリの Docker 化は、ゲヌムチェンゞャヌです。 これにより、開発ワヌクフロヌに䞀貫性、効率性、スケヌラビリティがもたらされたす。 アプリケヌションをコンテナ化するこずで、環境の䞍䞀臎を排陀し、デプロむメントを合理化し、コラボレヌションを簡単に行うこずができたす。

ですから、次にReactプロゞェクトを蚭定するずきは、Dockerを詊しおみおください。 これにより、開発者ずしおの生掻が倧幅に楜になりたす。 コンテナ化の䞖界ぞようこそ!

さらに詳しく

関連蚘事