VPSを借りて複数のWebアプリを運用する際、「ポート番号の管理が面倒」「セキュリティ設定が複雑」といった悩みに直面したことはありませんか?
本記事では、Dockerの仮想ネットワークとNginxのリバースプロキシを組み合わせ、ホスト側のポートを汚さずに複数のアプリをエレガントに管理する運用手法を解説します。

ポート番号を忘れてOK: Docker内部ネットワークを使うため、ホスト側のポート競合は起きません。
セキュア: 全ての通信がNginxを通るため、アクセス制限やSSL化を一元管理できます。
拡張性: アプリを追加する際は、docker-compose.yml にサービスを1つ増やし、Nginxの設定に1行追加するだけで済みます。
1. 従来の運用の課題
通常、複数のアプリを動かす際、以下のような構成になりがちです。
- アプリA → ホストの3001番ポート
- アプリB → ホストの3002番ポート
これでは、アプリが増えるたびにファイアウォールの設定変更が必要になり、ポート番号の競合にも気を使わなければなりません。また、外部から直接ポート3001にアクセスできてしまうため、セキュリティリスクも高まります。
2. 推奨アーキテクチャ:Nginxリバースプロキシ + Docker内部通信
この課題を解決するのが、Nginxを「門番」として配置し、アプリ同士はDocker内部ネットワークでのみ通信する構成です。
この構成のポイント
- 外部窓口は80/443のみ: ホスト側のポート(3001, 3002等)は一切公開しません。
- Docker内部ネットワーク: Docker Composeが作成する仮想ネットワーク内で、各コンテナは「サービス名(例:
autotranscripter)」だけで通信できます。 - パスベースルーティング:
my-domain.com/AppA,my-domain.com/AppBのように、URLパスでアプリを振り分けます。
3. 実践:docker-compose.yml の構成例
ホスト側のポートマッピングを排除し、Dockerの内部ネットワーク機能を活用した docker-compose.yml の例です。
YAML
services:
# アプリケーションコンテナ(外部公開ポートなし)
autotranscripter:
build: ./apps/autotranscripter
expose:
- "3000" # Dockerネットワーク内での待ち受けポート
# Nginxコンテナ(唯一の入り口)
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- autotranscripter
4. Nginx設定のコツ
Nginx側の設定では、IPアドレスではなくDockerの「サービス名」を指定するのが肝です。
Nginx
location /AutoTranscription/ {
# サービス名で指定。ポートはコンテナ内のポート番号
proxy_pass http://autotranscripter:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
注意点:アプリ側の「ベースパス」
サブパス運用(/AutoTranscription/)をする際、アプリがルート(/)で動作することを前提としていると、CSSやJSの読み込みでエラーになることがあります。アプリ側で Public Path や Base URL の設定ができるか確認しましょう。もし設定が難しい場合は、autotranscripter.my-domain.com のような「サブドメイン運用」に切り替えるのが近道です。
まとめ
この運用手法の最大のメリットは、「管理の抽象化」です。
- ポート番号を忘れてOK: Docker内部ネットワークを使うため、ホスト側のポート競合は起きません。
- セキュア: 全ての通信がNginxを通るため、アクセス制限やSSL化を一元管理できます。
- 拡張性: アプリを追加する際は、
docker-compose.ymlにサービスを1つ増やし、Nginxの設定に1行追加するだけで済みます。
このアーキテクチャを導入することで、VPS上のWebアプリ運用がぐっと快適で安全なものになります。ぜひ次回のプロジェクトで試してみてください!


コメント