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証明書、適切なリソース制限とともにデプロイする場合に使用します。