ユーザ定義のブリッジネットワーク

docker0デフォルトのブリッジネットワーク(172.17.0.0/16)は、プロダクション実運用では推奨されない。ユーザ定義のブリッジを使うならdocker network createコマンドで新規作成する。

その他、特徴はデフォルトのブリッジネットワークと基本的に同じ。


ブリッジネットワークの新規作成

docker network createコマンドでネットワークを新規作成する。

# net1とnet2という名前のブリッジネットワーク作成
docker network create --driver bridge net1
docker network create --driver bridge net2

ブリッジネットワークの一覧

ネットワークの一覧はdocker network lsコマンドで確認する。

# ブリッジネットワークをリスト
docker network ls --filter driver=bridge
NETWORK ID          NAME                DRIVER              SCOPE
c1715443bedb        bridge              bridge              local
718d5973c195        net1                bridge              local
193845b01956        net2                bridge              local

一番上はデフォルトのブリッジネットワーク。

ネットワークアドレスは次のように連番になるようだ。

# ブリッジのIPアドレスなど確認
ip -4 address show type bridge
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
127: br-718d5973c195: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-718d5973c195
       valid_lft forever preferred_lft forever
128: br-193845b01956: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    inet 172.19.0.1/16 brd 172.19.255.255 scope global br-193845b01956
       valid_lft forever preferred_lft forever

ネットワークを指定してコンテナ作成・起動

上記のネットワークに属するには、コンテナ作成時に--networkで指定する。また、コンテナ名を付けて、コンテナ同士がコンテナ名でアクセスできるようにする。

# dns、web、dbという名前のコンテナを三つ作成・起動(バックグラウンド・モード)
# ネットワーク所属コンテナ
# net1: dns, web
# net2: db
docker run --rm -dit --name dns --network net1 debian:9
docker run --rm -dit --name web --network net1 debian:9
docker run --rm -dit --name db --network net2 debian:9

ここで、同じネットワークのコンテナwebとdnsは、互いにアクセスできる。

同じネットワークへアクセス

# コンテナ名でアクセス
docker exec -it web ping -c 1 dns
PING dns (172.18.0.2) 56(84) bytes of data.
64 bytes from dns.net1 (172.18.0.2): icmp_seq=1 ttl=64 time=0.206 ms

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

# IPアドレスでもアクセス
docker exec -it web ping -c 1 172.18.0.2

違うネットワークへはアクセスできない

# コンテナdbは、属していないnet1のコンテナにはアクセスできない
# コンテナ名はそもそも名前解決できない
docker exec -it db ping -c 1 dns
ping: db: Name or service not known

# IPアドレスでもアクセスできない
docker exec -it db ping -c 1 172.18.0.2
(中略)
1 packets transmitted, 0 received, 100% packet loss, time 0ms

# ただしブリッジデバイスにはアクセスできる
docker exec -it db ping -c 1 172.18.0.1

コンテナにネットワークを追加

起動中のコンテナに、ネットワークを追加するなら、docker network connect

# コンテナwebをネットワークnet2にも接続
docker network connect net2 web

# ネットワーク所属コンテナ
# net1: dns, web
# net2: db, web

# コンテナwebはnet1とnet2のどちらのネットワークへもアクセスできる
docker exec -it web ping -c 1 db
docker exec -it web ping -c 1 dns

ネットワークの詳細

ネットワークの詳細はdocker network inspectコマンドで調べる。所属するコンテナやIPアドレスもわかる。

docker network inspect net1

# (参考) 所属コンテナ
docker network inspect net1 | sed --quiet --regexp-extended '/"Containers"/,$ { /"Options"/ q; s/^[ ]{8}//; p; }'
"Containers": {
    "1942743f77bcdc3b7ff5ef85e2257a930dc7ae26c4f2161773b78683cc424573": {
        "Name": "web",
        "EndpointID": "c5fe7de347fdaf35b39d6c87e2a408abd7b83cb16d2d538de820f7337b93e429",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
    },
    "f63b53e78386050e92f3b6cd52da0c5854e37705ea0c3d156e4a0e1470ad7d0d": {
        "Name": "dns",
        "EndpointID": "926932112c34ddd390c9fc628b043bd9c45f04bc7f1c5cde9f0a57f3d5169d10",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
    }
},

使用していないネットワークをまとめて削除

# まずコンテナ停止・削除
docker stop dns web db

# 使用していないネットワークまとめて削除
docker network prune