プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

Dockerのネットワークのタイプ

Dockerでコンテナ同士が通信するためにはネットワークが必要だ。

Dockerは複数のネットワーク接続方式をネットワークドライバというPluggableな形式でサポートしている。

ここではDockerが提供するネットワークについて見ていこう。


Default Bridge

f:id:hogehoge666:20200813202107p:plain

Dockerはdocker0というブリッジをデフォルトで作成している。コンテナ開始時になにも指定しなければコンテナはdocker0に接続される。コンテナにはIPアドレスが付与される。

同じdocker0に接続されたコンテナ同士はIPアドレスで通信できる。

ホスト外(10.0.0.0/24) と通信する場合はiptablesによりNATされる。

Default Bridgeを利用する例を以下に示す。

docker run -it ubuntu-image

User Defined Bridge

f:id:hogehoge666:20200813202228p:plain

ユーザは新たなブリッジを作成することができる。作成されたブリッジに接続されたコンテナには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

f:id:hogehoge666:20200813202415p:plain

コンテナがHostのEthernetポートを専有して使用する。

コンテナはホスト外(10.0.0.0/24)とNATなしで通信することができる。

Hostネットワークを利用する例を以下に示す。

docker run -it ubuntu-image --net=host

Overlay

f:id:hogehoge666:20200813202438p:plain

異なるホスト上のコンテナをVxLANによるトンネルでLayer 2レベルで接続する。異なるホスト上のコンテナ同士がコンテナ名で通信できる点はメリットである。

docker swarmを利用すると自動でOverlayネットワークが作成される。


macvlan

f:id:hogehoge666:20200813202508p:plain

ホストの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

f:id:hogehoge666:20200813202526p:plain

コンテナをネットワークに接続しない。

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