Vite × Docker:本番運用を見据えたコンテナ化手順

現代のフロントエンド開発において、Vite は高速なビルドツールとして多くの開発者に愛用されています。しかし、開発環境で快適に動作するアプリケーションも、本番環境への展開時には様々な課題に直面することがあります。
Docker を活用したコンテナ化は、これらの課題を解決し、開発から本番運用まで一貫した環境を提供する強力な手段です。今回は、Vite プロジェクトを Docker でコンテナ化し、本番運用に耐えうる設定を構築する方法を段階的に解説いたします。
Vite プロジェクトのコンテナ化の背景
Vite は ESM(ES Modules)ベースの高速なビルドツールとして、Vue.js や React などのフレームワークと組み合わせて利用されています。開発時の HMR(Hot Module Replacement)や高速なコールドスタートが特徴ですが、本番環境では異なる要件が求められます。
以下の図は、Vite プロジェクトがコンテナ化によってどのような利益を得られるかを示しています。
mermaidflowchart TB
dev[開発環境] --> problem1[環境差異]
dev --> problem2[依存関係の管理]
dev --> problem3[デプロイメントの複雑さ]
problem1 --> docker[Docker コンテナ化]
problem2 --> docker
problem3 --> docker
docker --> solution1[環境の一貫性]
docker --> solution2[依存関係の封じ込め]
docker --> solution3[簡単なデプロイメント]
solution1 --> production[本番環境]
solution2 --> production
solution3 --> production
コンテナ化により、開発・ステージング・本番環境で同一の実行環境を保証できます。
コンテナ化のメリット
コンテナ化により得られる主要なメリットは以下の通りです。
メリット | 詳細 |
---|---|
1 | 環境の一貫性 - 開発環境と本番環境で同じコンテナイメージを使用 |
2 | 依存関係の管理 - Node.js バージョンやライブラリの固定 |
3 | スケーラビリティ - 水平スケーリングの容易さ |
4 | デプロイメント - CI/CD パイプラインとの親和性 |
5 | セキュリティ - アプリケーションの分離と制御 |
技術的背景
Vite の特徴を活かしつつ Docker 化を行うには、以下の技術的要素を理解する必要があります。
開発時は Vite Dev Server を使用してホットリロードを実現し、本番時は静的ファイルとして配信するという二つのモードがあることが重要です。これらのモードに応じて、適切な Docker 設定を構築する必要があります。
Docker 化における課題
Vite プロジェクトの Docker 化には、いくつかの特有の課題があります。これらの課題を事前に理解し、適切に対処することが成功の鍵となります。
開発環境と本番環境の違い
開発環境と本番環境では、Vite の動作モードが大きく異なります。
mermaidsequenceDiagram
participant Dev as 開発者
participant ViteDev as Vite Dev Server
participant ViteBuild as Vite Build
participant WebServer as Web Server
Note over Dev,ViteDev: 開発環境
Dev->>ViteDev: yarn dev
ViteDev->>Dev: HMR + ESM
Note over Dev,WebServer: 本番環境
Dev->>ViteBuild: yarn build
ViteBuild->>WebServer: 静的ファイル
WebServer->>Dev: 配信
開発環境では Vite Dev Server が動的にモジュールを変換・配信しますが、本番環境では事前にビルドした静的ファイルを配信します。
開発環境の特徴
開発環境では以下の点を考慮する必要があります。
dockerfile# 開発環境用の設定例
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN yarn install
COPY . .
EXPOSE 5173
CMD ["yarn", "dev", "--host", "0.0.0.0"]
この設定では、コンテナ内で Vite Dev Server を起動し、ホットリロード機能を有効にしています。--host 0.0.0.0
オプションにより、コンテナ外部からのアクセスを可能にしています。
本番環境の特徴
本番環境では、セキュリティとパフォーマンスを重視した設定が求められます。
dockerfile# 本番環境用の基本設定例
FROM nginx:alpine
COPY dist/ /usr/share/nginx/html/
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
静的ファイルを軽量な Web サーバーで配信することで、リソース使用量を最小限に抑えます。
ビルド最適化の必要性
Vite プロジェクトの Docker 化では、ビルド時間とイメージサイズの最適化が重要な課題となります。
以下の図は、最適化前後でのビルドプロセスの違いを示しています。
mermaidflowchart LR
subgraph "最適化前"
source1[ソースコード] --> install1[yarn install]
install1 --> build1[yarn build]
build1 --> image1[大きなイメージ]
end
subgraph "最適化後"
source2[ソースコード] --> cache[キャッシュ活用]
cache --> install2[効率的なインストール]
install2 --> build2[マルチステージビルド]
build2 --> image2[軽量イメージ]
end
マルチステージビルドとキャッシュ戦略により、ビルド時間の短縮とイメージサイズの削減を実現できます。
ビルド時間の課題
大規模な Vite プロジェクトでは、Docker イメージのビルド時間が課題となることがあります。
dockerfile# 非効率なビルド例
FROM node:18-alpine
WORKDIR /app
COPY . . # 全ファイルをコピー
RUN yarn install # 毎回全依存関係をインストール
RUN yarn build # ビルド実行
この方法では、ソースコードが変更されるたびに依存関係のインストールからやり直しになってしまいます。
イメージサイズの問題
本番環境では、セキュリティとパフォーマンスの観点から、イメージサイズの最小化が重要です。
改善前 | 改善後 | 削減率 |
---|---|---|
1.2GB | 50MB | 96% |
node:18 ベース | nginx | - |
開発用依存関係含む | 静的ファイルのみ | - |
適切な最適化により、大幅なサイズ削減が可能です。
セキュリティ考慮事項
本番運用では、セキュリティ面での配慮が欠かせません。Vite プロジェクトの Docker 化においても、複数のセキュリティ課題があります。
コンテナイメージのセキュリティ
ベースイメージの選択は、セキュリティに大きな影響を与えます。
dockerfile# セキュリティを考慮したベースイメージ選択
FROM node:18-alpine AS builder # Alpine ベースで脆弱性を最小化
# 非 root ユーザーでの実行
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs
Alpine Linux ベースのイメージは、一般的な Linux ディストリビューションと比較して攻撃対象面が小さく、セキュリティリスクを軽減できます。
実行時セキュリティ
アプリケーションの実行時にも、適切なセキュリティ設定が必要です。
dockerfile# セキュリティ強化の設定例
FROM nginx:alpine
# 不要なパッケージの削除
RUN apk del --purge
# 最小権限での実行
RUN adduser -D -s /bin/sh www-data
USER www-data
# ファイル権限の適切な設定
COPY --chown=www-data:www-data dist/ /usr/share/nginx/html/
最小権限の原則に従い、アプリケーションに必要最小限の権限のみを付与します。
環境変数とシークレット管理
機密情報の管理は、セキュリティの重要な要素です。
dockerfile# 環境変数の適切な管理
ENV NODE_ENV=production
ENV VITE_API_URL=https://api.example.com
# シークレットは実行時に注入
# ARG で機密情報を直接記述しない
Docker イメージに機密情報を埋め込まず、実行時に外部から注入する仕組みを構築することが重要です。
基本的な Docker 化手順
Vite プロジェクトの基本的な Docker 化手順を、段階的に説明いたします。まずは開発環境から始めて、徐々に本番環境に対応した設定を構築していきます。
開発用 Dockerfile の作成
開発環境用の Dockerfile は、開発者の利便性を重視した設定にします。
dockerfile# 開発環境用 Dockerfile
FROM node:18-alpine
# 作業ディレクトリの設定
WORKDIR /app
# パッケージファイルのコピー(依存関係のキャッシュ効率化)
COPY package.json yarn.lock ./
まず、基本的な環境設定を行います。Node.js の LTS バージョンを使用し、Alpine ベースで軽量化を図ります。
dockerfile# 依存関係のインストール
RUN yarn install --frozen-lockfile
# ソースコードのコピー
COPY . .
# ポートの公開
EXPOSE 5173
依存関係のインストールでは、--frozen-lockfile
オプションを使用して、lock ファイルと整合性を保ちます。
dockerfile# 開発サーバーの起動
CMD ["yarn", "dev", "--host", "0.0.0.0", "--port", "5173"]
開発サーバーは、コンテナ外部からアクセスできるよう --host 0.0.0.0
を指定します。
ホットリロードの設定
Vite のホットリロード機能をコンテナ環境で正常に動作させるには、追加の設定が必要です。
javascript// vite.config.ts
export default defineConfig({
server: {
host: true,
port: 5173,
watch: {
usePolling: true,
},
},
});
usePolling: true
により、Docker 環境でのファイル変更検知を確実に行います。
docker-compose.yml の設定
開発環境では、docker-compose を使用して複数のサービスを管理します。
yaml# docker-compose.yml(開発環境用)
version: '3.8'
services:
vite-app:
build:
context: .
dockerfile: Dockerfile.dev
ports:
- '5173:5173'
volumes:
- .:/app
- /app/node_modules
ボリュームマウントにより、ソースコードの変更が即座にコンテナに反映されます。
yamlenvironment:
- NODE_ENV=development
- VITE_API_URL=http://localhost:3001
depends_on:
- api-server
環境変数の設定と、依存サービスの定義を行います。
yamlapi-server:
image: node:18-alpine
working_dir: /app
command: yarn start
ports:
- '3001:3001'
volumes:
- ./api:/app
API サーバーなど、関連するサービスも同時に起動できるよう設定します。
開発効率の向上
開発効率を向上させるため、以下の追加設定を行います。
yaml networks:
- vite-network
stdin_open: true
tty: true
networks:
vite-network:
driver: bridge
ネットワークの設定により、サービス間の通信を効率化し、デバッグ時の利便性を向上させます。
環境変数の管理
環境変数の適切な管理は、柔軟性とセキュリティの両立に重要です。
dockerfile# Dockerfile での環境変数設定
ENV NODE_ENV=development
ENV VITE_APP_VERSION=1.0.0
# ビルド時変数(機密情報は含めない)
ARG BUILD_VERSION
ENV VITE_BUILD_VERSION=$BUILD_VERSION
機密情報以外の基本的な環境変数は、Dockerfile で設定します。
.env ファイルの活用
開発環境では、.env ファイルを活用して環境変数を管理します。
bash# .env.development
VITE_API_URL=http://localhost:3001
VITE_APP_TITLE=Vite App (Development)
VITE_DEBUG_MODE=true
Vite は、環境に応じて適切な .env ファイルを自動的に読み込みます。
yaml# docker-compose.yml での .env ファイル使用
services:
vite-app:
env_file:
- .env.development
environment:
- NODE_ENV=development
docker-compose では、env_file ディレクティブを使用して .env ファイルを読み込めます。
本番環境での環境変数
本番環境では、より厳密な環境変数管理が必要です。
dockerfile# 本番環境用の環境変数設定
ENV NODE_ENV=production
ENV VITE_API_URL=${VITE_API_URL}
ENV VITE_APP_VERSION=${APP_VERSION}
# ヘルスチェック用のエンドポイント
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1
環境変数は実行時に外部から注入し、ヘルスチェック機能も追加します。
図で理解できる要点:
- Docker 化により環境の一貫性が保たれる
- 開発環境ではホットリロードと利便性を重視
- 環境変数は段階的に管理レベルを上げる
本番運用を見据えた最適化
本番環境では、パフォーマンス、セキュリティ、保守性を重視した最適化が必要です。マルチステージビルドや軽量イメージの採用により、本格的な運用に対応できる Docker 環境を構築していきます。
マルチステージビルドの実装
マルチステージビルドは、ビルド環境と実行環境を分離し、最終的なイメージサイズを大幅に削減する手法です。
以下の図は、マルチステージビルドの構造を示しています。
mermaidflowchart TD
subgraph stage1 ["Stage 1: Builder"]
source[ソースコード] --> deps[依存関係インストール]
deps --> build[ビルド実行]
build --> artifacts[静的ファイル生成]
end
subgraph stage2 ["Stage 2: Runtime"]
artifacts --> copy[成果物コピー]
copy --> server[Web サーバー]
server --> final[最終イメージ]
end
style stage1 fill:#f9f9f9
style stage2 fill:#e8f5e8
ビルドステージで生成された静的ファイルのみを実行ステージにコピーし、軽量な実行環境を構築します。
ビルドステージの実装
最初のステージでは、Vite プロジェクトのビルドを行います。
dockerfile# マルチステージビルド:ビルドステージ
FROM node:18-alpine AS builder
WORKDIR /app
# パッケージファイルのコピー
COPY package.json yarn.lock ./
ビルド環境には、フル機能の Node.js イメージを使用します。
dockerfile# 依存関係のインストール(本番用のみ)
RUN yarn install --frozen-lockfile --production=false
# ソースコードのコピー
COPY . .
# ビルドの実行
RUN yarn build
開発用依存関係も含めてインストールし、ビルドプロセスを実行します。
dockerfile# 不要なファイルの削除(オプション)
RUN rm -rf node_modules
RUN yarn install --frozen-lockfile --production=true
ビルド完了後、不要なファイルを削除してイメージサイズを最適化します。
実行ステージの実装
第二ステージでは、軽量な Web サーバーで静的ファイルを配信します。
dockerfile# マルチステージビルド:実行ステージ
FROM nginx:alpine AS runtime
# Nginx の設定ファイルをコピー
COPY nginx.conf /etc/nginx/nginx.conf
軽量な Alpine ベースの Nginx イメージを使用します。
dockerfile# ビルドステージから静的ファイルをコピー
COPY --from=builder /app/dist /usr/share/nginx/html
# ポートの公開
EXPOSE 80
# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost/ || exit 1
ビルドステージで生成された静的ファイルのみをコピーし、ヘルスチェック機能を追加します。
Nginx 設定の最適化
効率的な静的ファイル配信のため、Nginx の設定を最適化します。
nginx# nginx.conf
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# gzip 圧縮の有効化
gzip on;
gzip_vary on;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/xml+rss
application/json;
}
gzip 圧縮により、転送サイズを大幅に削減できます。
軽量イメージの採用
本番環境では、可能な限り軽量なベースイメージを選択することが重要です。
イメージタイプ | サイズ | 特徴 | 用途 |
---|---|---|---|
node:18 | 900MB+ | 完全な Ubuntu 環境 | 開発・ビルド |
node:18-slim | 200MB+ | 最小限の Ubuntu | ビルド |
node:18-alpine | 100MB+ | Alpine Linux | ビルド・軽量実行 |
nginx | 20MB+ | Alpine + Nginx | 静的ファイル配信 |
scratch | <10MB | 空のイメージ | 超軽量実行 |
Alpine Linux の利点
Alpine Linux ベースのイメージは、以下の利点があります。
dockerfile# Alpine ベースイメージの活用例
FROM nginx:alpine
# 必要最小限のパッケージのみインストール
RUN apk add --no-cache curl
# セキュリティアップデートの適用
RUN apk upgrade
Alpine Linux は、セキュリティを重視した軽量ディストリビューションです。
Distroless イメージの検討
さらなる軽量化が必要な場合は、Distroless イメージの使用も検討できます。
dockerfile# Distroless イメージの使用例(高度な最適化)
FROM gcr.io/distroless/static-debian11
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
ただし、Distroless イメージはデバッグが困難になるため、運用チームのスキルレベルを考慮して採用を検討してください。
セキュリティ強化設定
本番環境では、多層防御の考え方に基づいたセキュリティ設定が必要です。
非 root ユーザーでの実行
アプリケーションを非 root ユーザーで実行することで、セキュリティリスクを軽減します。
dockerfile# 非 root ユーザーの作成と設定
FROM nginx:alpine
# 専用ユーザーの作成
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001 -G appgroup
# ファイル所有権の変更
COPY --chown=appuser:appgroup --from=builder /app/dist /usr/share/nginx/html
# 非 root ユーザーでの実行
USER appuser
専用ユーザーでアプリケーションを実行することで、潜在的な攻撃の影響を限定します。
セキュリティヘッダーの設定
Web アプリケーションのセキュリティを強化するため、適切な HTTP ヘッダーを設定します。
nginx# セキュリティヘッダーの設定
server {
listen 80;
# セキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# HTTPS 強制(プロキシ背後の場合)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
これらのヘッダーにより、XSS 攻撃やクリックジャッキングなどの脅威から保護します。
脆弱性スキャンの実装
コンテナイメージの脆弱性を定期的にチェックする仕組みを構築します。
dockerfile# マルチステージビルドでの脆弱性対策
FROM node:18-alpine AS scanner
# 脆弱性スキャンツールのインストール
RUN npm install -g audit-ci
# 依存関係の脆弱性チェック
COPY package.json yarn.lock ./
RUN yarn audit --audit-level moderate
CI/CD パイプラインでの自動脆弱性チェックにより、セキュリティリスクを早期発見できます。
図で理解できる要点:
- マルチステージビルドでイメージサイズを 90%以上削減
- Alpine Linux により攻撃対象面を最小化
- 非 root ユーザー実行で権限を制限
具体的な実装例
実際のプロジェクトで使用できる、完全な Docker 設定を段階的に構築していきます。リアルなシナリオに基づいた設定ファイルと、CI/CD パイプラインとの連携方法を詳しく解説いたします。
プロジェクト構成
以下は、本番運用を想定した Vite プロジェクトのディレクトリ構成です。
csharpmy-vite-app/
├── src/ # ソースコード
│ ├── components/
│ ├── pages/
│ └── main.ts
├── public/ # 静的ファイル
├── docker/ # Docker 関連ファイル
│ ├── Dockerfile.dev # 開発環境用
│ ├── Dockerfile.prod # 本番環境用
│ └── nginx.conf # Nginx 設定
├── .dockerignore # Docker 除外ファイル
├── docker-compose.yml # 開発環境用
├── docker-compose.prod.yml # 本番環境用
├── package.json
├── vite.config.ts
└── .env.example
この構成により、環境ごとの設定を適切に分離し、保守性を向上させます。
以下の図は、各環境でのコンテナ構成を示しています。
mermaidflowchart TB
subgraph "開発環境"
dev_browser[ブラウザ] --> dev_vite[Vite Dev Server]
dev_vite --> dev_api[API Server]
dev_vite --> dev_db[(Database)]
end
subgraph "本番環境"
prod_lb[Load Balancer] --> prod_nginx[Nginx Container]
prod_nginx --> prod_api[API Container]
prod_api --> prod_db[(Production DB)]
end
style dev_vite fill:#e1f5fe
style prod_nginx fill:#f3e5f5
開発環境では利便性を、本番環境では可用性とパフォーマンスを重視した構成になっています。
設定ファイルの詳細
開発環境用 Dockerfile
開発効率を最大化する設定です。
dockerfile# docker/Dockerfile.dev
FROM node:18-alpine
# 開発用パッケージのインストール
RUN apk add --no-cache git
WORKDIR /app
# パッケージファイルのコピー(キャッシュ効率化)
COPY package.json yarn.lock ./
開発に必要な基本ツールをインストールし、効率的なキャッシュ戦略を実装します。
dockerfile# 依存関係のインストール
RUN yarn install --frozen-lockfile
# ソースコードのコピー
COPY . .
# Vite 設定での開発用最適化
ENV NODE_ENV=development
ENV VITE_HMR_PORT=5173
EXPOSE 5173
# 開発サーバーの起動
CMD ["yarn", "dev", "--host", "0.0.0.0"]
ホットリロード機能を含む、開発に最適化された環境を構築します。
本番環境用 Dockerfile
パフォーマンスとセキュリティを重視した設定です。
dockerfile# docker/Dockerfile.prod
# ビルドステージ
FROM node:18-alpine AS builder
WORKDIR /app
# パッケージファイルのコピー
COPY package.json yarn.lock ./
# 本番用依存関係のインストール
RUN yarn install --frozen-lockfile --production=false
まず、ビルドに必要な全ての依存関係をインストールします。
dockerfile# ソースコードのコピーとビルド
COPY . .
RUN yarn build
# 本番用依存関係のみ再インストール
RUN rm -rf node_modules
RUN yarn install --frozen-lockfile --production=true
ビルド完了後、本番環境に不要な開発用依存関係を除去します。
dockerfile# 実行ステージ
FROM nginx:alpine AS runtime
# セキュリティ強化
RUN addgroup -g 1001 -S appgroup && \
adduser -S appuser -u 1001 -G appgroup
# Nginx 設定のコピー
COPY docker/nginx.conf /etc/nginx/nginx.conf
# 静的ファイルのコピー
COPY --from=builder --chown=appuser:appgroup /app/dist /usr/share/nginx/html
# ヘルスチェックの設定
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:80/ || exit 1
EXPOSE 80
# 非 root ユーザーで実行
USER appuser
CMD ["nginx", "-g", "daemon off;"]
軽量で安全な実行環境を構築し、適切なヘルスチェック機能を実装します。
Nginx 設定の詳細
本番環境用の最適化された Nginx 設定です。
nginx# docker/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# ログ形式の設定
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
基本的なログ設定とワーカープロセスの最適化を行います。
nginx # パフォーマンス最適化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# gzip 圧縮の設定
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/xml+rss
application/json
image/svg+xml;
静的ファイル配信のパフォーマンスを最大化する設定を追加します。
nginx server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
# セキュリティヘッダー
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# SPA 用のフォールバック設定
location / {
try_files $uri $uri/ /index.html;
}
# 静的ファイルのキャッシュ設定
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# ヘルスチェック用エンドポイント
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
}
SPA ルーティング対応、キャッシュ最適化、ヘルスチェックエンドポイントを設定します。
Docker Compose 設定
開発環境用の docker-compose.yml です。
yaml# docker-compose.yml
version: '3.8'
services:
vite-dev:
build:
context: .
dockerfile: docker/Dockerfile.dev
ports:
- '5173:5173'
volumes:
- .:/app
- /app/node_modules
environment:
- NODE_ENV=development
- VITE_API_URL=http://localhost:3001
networks:
- app-network
stdin_open: true
tty: true
開発時の利便性を重視し、ホットリロードとデバッグ機能を有効にします。
yaml api-server:
image: node:18-alpine
working_dir: /app/api
command: yarn start
ports:
- "3001:3001"
volumes:
- ./api:/app/api
environment:
- NODE_ENV=development
networks:
- app-network
networks:
app-network:
driver: bridge
API サーバーも含む、完全な開発環境を構築します。
CI/CD パイプラインとの連携
GitHub Actions を使用した CI/CD パイプラインの設定例です。
yaml# .github/workflows/deploy.yml
name: Build and Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'yarn'
基本的な CI 環境のセットアップを行います。
yaml- name: Install dependencies
run: yarn install --frozen-lockfile
- name: Run tests
run: yarn test
- name: Run lint
run: yarn lint
- name: Build application
run: yarn build
テスト、リント、ビルドを実行して、コードの品質を確保します。
yamlsecurity-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run security audit
run: yarn audit --audit-level moderate
- name: Build Docker image for scanning
run: docker build -f docker/Dockerfile.prod -t security-scan .
- name: Run container security scan
uses: aquasecurity/trivy-action@master
with:
image-ref: 'security-scan'
format: 'sarif'
output: 'trivy-results.sarif'
セキュリティ監査とコンテナスキャンにより、脆弱性を早期発見します。
yamlbuild-and-push:
needs: [test, security-scan]
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Log in to Container Registry
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v3
with:
context: .
file: docker/Dockerfile.prod
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
テストとセキュリティチェックが成功した場合のみ、本番用イメージをビルドしてレジストリにプッシュします。
図で理解できる要点:
- 環境ごとに最適化された Docker 設定
- マルチステージビルドによる効率的なイメージ作成
- CI/CD パイプラインでの自動品質チェック
まとめ
Vite プロジェクトの Docker 化は、現代のフロントエンド開発において必須のスキルとなっています。本記事では、基本的な開発環境の構築から、本番運用に耐えうる最適化まで、段階的に解説いたします。
重要なポイントの振り返り
Docker 化において最も重要なのは、環境ごとの要件を正確に理解することです。開発環境では開発者の生産性を最大化し、本番環境ではパフォーマンスとセキュリティを重視する必要があります。
項目 | 開発環境 | 本番環境 |
---|---|---|
優先事項 | 開発効率・デバッグの容易さ | パフォーマンス・セキュリティ |
イメージサイズ | 大きくても可 | 最小限に最適化 |
ビルド時間 | 短縮よりも機能性重視 | CI/CD での高速化必須 |
セキュリティ | 基本的な対策 | 多層防御の実装 |
マルチステージビルドの活用により、開発時の利便性と本番時の効率性を両立できます。ビルドステージで必要な全ての処理を行い、実行ステージでは最小限のファイルのみを配置することで、イメージサイズを 90%以上削減することが可能です。
セキュリティとパフォーマンスのバランス
本番運用では、以下のセキュリティ対策が不可欠です。
dockerfile# セキュリティベストプラクティスの要約
FROM nginx:alpine
RUN adduser -D -s /bin/sh appuser
USER appuser
COPY --chown=appuser:appuser dist/ /usr/share/nginx/html/
HEALTHCHECK CMD wget --spider http://localhost/ || exit 1
非 root ユーザーでの実行、適切なファイル権限の設定、ヘルスチェック機能の実装により、堅牢なセキュリティ基盤を構築できます。
継続的な改善の重要性
Docker 化は一度設定すれば終わりではありません。以下の点を継続的に見直していくことが重要です。
- 依存関係の更新 - セキュリティパッチの適用
- パフォーマンスモニタリング - レスポンス時間とリソース使用量の監視
- セキュリティスキャン - 定期的な脆弱性チェック
- 設定の最適化 - 新しいベストプラクティスの採用
運用チームとの連携
技術的な実装だけでなく、運用チームとの密な連携も成功の鍵となります。適切なログ設定、監視ツールとの連携、障害時の対応手順の整備により、安定した本番運用を実現できます。
Vite と Docker の組み合わせは、モダンなフロントエンド開発において強力な基盤となります。本記事で紹介した手法を参考に、プロジェクトの要件に応じてカスタマイズし、継続的な改善を行っていってください。
適切に設計された Docker 環境は、開発チームの生産性向上と、本番環境の安定性確保の両方を実現する投資となるでしょう。
関連リンク
- article
Vite × Docker:本番運用を見据えたコンテナ化手順
- article
Vite を活用した開発組織の DX(開発体験)向上事例
- article
Vitest と Vite で爆速フロントエンド開発ワークフロー
- article
Vite プロジェクトのディレクトリ設計ベストプラクティス
- article
Vite のプラグイン開発:自作プラグインの作り方
- article
Vite と GraphQL の連携方法
- article
Docker でマイクロサービスを構築するアーキテクチャ入門
- article
Vite × Docker:本番運用を見据えたコンテナ化手順
- article
【解説】Docker Hub とプライベートレジストリの違いと使い分け
- article
Docker で GPU を活用する:機械学習環境を構築するための手順
- article
Docker Compose と Makefile を組み合わせて開発効率を最大化する方法
- article
【保存版】Dockerfile のベストプラクティス 10 選:効率的な記述方法まとめ
- article
WordPress のインストール完全手順:レンタルサーバー・Docker・ローカルを徹底比較
- article
gpt-oss で始めるローカル環境 AI 開発入門
- article
GPT-5 で変わる自然言語処理:文章生成・要約・翻訳の精度検証
- article
WebSocket と HTTP/2・HTTP/3 の違いを徹底比較
- article
Emotion で SVG アイコンや画像にスタイルを適用する
- article
WebRTC でビデオチャットアプリを作る手順【初心者向け】
- blog
iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来