Docker環境でのNginx設定
Dockerコンテナ内でNginxを実行・設定する方法を解説。カスタム設定ファイル、SSL証明書、マルチステージビルド、Docker Composeの例を含みます。
詳細な説明
NginxをDockerで実行することで、環境間での一貫したデプロイ、容易な水平スケーリング、プロセスの分離が実現します。静的ファイルの配信やリバースプロキシとして使用する場合でも、コンテナ化されたNginxはインフラ管理を大幅に簡素化します。
基本的なDockerfile
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY html/ /usr/share/nginx/html/
EXPOSE 80
nginx:alpine イメージは約40MBと軽量で、イメージサイズがデプロイ速度やストレージコストに影響する本番コンテナに最適です。
Docker Compose設定
version: "3.8"
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./ssl:/etc/nginx/ssl:ro
- ./html:/usr/share/nginx/html:ro
depends_on:
- app
app:
build: .
expose:
- "3000"
他のコンテナへのプロキシ
Docker Composeでは、同じネットワーク上のコンテナはサービス名をホスト名として通信できます。proxy_pass ディレクティブでサービス名を直接参照します:
upstream app {
server app:3000;
}
Dockerの内部DNSリゾルバがサービス名の解決を自動的に処理し、appサービスをスケールすると実行中のすべてのインスタンスに接続を分散します。
DockerでのSSL
セキュリティのためSSL証明書は読み取り専用ボリュームとしてマウントします。Let's Encrypt証明書の自動管理には、コンパニオン certbot コンテナを使用します:
certbot:
image: certbot/certbot
volumes:
- ./ssl:/etc/letsencrypt
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h; done'"
SPA向けマルチステージビルド
フロントエンドアプリケーションをビルドし、コンパイル済みの出力をNginxで配信するマルチステージDockerfileで、最終イメージサイズを最小化します:
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
ヘルスチェック
Dockerヘルスチェックディレクティブを追加して、コンテナオーケストレータがNginxの可用性を監視し、異常なコンテナを自動的に再起動できるようにします:
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost/ || exit 1
Dockerでのログ
公式NginxDockerイメージは、アクセスログとエラーログをそれぞれ /dev/stdout と /dev/stderr にシンボリックリンクしており、Dockerのロギングドライバとシームレスに統合されます。
ユースケース
Docker Composeでアプリケーションスタックをコンテナ化し、Nginxをエントリポイントとして別々のコンテナで動作する複数のバックエンドサービスにトラフィックをルーティングします。