-pフラグによるDocker Portマッピング
Dockerの-pフラグを使用してcontainerのportをホストに公開する方法を学びます。portマッピングの構文、特定インターフェースへのバインド、Webサービスでの一般的なport設定について解説します。
Networking
詳細な説明
Container Portの公開
デフォルトでは、containerのportはホストマシンや外部ネットワークからアクセスできません。-p(または--publish)フラグは、containerのportをホストのportにマッピングし、サービスに到達可能にします:
docker run -d -p 8080:80 nginx
これによりホストのport 8080がcontainerのport 80にマッピングされます。ホストでhttp://localhost:8080にアクセスすると、container内のNginxサーバーに到達します。
Portマッピングの構文
-pフラグはいくつかのフォーマットをサポートしています:
| フォーマット | 意味 |
|---|---|
-p 8080:80 |
ホスト8080をcontainer 80にマッピング(全インターフェース) |
-p 127.0.0.1:8080:80 |
localhostのみにマッピング(外部アクセス不可) |
-p 8080:80/udp |
UDP portをマッピング(デフォルトはTCP) |
-p 8080:80/tcp -p 8080:80/udp |
TCPとUDPの両方をマッピング |
-p 80 |
containerのport 80をランダムなホストportにマッピング |
特定インターフェースへのバインド
デフォルトでは、-p 8080:80は0.0.0.0(すべてのネットワークインターフェース)にバインドし、ホストに到達可能なすべてのIPアドレスからportにアクセスできます。セキュリティのため、バインドを制限できます:
# ホスト自身からのみアクセス可能
docker run -d -p 127.0.0.1:8080:80 nginx
# 特定のネットワークインターフェースからのみアクセス可能
docker run -d -p 192.168.1.100:8080:80 nginx
複数のPortマッピング
多くのアプリケーションは複数のportが必要です。-pを複数回指定します:
# HTTPとHTTPSのWebサーバー
docker run -d -p 80:80 -p 443:443 nginx
# Web UIとAPIを持つアプリケーション
docker run -d -p 3000:3000 -p 9090:9090 my-app
動的Port割り当て
ホストportを省略すると、Dockerが利用可能なportを自動的に選択します:
docker run -d -p 80 nginx
docker port <container>で割り当てられたportを確認できます:
docker port my-nginx
# 80/tcp -> 0.0.0.0:49153
一般的なPortマッピング
| サービス | 一般的なマッピング |
|---|---|
| Nginx/Apache | -p 80:80 -p 443:443 |
| Node.jsアプリ | -p 3000:3000 |
| PostgreSQL | -p 5432:5432 |
| Redis | -p 6379:6379 |
| MySQL | -p 3306:3306 |
セキュリティに関する考慮事項
- 本番環境ではデータベースのportを
0.0.0.0にマッピングしないでください。代わりにDockerネットワークを使用してください。 - アプリケーションcontainerを直接公開するのではなく、リバースプロキシ(Nginx、Traefik)を前段に配置してください。
- Dockerがiptablesを直接変更するため、ホストのファイアウォールルールがDockerマッピングされたportに常に適用されるとは限りません。
ユースケース
Nginxがport 80で静的ファイルを配信し、Node.js APIがport 3000でリッスンするWebアプリケーションをデプロイする際、開発とテストのためにホストネットワークからアクセス可能にする必要がある場合に使用します。