🐧

段階的に見て理解するDocker Bridgeネットワーク

に公開
2026/01/25

モチベーション

DockerのBridgeネットワークがどうなっているのかを可視化する試み

実行環境

  • WSL2(Ubuntu-24.04)
  • Docker version 29.1.5
  • Docker Compose version v5.0.2

段階的に見ていく

bridgeネットワークの作成

$ docker network create --driver bridge demo
1cc51afb4d850b832ec809c622a4667aafe20a5aa4788646fa6d09a208047ce0

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
68df49002975   bridge    bridge    local
1cc51afb4d85   demo      bridge    local
3336c7354f4b   host      host      local
0aa2896f6473   none      null      local

$ docker network inspect demo
[
    {
        "Name": "demo",
        "Id": "1cc51afb4d850b832ec809c622a4667aafe20a5aa4788646fa6d09a208047ce0",
        "Created": "2026-01-24T21:11:16.304492871+09:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv4": true,
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "IPRange": "",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Options": {},
        "Labels": {},
        "Containers": {},
        "Status": {
            "IPAM": {
                "Subnets": {
                    "172.18.0.0/16": {
                        "IPsInUse": 3,
                        "DynamicIPsAvailable": 65533
                    }
                }
            }
        }
    }
]

ここで実行しているWSL2(Ubuntu-24.04)のネットワークの状態を確認する。
デフォルトのホスト側とDockerネットワークのインターフェースになっているのがdocker0になる。
今回作成したBridgeネットワークはdemoで、ゲートウェイのプライベートIPアドレスがinspectコマンドの結果から「172.18.0.1」となっている。
このゲートウェイのネットワークインターフェースは、ipコマンドの結果から「br-1cc51afb4d85」となる。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:b7:1e:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.160.134/20 brd 192.168.175.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feb7:1e03/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 0a:3b:03:90:04:a0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
41: br-1cc51afb4d85: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 1e:fb:ae:49:37:3c brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-1cc51afb4d85
       valid_lft forever preferred_lft forever

したがって、現在のネットワークの状態を図示すると以下のような感じです。

Dockerコンテナを1つ作成

続いてDockerコンテナをBridgeネットワークdemoに紐づける形で作成する

# ここではapacheのコンテナを使用
$ docker container run --name web --network demo -itd -p 8080:80 httpd
3f24c0aeaf055df074b0369ff3e5c42a5ec8f6697830ca7fdf48f95cbf123253

$ docker container ls
CONTAINER ID   IMAGE     COMMAND              CREATED          STATUS          PORTS                                     NAMES
3f24c0aeaf05   httpd     "httpd-foreground"   22 seconds ago   Up 22 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web

ホスト側からlocalhostでアクセスできるかを確認

では、続いてネットワークの状態を確認する

# まずはホスト側
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:b7:1e:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.160.134/20 brd 192.168.175.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feb7:1e03/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 0a:3b:03:90:04:a0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::83b:3ff:fe90:4a0/64 scope link
       valid_lft forever preferred_lft forever
41: br-1cc51afb4d85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 1e:fb:ae:49:37:3c brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-1cc51afb4d85
       valid_lft forever preferred_lft forever
    inet6 fe80::1cfb:aeff:fe49:373c/64 scope link
       valid_lft forever preferred_lft forever
44: veth3841d50@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-1cc51afb4d85 state UP group default
    link/ether b6:ca:88:59:c0:1c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b4ca:88ff:fe59:c01c/64 scope link
       valid_lft forever preferred_lft forever

# 続いてDockerコンテナ内部からネットワークを確認する
$ docker container exec -it web bash
root@3f24c0aeaf05:/usr/local/apache2# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 3a:84:47:0e:41:48 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

コンテナ側にもネットワークインターフェースeth0がipコマンドで確認でき、プライベートIPアドレス(172.18.0.2)としてホスト側から確認したものと一致しているのが分かる。

したがって、現在の状態を図示すると以下のような感じになる。

コンテナをもう1つ追加してみる

# 今回はUbuntuのコンテナ(なんとなく)
$ docker run --name ubuntu --network demo -itd ubuntu:latest
802f7456a5652299f2d999747c9823f365c3e74ea0a2e8f5cbd883f946ac3f55

$ docker container ls
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS          PORTS                                     NAMES
802f7456a565   ubuntu:latest   "/bin/bash"          24 seconds ago   Up 23 seconds                                             ubuntu
3f24c0aeaf05   httpd           "httpd-foreground"   50 minutes ago   Up 50 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web

では、この状態でネットワークの状態を確認する

# まずはホスト側
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:b7:1e:03 brd ff:ff:ff:ff:ff:ff
    inet 192.168.160.134/20 brd 192.168.175.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:feb7:1e03/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 0a:3b:03:90:04:a0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::83b:3ff:fe90:4a0/64 scope link
       valid_lft forever preferred_lft forever
41: br-1cc51afb4d85: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 1e:fb:ae:49:37:3c brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global br-1cc51afb4d85
       valid_lft forever preferred_lft forever
    inet6 fe80::1cfb:aeff:fe49:373c/64 scope link
       valid_lft forever preferred_lft forever
44: veth3841d50@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-1cc51afb4d85 state UP group default
    link/ether b6:ca:88:59:c0:1c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b4ca:88ff:fe59:c01c/64 scope link
       valid_lft forever preferred_lft forever
49: veth0d1d853@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-1cc51afb4d85 state UP group default
    link/ether 12:48:b2:60:46:96 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::1048:b2ff:fe60:4696/64 scope link
       valid_lft forever preferred_lft forever

# 続いてコンテナ内部から
$ docker container exec -it ubuntu bash
root@802f7456a565:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether c6:ce:52:de:03:0e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever

これも同様に新たに作成したUbuntuのコンテナ側にもネットワークインターフェースeth0が確認でき、そのプライベートIPアドレスは172.18.0.3になっている。
これはホスト側でIPコマンドで確認した際のネットワークインターフェースveth0d1d853@if2と同じもの。
したがって、現在の状態を図示すると以下のような感じになる。

ちなみに、UbuntuコンテナからWebコンテナにアクセスしてみると以下のような感じでコンテナ名で名前解決をし、アクセスができるようになっている。

root@802f7456a565:/# curl -v web
* Host web:80 was resolved.
* IPv6: (none)
* IPv4: 172.18.0.2
*   Trying 172.18.0.2:80...
* Connected to web (172.18.0.2) port 80
> GET / HTTP/1.1
> Host: web
> User-Agent: curl/8.5.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sat, 24 Jan 2026 14:14:57 GMT
< Server: Apache/2.4.66 (Unix)
< Last-Modified: Fri, 07 Nov 2025 08:23:08 GMT
< ETag: "bf-642fce432f300"
< Accept-Ranges: bytes
< Content-Length: 191
< Content-Type: text/html
<
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>It works! Apache httpd</title>
</head>
<body>
<p>It works!</p>
</body>
</html>
* Connection #0 to host web left intact

Discussion