デフォルトのブリッジネットワークとdocker0

ホストやコンテナ間の通信はデフォルトでブリッジを通して行われる。ブリッジとは異なるネットワークの橋渡しをする仮想デバイス。


ブリッジDocker0

Dockerコンテナは、デフォルトで172.17.0.0/16のネットワークに置かれ、ホストとの接続はdocker0という名前のブリッジを通して行われる。

Dockerサーバを起動すると、IPアドレスが172.17.0.1/16docker0が自動作成。

# ipコマンドでdocker0のIPアドレス(IPv4)確認
ip -4 address show dev docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

# pingで動作確認
ping -c 1 172.17.0.1

コンテナのIPアドレス

IPアドレスは基本的にコンテナ起動ごとに、172.17.0.2172.17.0.3と連番になるようだ。

# DebianでBash(ipコマンドがデフォルトで入っている)
# バックグラウンド・モード
docker run --rm -dit --name test debian:9 bash

# IPアドレス確認
docker exec -it test ip -4 address show type veth
320: eth0@if321: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default  link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

仮想デバイスveth

起動したコンテナごとに、仮想デバイス(veth)が「veth」から始まる名前で作成され、コンテナ停止で削除される。自動なので基本的に触る必要はない。

# ホストで
brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02421e54b26c       no              veth0305ca8

ip address show type veth
321: veth0305ca8@if320: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 82:48:84:66:e5:00 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::8048:84ff:fe66:e500/64 scope link 
       valid_lft forever preferred_lft forever

ホストからコンテナへのアクセス

ホストが開始するコンテナへのアクセスは、デフォルトで可能。

# コンテナのIPアドレスへping
ping -c 1 172.17.0.2

コンテナから他のコンテナへのアクセス

コンテナが他のコンテナへアクセスするのは、IPアドレスを用いてデフォルトで可能。(デフォルトのブリッジネットワーク内(172.17.0.0/16)の話)

# 1個目のコンテナ(172.17.0.2)にping
docker run --rm -it --name test2 debian:9 ping -c 1 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.279 ms

--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.279/0.279/0.279/0.000 ms

# 1個目のコンテナ停止
docker stop test

ユーザ定義の同じブリッジネットワークに属するコンテナ同士なら、コンテナ名を用いてもアクセスができる。


コンテナから外部へのアクセス

コンテナ側から開始する外部へのアクセスは、デフォルトで可能。DockerサーバでIPマスカレードが有効(--ip-masq=true)(man dockerd)。

docker run --rm -it centos:7 curl google.com

外部からコンテナへのアクセス

コンテナを公開サーバにする等、外部から開始するコンテナへのアクセスは、デフォルトではできない(上の戻りの通信は別)。方法の一つは、「ホストIPアドレス:ポート」へのアクセスが「コンテナIPアドレス:ポート」に転送されるように、コンテナ作成時に--publishを使う。