关于docker-compose network问题

查看现有的docker网络情况

docker nertwork ls

image

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 可以作为前后端中介,因为它加入了 frontendbackend 两个网络。
  • webapi 本身不互通,但都能通过 proxy 间接通信。

❗️注意事项:

  1. 所有服务加入同一个网络才可以直接互通。
  2. 默认服务名作为容器主机名可用于 DNS,例如:curl http://db:3306
  3. 如果你手动创建网络并在多个 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

意思是:

“我要定义两个网络:frontendbackend,它们的驱动类型都是 bridge。”

这是网络的配置定义部分。


📌 常见用途和区别

位置 作用 举例
services.<svc>.networks 指定该服务连接到哪些网络 app 连接到 frontend 和 backend
顶层 networks 定义网络的属性,如 driver、external 等 定义 frontend 为 bridge 类型

❗ 如果只在 services 写了 networks,不在顶层定义会怎样?

  1. 如果网络没有定义过,docker-compose 会自动创建一个 默认设置 的网络(bridge)。
  2. 但如果你想设置高级属性,比如 external: trueinternal: true,就必须在顶层定义

🧠 补充:你可以这样连用(完整配置示例)

services:
  web:
    image: nginx
    networks:
      - mynet

networks:
  mynet:
    driver: bridge
    internal: false  # 允许外部访问(非内部网络)

2025-07-01 11:07:37 星期二

posted @ 2025-07-01 11:07  学不会xuebuhui  阅读(343)  评论(0)    收藏  举报
Language: javascript //图片预览