Dockerでコンテナ同士が通信するためにはネットワークが必要だ。
Dockerは複数のネットワーク接続方式をネットワークドライバというPluggableな形式でサポートしている。
ここではDockerが提供するネットワークについて見ていこう。
Default Bridge
Dockerはdocker0というブリッジをデフォルトで作成している。コンテナ開始時になにも指定しなければコンテナはdocker0に接続される。コンテナにはIPアドレスが付与される。
同じdocker0に接続されたコンテナ同士はIPアドレスで通信できる。
ホスト外(10.0.0.0/24) と通信する場合はiptablesによりNATされる。
Default Bridgeを利用する例を以下に示す。
docker run -it ubuntu-image
User Defined Bridge
ユーザは新たなブリッジを作成することができる。作成されたブリッジに接続されたコンテナにはIPアドレスが付与され、コンテナ名とIPアドレスがDNSサービスに登録される。
同じブリッジに接続されたコンテナ同士はIPアドレスかコンテナ名で通信できる。IPアドレスはコンテナの作成・削除に伴い変化するためコンテナ名で通信できることはコード開発上、メリットとなる。
ホスト外(10.0.0.0/24) と通信する場合はNATされる点はDefault Bridgeと同じである。
User Defined Bridgeを利用する例を以下に示す。
docker network create --driver bridge myBridge docker run -it ubuntu-image --net=myBridge
Host
コンテナがHostのEthernetポートを専有して使用する。
コンテナはホスト外(10.0.0.0/24)とNATなしで通信することができる。
Hostネットワークを利用する例を以下に示す。
docker run -it ubuntu-image --net=host
Overlay
異なるホスト上のコンテナをVxLANによるトンネルでLayer 2レベルで接続する。異なるホスト上のコンテナ同士がコンテナ名で通信できる点はメリットである。
docker swarmを利用すると自動でOverlayネットワークが作成される。
macvlan
ホストのEthernetポートに仮想的なポートを作成してコンテナに割り当てる。仮想的なポートは固有のMACアドレスを持ち、通常のホストポート同様にIPアドレスを割り当てることができる。
コンテナはホスト外(10.0.0.0/24)とNATなしで通信することができる。
コンテナはmacvlan を利用する他のコンテナと通信することができる。
macvlanの制限事項としてホストのEthernetポートとは通信できない。
macvlanを利用する例を以下に示す。
docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.1 -o parent=Eth mcv docker run -it ubuntu-image --net=mcv
none
コンテナをネットワークに接続しない。
noneを利用する例を以下に示す。
docker run -it ubuntu-image --net=none
おまけ
docker network command
- ネットワーク作成
docker network create --driver
- ネットワーク一覧表示
docker network ls
- コンテナ開始時にコンテナをネットワークに接続
docker run --network <network>
- 別の名前で名前解決できるようにする。コンテナ名が長かったり、起動するまで確定しない場合に便利。
docker run --network-alias=<alias>
- 既存のコンテナをネットワークに接続
docker network connect <net-id> <container-id>
- 既存のコンテナをネットワークから切断
docker network disconnect
Host設定
bridgeのトラフィックを外部へ転送するために必要なHost設定
- パケット転送機能を有効化
sysctl net.ipv4.conf.all.forwarding=1
- 転送されたパケットを許可
iptables -P FORWARD ACCEPT