关于docker-compose network问题
查看现有的docker网络情况
docker nertwork ls

docker-compose 每次都会创建一个新的network吗,默认是桥接模式吗
是的,docker-compose 每次运行时的网络行为如下:
✅ 默认行为:
1. 每个 docker-compose.yml 文件对应一个自定义网络
docker-compose默认会为你的服务创建一个 bridge 模式的自定义网络,网络名格式为:
<项目名>_default
- 例如:如果你的目录叫
myapp/,docker-compose up会创建网络:
myapp_default
2. 默认使用 Bridge 驱动
- 虽然是
bridge驱动,但 不是 Docker 默认的bridge网络(名叫bridge),而是创建了一个自定义的桥接网络。 - 自定义的 bridge 网络支持 容器名称 DNS 解析(比如服务名可互相通信),而默认的
bridge不支持。
🔁 是否每次都创建新的 network?
- **否。**除非你显式加了
--project-name或删除了网络。 docker-compose会检查当前项目是否已有对应的<project>_default网络,如果已有,不会重复创建。
🧹 示例:
docker-compose up -d
查看自动创建的网络:
docker network ls
输出可能包含:
NETWORK ID NAME DRIVER SCOPE
abc12345 myapp_default bridge local
查看网络详情:
docker network inspect myapp_default
🛠 如何自定义网络?
你可以在 docker-compose.yml 中指定自定义网络名称和驱动:
version: '3'
services:
web:
image: nginx
networks:
- mynet
networks:
mynet:
driver: bridge
✅ 总结:
| 问题 | 答案 |
|---|---|
| 每次运行都会创建新 network? | 否,除非更换项目名或手动删除已有网络 |
| 默认网络类型是什么? | 自定义 bridge 网络,不是默认 bridge |
| 支持服务名互相通信吗? | 是,使用自定义 bridge 网络支持容器间 DNS 通信 |
如何指定网络以及在docker-compose里面多个服务如何打通网络
如果你想让多个服务在 docker-compose 中打通网络(互联互通),你可以通过自定义网络来实现,这比默认的 <project>_default 网络更加可控。
✅ 多个服务打通网络的写法
version: "3.9"
services:
web:
image: nginx
networks:
- shared-net
app:
image: myapp
networks:
- shared-net
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- shared-net
networks:
shared-net:
driver: bridge
🔍 网络打通的工作机制
shared-net是一个自定义的 bridge 网络。- 所有加入该网络的服务都可以通过 服务名 DNS 自动解析 相互访问。
例如:
app容器中可以用db:3306连接数据库。web容器中可以用app:80调用后端应用。
🔄 多网络场景(服务加入多个网络)
services:
proxy:
image: nginx
networks:
- frontend
- backend
web:
image: myweb
networks:
- frontend
api:
image: myapi
networks:
- backend
networks:
frontend:
backend:
proxy可以作为前后端中介,因为它加入了frontend和backend两个网络。web和api本身不互通,但都能通过proxy间接通信。
❗️注意事项:
- 所有服务加入同一个网络才可以直接互通。
- 默认服务名作为容器主机名可用于 DNS,例如:
curl http://db:3306 - 如果你手动创建网络并在多个 compose 项目中复用网络,必须显式指定
external: true。
networks:
shared-net:
external: true
🧪 查看网络情况:
docker network ls
docker network inspect <network_name>
service里面声明的networks何外面的networks有什么区别
这是个很常见的问题,下面我给你清晰解释:
🧠 总结一句话:
services.<service>.networks:声明该服务要连接哪些网络。- 顶层的
networks:定义这些网络的名称、驱动类型等属性(也就是网络的“配置信息”)。
🧱 举个例子说明:
version: "3.9"
services:
app:
image: myapp
networks:
- frontend
- backend
db:
image: mysql
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
1. services.app.networks
services:
app:
networks:
- frontend
- backend
意思是:
“我
app服务需要连接到 frontend 和 backend 这两个网络。”
这可以类比为:“这个服务插了两根网线(虚拟的),分别插到 frontend 和 backend 网络中。”
2. 顶层 networks
networks:
frontend:
driver: bridge
backend:
driver: bridge
意思是:
“我要定义两个网络:
frontend和backend,它们的驱动类型都是 bridge。”
这是网络的配置定义部分。
📌 常见用途和区别
| 位置 | 作用 | 举例 |
|---|---|---|
services.<svc>.networks |
指定该服务连接到哪些网络 | app 连接到 frontend 和 backend |
顶层 networks |
定义网络的属性,如 driver、external 等 | 定义 frontend 为 bridge 类型 |
❗ 如果只在 services 写了 networks,不在顶层定义会怎样?
- 如果网络没有定义过,
docker-compose会自动创建一个 默认设置 的网络(bridge)。 - 但如果你想设置高级属性,比如
external: true或internal: true,就必须在顶层定义。
🧠 补充:你可以这样连用(完整配置示例)
services:
web:
image: nginx
networks:
- mynet
networks:
mynet:
driver: bridge
internal: false # 允许外部访问(非内部网络)
2025-07-01 11:07:37 星期二

浙公网安备 33010602011771号