DockerでNginxを実行する

適切なportマッピング、設定のマウント、SSLセットアップを備えたNginx WebサーバーをDockerで実行する方法を学びます。リバースプロキシ設定と静的ファイル配信パターンについて解説します。

Real-World Stacks

詳細な説明

本番対応のDocker Nginx

NginxはDockerで最もよくコンテナ化されるサービスの1つです。portマッピング付きの基本的なNginx containerは1コマンドで起動できます:

docker run -d --name nginx -p 80:80 nginx:alpine

これによりデフォルトのNginxウェルカムページが配信されます。本番設定に向けて構築していきましょう。

静的ファイルの配信

静的Webサイトファイルをcontainerにマウントします:

docker run -d \
  --name webserver \
  -p 80:80 \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:alpine

:roフラグによりマウントが読み取り専用になり、containerがファイルを変更することを防ぎます。

カスタムNginx設定

カスタムnginx.confをマウントしてデフォルト設定を上書きします:

docker run -d \
  --name webserver \
  -p 80:80 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:alpine

または追加のserverブロック設定をマウントします:

docker run -d \
  --name webserver \
  -p 80:80 -p 443:443 \
  -v $(pwd)/conf.d:/etc/nginx/conf.d:ro \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:alpine

リバースプロキシ設定

一般的なパターンは、アプリケーションcontainerの前段でNginxをリバースプロキシとして使用することです:

docker network create web-tier

docker run -d --name api --network web-tier my-api-image
docker run -d --name nginx \
  --network web-tier \
  -p 80:80 \
  -v $(pwd)/proxy.conf:/etc/nginx/conf.d/default.conf:ro \
  nginx:alpine

proxy.confの内容:

server {
    listen 80;
    location / {
        proxy_pass http://api:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

SSL/TLSターミネーション

docker run -d \
  --name nginx \
  -p 80:80 -p 443:443 \
  -v $(pwd)/certs:/etc/nginx/certs:ro \
  -v $(pwd)/conf.d:/etc/nginx/conf.d:ro \
  nginx:alpine

本番環境のDocker Runコマンド

docker run -d \
  --name nginx \
  --restart unless-stopped \
  --memory 256m \
  --cpus 1 \
  -p 80:80 \
  -p 443:443 \
  -v nginx-logs:/var/log/nginx \
  -v $(pwd)/conf.d:/etc/nginx/conf.d:ro \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  -v $(pwd)/certs:/etc/nginx/certs:ro \
  nginx:alpine

これにはリスタートポリシー、リソース制限、ログの永続化、読み取り専用の設定マウント、HTTPとHTTPSの両方のportが含まれます。

なぜnginx:alpineなのか?

AlpineベースのimageはDebian版(約140 MB)よりも大幅に小さく(約40 MB)、pull時間と攻撃対象面を削減します。追加のシステムパッケージが必要な場合は、Debianベースのnginx:latestを使用してください。

ユースケース

静的ファイルを配信しバックエンドAPIのリバースプロキシとして機能する本番Webサーバーを、カスタム設定、SSL証明書、適切なリソース制限とともにデプロイする場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く