Docker超入門:NAPTでつながるDockerコンテナと外部ネットワーク

 Dockerコンテナは、単体でインターネットに接続されているわけではなく、ホストOSが持つネットワーク機能を介して外部と通信しています。その鍵となる仕組みが NAPT(Network Address Port Translation) です。ここでは、docker0ブリッジを通じてコンテナと外部ネットワークがつながる仕組みを、わかりやすく解説します。

docker0でのNAPT利用

Dockerをインストールすると、自動的に docker0 という仮想ブリッジが作成されます。
 コンテナがネットワーク通信を行うと、このdocker0を経由して外部のネットワークに接続します。

 ただし、コンテナの持つIPは プライベートIP なので、そのままではインターネットに直接アクセスできません。そこでNAPTが使われ、ホストOSのグローバルIPとポート番号に変換されることで、外部との通信が可能になります。

NAPTの特徴

NAPTの役割を整理すると次のようになります。

項目説明
IPマスカレードコンテナのプライベートIPをホストのグローバルIPに変換する。
ポート番号の変換通信時にポート番号を変換し、外部からの応答を正しいコンテナに戻す。
複数IPの集約複数コンテナがそれぞれ異なるプライベートIPを持っていても、1つのグローバルIPで通信できる。
1対多の変換外部からの複数接続を1つのグローバルIPで処理可能にする。

この仕組みによって、1台のホストマシン上で多数のコンテナが同時に外部通信できるようになります。

外部からのアクセスの流れ

外部クライアントがコンテナへアクセスする場合の流れをステップごとに見てみましょう。

  1. 外部リクエストの到着
    外部からのリクエストは、ホストマシンの物理NIC(例: eth0)に届きます。
  2. docker0への転送
    リクエストはホストOS内のdocker0ブリッジへ送られます。
  3. NAPTによる変換
    docker0でNAPT処理が行われ、外部のリクエストがコンテナのプライベートIPとポート番号へ変換されます。
  4. コンテナへの転送
    NAPTで変換されたデータが、対応するコンテナのeth0インターフェースに転送されます。
  5. アプリケーションが受信
    コンテナ内のアプリケーションがリクエストを受け取り、処理した結果をレスポンスとして返します。レスポンスは逆にNAPTを通り、外部クライアントへ返されます。

この流れのおかげで、外部のクライアントはまるで直接コンテナにアクセスしているように通信できるのです。

図で理解するNAPTとDocker通信

理解を助けるために、NAPTを使った通信の流れを図で表現します。

まとめ

Dockerコンテナと外部ネットワークの通信は、docker0ブリッジとNAPT によって成立しています。

  • コンテナはプライベートIPしか持たないが、NAPTでグローバルIPに変換される。
  • 複数のコンテナが同じホストから外部通信できるのは、ポート番号の変換によるもの。
  • 外部からのアクセスもNAPT経由で正しいコンテナに届けられる。

 この仕組みを理解すると、「なぜコンテナがインターネットに出られるのか」「どうやって外部からアクセスできるのか」がスッキリ見えてきます。