段階的に見て理解するDocker Bridgeネットワーク
モチベーション
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