ホストやコンテナ間の通信はデフォルトでブリッジを通して行われる。ブリッジとは異なるネットワークの橋渡しをする仮想デバイス。
docker0
(プロダクション実運用では推奨されない)
docker network
コマンドで作る(推奨)
Dockerコンテナは、デフォルトで172.17.0.0/16
のネットワークに置かれ、ホストとの接続はdocker0
という名前のブリッジを通して行われる。
Dockerサーバを起動すると、IPアドレスが172.17.0.1/16
のdocker0
が自動作成。
# 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アドレスは基本的にコンテナ起動ごとに、172.17.0.2
、172.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」から始まる名前で作成され、コンテナ停止で削除される。自動なので基本的に触る必要はない。
# ホストで
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
を使う。