跳到主要内容

Bridge Network

2024年07月04日
柏拉文
越努力,越幸运

一、认识


桥接网络 (Bridge Network)Docker 的默认网络模式。在这种模式下,Docker 在主机上默认会创建一个名为 docker0 的虚拟网络桥接设备,所有的容器默认都连接到这个桥接设备中。每个容器都有一个独立的网络命名空间和一个独立的虚拟以太网接口。桥接网络 每个容器都有自己的网络命名空间,容器之间通过桥接设备通信,每个容器在桥接网络中都有一个独立的 IP 地址。桥接网络 由于需要通过虚拟网络桥接进行通信,会有一定的性能开销。桥接模式 提供了良好的隔离性和灵活性,适合开发和测试环境。

二、语法


Docker 在主机上默认会创建一个名为 docker0 的虚拟网络桥接设备,所有的容器默认都连接到这个桥接设备中。每个容器都有一个独立的网络命名空间和一个独立的虚拟以太网接口。Docker 也支持创建自定义的虚拟网络桥接设备,并让容器连接到自定的网络桥接设备中。

2.1 创建自定义网络

docker network create -d bridge my_network

docker network ls // 查看自定 Bridge
docker network inspect my_network // 查看 my_network 网络信息

2.2 启动 A 容器,并指定网络

docker run -d --name db --network my_network my_db_image

2.3 启动 B 容器,并指定网络

docker run -d --name web --network my_network my_web_image

2.4 进入 B 容器,访问 A 容器服务

比如: 在 web 容器中,可以通过 db:port 访问 db 容器提供的服务。

2.5 操作容器 B, 容器 B 连接多个网络

容器B 通过 docker run -d --name web --network my_network my_web_image 指定网络为 my_network , 如果想要容器 B 连接多个网络怎么办呢? 比如说在让容器 B 连接默认网络 Docker0 bridge 呢? 实现如下:

docker network connect [网络名/网络ID] [容器ID]

那么,在本例中,命令如下:

docker network connect bridge nginx1

docker inspect nginx1 // 验证连接多个网络是否成功,查看 NewWork 即可

三、基于 IP 通信


桥接网络 是在同一网络下通信时,可以通过其 IP 地址相互通信。注意,如果没有创建自定的网络,Docker 默认网桥网络是 Docker0。在容器运行没有指定网络的情况下,默认连接 Docker0 网桥。可以通过 docker network lsdocker network inspect 网桥网络 ID 查看默认网桥 Docker0 的容器。

多个容器进行 curl IP 测试: 默认网络 Docker0 和自定义网络都支持 IP 通信。

// 1. 创建自定义网络 bridge1
docker network create -d bridge bridge1
// 2. 查看 bridge1 中的容器,此时为空
docker network inspect bridge1
// 3. 启动 Nginx , 作为容器1, 并指定网络为 bridge1
docker run -d --name nginx1 -p 9091:80 --network bridge1 nginx:latest
// 4. 启动 Nginx , 作为容器2, 并指定网络为 bridge1
docker run -d --name nginx2 -p 9092:80 --network bridge1 nginx:latest
// 5. 再次查看 bridge1 中的容器,此时有 容器1 和 容器2
docker network inspect bridge1
// 6. 进入容器1, curl 容器2 服务
docker exec -it nginx1 bash
curl 172.18.0.3

四、基于容器通信


桥接网络 是在同一网络下通信时, 提供了通过容器名称进行通信的方式。 Docker 内置的 DNS 服务器可以解析同一网络中的容器名称,使容器可以通过名称而不是 IP 地址进行访问。 注意: Docker 默认网桥网络是 Docker0。在容器运行没有指定网络的情况下,默认连接 Docker0 网桥。Docker0 网络是不支持通过容器名称通信的。

多个容器进行 curl 容器 测试: 默认网络 Docker0 不支持通过容器名称通信,只有自定义网络支持容器名称通信。

// 1. 创建自定义网络 bridge1
docker network create -d bridge bridge1
// 2. 查看 bridge1 中的容器,此时为空
docker network inspect bridge1
// 3. 启动 Nginx , 作为容器1, 并指定网络为 bridge1
docker run -d --name nginx1 -p 9091:80 --network bridge1 nginx:latest
// 4. 启动 Nginx , 作为容器2, 并指定网络为 bridge1
docker run -d --name nginx2 -p 9092:80 --network bridge1 nginx:latest
// 5. 再次查看 bridge1 中的容器,此时有 容器1 和 容器2
docker network inspect bridge1
// 6. 进入容器1, curl 容器2 服务
docker exec -it nginx1 bash
curl nginx2