-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 8080containerの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:800.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アプリケーションをデプロイする際、開発とテストのためにホストネットワークからアクセス可能にする必要がある場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く