Skip to content

host 与 bridge 网络

两种模式的差别

bridge(默认)host
容器 IP独立,172.x 网段和宿主机一样
端口映射需要 ports:没有,容器监听什么宿主机就是什么
容器内 127.0.0.1容器自己宿主机
性能多一层 NAT无损耗
firewalld管不住映射的端口正常生效

host 模式下 ports 段没用

compose 里写了 network_mode: hostports: 段会被忽略。监听地址完全由容器里的程序自己决定。想改端口得改程序的配置,改 compose 没意义。

1Panel 装的 OpenResty 就是 host 模式,.env 里的端口变量只影响它生成站点配置时的默认值。

容器内访问宿主机

bridge 模式下容器里的 127.0.0.1 不是宿主机。要访问宿主机上的服务:

  • host.docker.internal(Docker Desktop 自带;Linux 上要加 extra_hosts: ["host.docker.internal:host-gateway"]
  • 或者用 Docker 网络的网关地址:
bash
docker network inspect bridge | grep -i gateway

默认 bridge 通常是 172.17.0.1,但自定义网络的网关不一定,要查。

容器之间

同一个 compose 文件里的服务默认在同一个网络,用服务名当主机名互相访问:

yaml
services:
  app:
    environment:
      DATABASE_URL: postgres://db:5432/app
  db:
    image: postgres

不同 compose 项目要互通,建一个外部网络:

bash
docker network create shared
yaml
networks:
  shared:
    external: true

两边都加入它。

只在本机暴露

yaml
ports:
  - "127.0.0.1:3000:3000"

不写 127.0.0.1 默认绑 0.0.0.0,而且 firewalld 拦不住。

个人笔记,写给未来忘事的自己。