第29回 Docker Networkingの基礎知識 標準的なネットワークを理解する古賀政純の「攻めのITのためのDocker塾」(2/5 ページ)

» 2016年09月21日 08時00分 公開

DockerにおけるNAT、IPマスカレード、IPパケット転送

 NATやIPマスカレードそのものは、Linuxの世界で古くから利用されています。Dockerも、NATとIPマスカレードの機能を使って、ホストOSとDockerコンテナが通信できるようになっているため、グローバルIPアドレスや、DockerのホストOSが所属するネットワークのIPアドレスの消費を大幅に節約することも可能です。一つのシステムで数千個、数万個という規模のDockerコンテナが同時稼働する場合に、非常に有効な手段といるでしょう。

 DockerコンテナがホストOSのNICを経由して外部のネットワークと通信するには、Dockerコンテナが発信するIPパケットをホストOSが転送できなければなりません。NAT機能を提供するルータをLinuxマシンで実現する場合やDocker環境の場合は、IPパケットを別のネットワークセグメントに転送する必要があります。このIPパケット転送を行うには、Linux OS標準搭載の「ip_forward」と呼ばれるカーネルパラメータを調整します。

 具体的には、Linux OSの「ip_foward」に関するカーネルパラメータを「1」に設定します。Dockerエンジンは、標準設定でIPパケットが転送できるように「ip_forward」が自動的に「1」に設定されます。実際に、DockerホストでIPパケットの転送が有効になっているかどうかは、以下のようにカーネルパラメータを確認します。


# cat /proc/sys/net/ipv4/conf/all/forwarding
1

 Dockerコンテナが外部のネットワークと通信するには、このIPパケットの転送機能が最低限有効になっていることが必要です。また、複数のコンテナ間の通信にもこのIPパケットの転送が利用されます。

今回想定するDocker環境のネットワーク構成

 今回は、物理NICが1ポート存在する物理サーバ上にインストールしたCentOS 7.2上で、Dockerエンジンが稼働しているとしましょう。既に、物理NICのeth0で、固定のIPアドレスの172.16.1.123/16が割り当てられているとします。

 Dockerエンジンが稼働するホストOSに設定されている固定のIPアドレス172.16.1.123/16は、グローバルIPアドレスではなくプライベートIPアドレスです。プライベートIPアドレスが設定されたホストOSとその上で稼働するDockerコンテナがインターネットにアクセスするには、グローバルIPアドレスをプライベートIPアドレスに変換するNATの設定を施したLinuxサーバ(一般的にはNATサーバ、またはNATゲートウェイと呼びます)をホストOSと同じLANセグメントに別途用意します。

 NATゲートウェイにおいては、プライベートIPのネットワークに所属するDockerホストから送信されたIPパケットをグローバルIPのネットワークに転送し、IPパケットをグローバルIPアドレスに変換するようNATを設定しておきます。こうすることで、ホストOSはインターネットにアクセスできます。また、ホストOS上で稼働するDockerコンテナも、Dockerエンジンが標準で設定するホストOSのNATの機能によってホストOSと通信ができるので、結果的にDockerコンテナもインターネットにアクセスできるようになります。

Docker 今回想定するDocker環境のネットワーク構成

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ