Docker環境でのNginx設定

Dockerコンテナ内でNginxを実行・設定する方法を解説。カスタム設定ファイル、SSL証明書、マルチステージビルド、Docker Composeの例を含みます。

Setup

詳細な説明

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をエントリポイントとして別々のコンテナで動作する複数のバックエンドサービスにトラフィックをルーティングします。

Try It — Nginx Config Generator

フルツールを開く