Docker ポートマッピング解説
Docker の -p/--publish 指定や Compose の ports: エントリをホストバインディングに展開し、両方の Compose 構文で表示し、ホストポートの競合を検出します。
入力と主要な処理をブラウザ内で行い、その入力内容をQuickKitサーバーへ送信しない設計です。
展開されたバインディング
| ホスト IP | ホストポート | コンテナポート | プロトコル |
|---|
—
Compose 短縮構文
Compose 長い構文
競合レポート
固定ホストポートのみを判定します。動的割り当てや範囲の枯渇は実行時の状態に依存します。
仕組みと使い方
Docker が -p/--publish と Compose の ports: 短縮構文で使う文法の主要部分 [[hostIp:]hostPort:]containerPort[/protocol] を解析し、範囲指定はペアで展開します。8000-9000:80 のようにホスト側だけ範囲の指定は1件のまま保持し、Compose の両構文でも範囲として出力します (長い構文では published: "8000-9000")。Docker が実行時にその範囲から空きポートを割り当てます。ホストポートは 0-65535 を受理し、ホストポート 0 は自動割り当てを要求します。コンテナ側の転送先は 1-65535 のみ受理します。go-connections/nat は転送先 0 を構文上受理しますが、現在の Moby daemon は validatePortBindings() で拒否します。0 から始まり終了値が非ゼロのホスト範囲は nat が受理しますが、Moby のアロケータは実行時に拒否します。ホスト IP は素の IPv4 / IPv6 リテラルである必要があり、fe80::1%eth0 のようなゾーン ID 付き IPv6 は Docker 自身のパーサと同様に拒否します。ホストポートを省略または 0 にしたバインディングは、Docker が実行時に割り当てる空きポートで公開されます。0.0.0.0 への公開はホストの全インターフェースにポートを露出させます。Linux では Docker が独自の iptables DNAT/FORWARD ルールを挿入してコンテナへ到達させるため、INPUT チェーンのみをフィルタするホストファイアウォールは、それだけでは公開ポートを遮断しません。競合レポートは Docker のデフォルトのホストバインディング設定 (ホスト IP 省略時は 0.0.0.0) を前提にしており、デーモンやネットワークで別のデフォルトバインディングアドレスを設定している場合はモデル化していません。ワイルドカードアドレス(0.0.0.0、またはホスト IP 未指定)と特定アドレスを同じホストポート・プロトコルへ結び付けるのは部分的な競合です。実際にどちらが拒否されるかは Docker のポートアロケータと作成順序に依存するため、127.0.0.1:8080 の後に 0.0.0.0:8080 を作成した場合と、逆順の場合とで挙動が異なることがあります。このツールは Docker の実行状態や Compose ファイルを読み取らず、貼り付けられた指定だけを評価します。エフェメラルポートと動的ホスト範囲は固定ポートの競合判定から除外します。範囲の重なり・枯渇・割り当て順序の影響は実行時の状態が必要です。ブラウザ上での展開には上限があり、展開するコンテナ範囲は最大 1024 ポート (動的ホスト範囲は展開しません)、解析するのは短縮構文 200 行と長い構文 200 エントリまで、バインディングは短縮構文と長い構文を合わせて最大 2048 件 (短縮構文を先に数えます) です。Docker 自体はより広い範囲を受け付けます。512 文字を超える行や 32 行を超える長い構文のブロックは解析せず報告します。競合レポートは最大 200 組まで表示し、残りの件数を示します。