Docker の実験（その１６：ユーザー定義のブリッジネットワークとレガシーなリンクの方法）

[その１５：ブリッジネットワーク](https://qiita.com/intrajp/items/b03f6d41b08b7e1a1244)のつづき。

最初の一歩

```bash
$ gcloud auth login
$ gcloud compute instances list
$ gcloud compute ssh --project <project-id> --zone asia-northeast1-b <vm-name>
```

次の一歩：コンテナへの入り方

```bash
$ docker ps
$ docker container exec -it <container id> bash
```

ネットワークの一歩：ネットワークの確認

```bash
$ docker network ls
```

次の一歩：調査

```bash
$ docker <リソース> inspect <対象>
```

ユーザー定義のブリッジネットワークを使うことにより、多くのコンテナの交通整理が出来るようになる。
また、名前解決が自動的にされるので、便利。

```bash
$ docker network ls
```

独自 bridge ネットワークを作ってみる。

```bash
$ docker network create --driver bridge mybridge
badee52eb7157f42ad9898d9252864b5a419ed18e852393142af271f33d30d1e

$ docker network ls
NETWORK ID     NAME       DRIVER    SCOPE
5e9118fc9ae3   bridge     bridge    local
b05adf15289a   host       host      local
badee52eb715   mybridge   bridge    local
d3ac94ee3669   none       null      local
```

mybridge という bridge ドライバを使ったネットワークが作成できた。
この独自ネットワークを調査する。

```bash
$ docker network inspect mybridge
[
    {
        "Name": "mybridge",
        "Id": "badee52eb7157f42ad9898d9252864b5a419ed18e852393142af271f33d30d1e",
        "Created": "2023-02-21T20:14:10.364253221Z",
        "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 ネットワークとなっている。

ifconfig で確認すると、docker0 に加えて、mybridge　のインターフェースが出来ている。 
名前は、mybridge ではなくて、br-xxx となっている。

```bash
br-badee52eb715: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:4c:90:33:48  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:3dff:fe1f:f74d  prefixlen 64  scopeid 0x20<link>
        ether 02:42:3d:1f:f7:4d  txqueuelen 0  (Ethernet)
        RX packets 5046  bytes 284673 (278.0 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 5377  bytes 53160182 (50.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
（以下略）
```

brctl show でみると、ネットワークインターフェースは、紐付けられていない。
brctl コマンドが Container Optimized-os の vm インスタンスにないので、toolbox コマンドを実行して、確認してみる。

```bash
$ toolbox
/# brctl show
bridge name     bridge id               STP enabled     interfaces
br-badee52eb715         8000.02424c903348       no
docker0         8000.02423d1ff74d       no              veth48a4c4e
                                                        veth9636e80
                                                        vethc072a2f
                                                        vethdedb2be
                                                        vethf7d8ca0
/# exit                                                        
```

docker0 には interface が生まれているが、br-xxx には、interface が紐づいていない。

では、この、mybridge ネットワークに、コンテナを2つ立ち上げてみる。

```bash
$ docker container run -dt --name mybridge01 --network mybridge ubuntu
62478447a0966156b0a9307a17f869a0ffb32a79ecda60476aa2a4c7b7b12dff
$ docker container run -dt --name mybridge02 --network mybridge ubuntu
026c4cb1f367a71461780ac065050c0b0bdbf66c5cb4d3ec3fd379584ab363ae
```

brctl show で確認すると、今度は、インターフェースが紐づいているのが確認できる。

```bash
$ toolbox
/# brctl show
bridge name     bridge id               STP enabled     interfaces
br-badee52eb715         8000.02424c903348       no              veth11796c4
                                                        vethe53fb14
docker0         8000.02423d1ff74d       no              veth48a4c4e
                                                        veth9636e80
                                                        vethc072a2f
                                                        vethdedb2be
                                                        vethf7d8ca0

#exit
```

以下の調査コマンドでも確認してみる。

```bash
$ docker network inspect mybridge
[
    {
        "Name": "mybridge",
        "Id": "badee52eb7157f42ad9898d9252864b5a419ed18e852393142af271f33d30d1e",
        "Created": "2023-02-21T20:14:10.364253221Z",
        "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": {
            "026c4cb1f367a71461780ac065050c0b0bdbf66c5cb4d3ec3fd379584ab363ae": {
                "Name": "mybridge02",
                "EndpointID": "b7c598b42799dd48da3cd69a1473da71dd938ba22afbe6b3e31c24df8cb9548a",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "62478447a0966156b0a9307a17f869a0ffb32a79ecda60476aa2a4c7b7b12dff": {
                "Name": "mybridge01",
                "EndpointID": "4f559c064c8729e0375a44d27245d5e2f852e8e9bd8a15b208444c0b281abf1c",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
```

確かに、172.18.0.0 ネットワークに、コンテナが 2つできている。

```bash
$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
026c4cb1f367   ubuntu    "/bin/bash"              4 minutes ago   Up 4 minutes                                           mybridge02
62478447a096   ubuntu    "/bin/bash"              4 minutes ago   Up 4 minutes                                           mybridge01
7777104893f7   ubuntu    "/bin/bash"              21 hours ago    Up 21 hours                                            bridge02
339b2fc35742   ubuntu    "/bin/bash"              21 hours ago    Up 21 hours                                            bridge01
48f7a1225f89   ubuntu    "/bin/bash"              26 hours ago    Up 26 hours                                            myhost
8229282bc476   ubuntu    "/bin/bash"              2 days ago      Up 2 days                                              my_ubuntu
e6e93cd9f5c5   5e4       "nginx -g 'daemon of…"   3 days ago      Up 2 days      0.0.0.0:8082->80/tcp, :::8082->80/tcp   mycustomnginx
67df4d402280   nginx     "/docker-entrypoint.…"   5 days ago      Up 3 days      0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx
```

1台目のコンテナに入ってみる。

```bash
$ docker container exec -it mybridge01 bash
/# apt-get update && apt-get install net-tools && apt get install iputils-ping -y
```

2台目のコンテナに ping して、ユーザー定義のネットワークブリッジでは、名前解決がされることを確認する。

```bash
/# ping mybridge02 -c 5
PING mybridge02 (172.18.0.3) 56(84) bytes of data.
64 bytes from mybridge02.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from mybridge02.mybridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from mybridge02.mybridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.096 ms
64 bytes from mybridge02.mybridge (172.18.0.3): icmp_seq=4 ttl=64 time=0.098 ms
64 bytes from mybridge02.mybridge (172.18.0.3): icmp_seq=5 ttl=64 time=0.089 ms
```

--- mybridge02 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4113ms
rtt min/avg/max/mdev = 0.067/0.087/0.098/0.011 ms
```

レガシーなリンクの方法（古い方法のため非推奨）

--link オプションを使用する。

作成方法（略）
確認方法（略）