Skip to content
⚠️ This article was written in 2018. Some content may be outdated.

フロントエンドプロジェクトのDockerコンテナ化入門

最近いくつかのフロントエンドプロジェクトをコンテナ化しました。思ったより簡単でした。基本的な設定をまとめます。

フロントエンドにDockerが必要な理由

  • 開発・テスト・本番環境の統一(「自分のマシンでは動く」問題の解消)
  • CI/CDパイプラインのデプロイが簡単になる
  • 複数プロジェクトが共存しても互いに干渉しない

Dockerfile(基本版)

dockerfile
# マルチステージビルド:ビルドステージ
FROM node:10-alpine AS builder

WORKDIR /app

# package.jsonを先にコピーしてDockerレイヤーキャッシュを活用
# package.jsonが変わった場合のみnpm installを再実行
COPY package.json package-lock.json ./
RUN npm ci

# ソースコードをコピーしてビルド
COPY . .
RUN npm run build

# 本番ステージ:NginxとビルドされたファイルのみS
FROM nginx:alpine

# ビルド成果物をコピー
COPY --from=builder /app/dist /usr/share/nginx/html

# Nginx設定をコピー
COPY nginx.conf /etc/nginx/conf.d/default.conf

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

nginx.conf

nginx
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html;

    # SPAルーティングサポート(すべてのルートをindex.htmlに向ける)
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 静的リソースのキャッシュ
    location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # APIプロキシ(オプション)
    location /api {
        proxy_pass http://api-server:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

.dockerignore

node_modules
dist
.git
.env.local
*.log

よく使うコマンド

bash
# イメージをビルド
docker build -t my-frontend:latest .

# コンテナを実行(8080 → コンテナの80にマッピング)
docker run -d -p 8080:80 --name my-app my-frontend:latest

# 実行中のコンテナを確認
docker ps

# ログを確認
docker logs my-app

# 停止と削除
docker stop my-app && docker rm my-app

# コンテナに入ってデバッグ
docker exec -it my-app sh

docker-composeでマルチサービス管理

yaml
# docker-compose.yml
version: "3.8"

services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - api
    environment:
      - VUE_APP_API_URL=http://api:3000

  api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_URL=mongodb://db:27017/mydb
    depends_on:
      - db

  db:
    image: mongo:4
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:
bash
# すべてのサービスを起動
docker-compose up -d

# ログを確認
docker-compose logs -f frontend

# 停止
docker-compose down

ビルド時に環境変数を注入する

dockerfile
ARG VUE_APP_API_URL=https://api.example.com
ENV VUE_APP_API_URL=${VUE_APP_API_URL}

RUN npm run build
bash
# ビルド時に引数を渡す
docker build --build-arg VUE_APP_API_URL=https://api.staging.com -t my-app:staging .

まとめ

  • マルチステージビルド:Nodeイメージでビルド、Nginxイメージでサービング。最終イメージが小さくなる
  • .dockerignoreで不要なファイルを除外してビルドを高速化
  • NginxにSPAルーティングサポート(try_files)の設定が必要
  • docker-composeでマルチサービスの開発環境を管理

MIT Licensed