🌟

【Docker】ブリッジネットワークの解像度を上げる試み

2024/03/24に公開

ブリッジネットワークを作成してコンテナを作ってみる

ホストの vagrant 資材は以下
https://app.vagrantup.com/bento/boxes/ubuntu-22.04

docker インストール前のホストのインターフェースの状態(関係ない行省略)

# ip a
・・・
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0

1: lo: ループバックのインターフェース(172.0.0.1)
2: eth0:ホストのデフォルトのインターフェース(10.0.2.15)
 →デフォルトゲートウェイ(10.0.2.2)と接続されたインターフェース

docker インストール後のホストのインターフェースの状態(関係ない行省略)

# ip a
・・・
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

1: lo: ループバックのインターフェース(172.0.0.1)
2: eth0:ホストのデフォルトのインターフェース(10.0.2.15)
 →デフォルトゲートウェイ(10.0.2.2)と接続されたインターフェース
3: docker0: Dockerインストール時に自動で作成されるデフォルトのブリッジネットワークのインターフェース(172.17.0.1)

docker network の確認

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
02d35875473c   bridge    bridge    local
d307b9fd2ae5   host      host      local
fd54e5e2b1d5   none      null      local

# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "02d35875473cb0840fa6297092de7e5f74f48a6f5cc582a661e60e1586140884",
        "Created": "2024-03-24T06:58:28.758932241Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

test01 という名前で docker network を作成してみる

# docker network create test01

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
02d35875473c   bridge    bridge    local
d307b9fd2ae5   host      host      local
fd54e5e2b1d5   none      null      local
f7cf72c3e457   test01    bridge    local

# docker network inspect test01
[
    {
        "Name": "test01",
        "Id": "f7cf72c3e457665f27a554f568498f6b6f591859547fc6e1aaaca88ae4ebc5be",
        "Created": "2024-03-24T07:18:14.212178285Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

自動的にデフォルトのブリッジネットワークと重複しないネットワークレンジ(172.18.0.0/16)で test01 ブリッジネットワークが作成されたことを確認!!
また,test01 のインターフェースの IP アドレスとしては 172.18.0.1/32 が割り当たっている。
ここまでのネットワーク構成を図にすると以下

ホストのインターフェースの確認

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
6: br-f7cf72c3e457: <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-f7cf72c3e457

新しく仮想ブリッジのインターフェース「br-f7cf72c3e457」(172.18.0.1)が追加されている

コンテナを追加して変化を観察する

default と test01 それぞれにコンテナを1台起動してみる

# docker run -itd --name container-default --net default rockylinux:9.0

# docker run -itd --name container-test01 --net test01 rockylinux:9.0

# docker container ls
CONTAINER ID   IMAGE            COMMAND       CREATED          STATUS          PORTS     NAMES
09cca641e9e0   rockylinux:9.0   "/bin/bash"   9 seconds ago    Up 8 seconds              container-test01
8b1ac4c7b576   rockylinux:9.0   "/bin/bash"   17 seconds ago   Up 15 seconds             container-default

インターフェースの状態を見てみる

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
3: 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
6: br-f7cf72c3e457: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-f7cf72c3e457
8: vethac7b57a@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    inet6 fe80::c0c8:86ff:fec3:8457/64 scope link
10: veth831df65@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-f7cf72c3e457 state UP group default
    inet6 fe80::805a:5fff:feed:8664/64 scope link

ホストにインターフェースが2個追加されていることがわかる

  • vethac7b57a@if7
  • veth831df65@if9

これらは,ブリッジとコンテナを接続するためのブリッジ側のインターフェース!!!!

コンテナ側(内)のインターフェースを見てみる

#defaultのほうのコンテナ
# docker exec -it container-default bash
[root@8b1ac4c7b576 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    inet6 fe80::42:acff:fe11:2/64 scope link

#test01のほうのコンテナ
# docker exec -it container-test01 bash
[root@09cca641e9e0 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
    inet6 fe80::42:acff:fe12:2/64 scope link

コンテナ内のインターフェースとして default のほうのコンテナは「172.17.0.2」で割り当たっている。
一方で test01 のほうのコンテナは「172.18.0.2」で割り当たっていることがわかる。

現在の状態を図示すると以下

default と test01 にコンテナをさらにもう1台ずつ起動してみる

それぞれでコンテナを起動

# docker run -itd --name container-default-2 --net default rockylinux:9.0

# docker run -itd --name container-test01-2 --net test01 rockylinux:9.0

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
3: 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
6: br-f7cf72c3e457: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-f7cf72c3e457
8: vethac7b57a@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    inet6 fe80::c0c8:86ff:fec3:8457/64 scope link
10: veth831df65@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-f7cf72c3e457 state UP group default
    inet6 fe80::805a:5fff:feed:8664/64 scope link
12: vethe450b2d@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    inet6 fe80::c6:66ff:fe8e:2568/64 scope link
14: veth5f87de1@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-f7cf72c3e457 state UP group default
    inet6 fe80::c449:7ff:fe6a:34ca/64 scope link

同様にインターフェースが追加されている

追加したコンテナ内でインターフェースの状態を確認してみる

#default のほうのコンテナ
# docker exec -it container-default-2 bash
[root@65eb13d19bab /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
11: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0

#test01のほうのコンテナ
# docker exec -it container-test01-2 bash
[root@6f809d05a209 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0

現在の状態を図示すると以下

Discussion