外观
host 与 bridge 网络
两种模式的差别
bridge(默认) | host | |
|---|---|---|
| 容器 IP | 独立,172.x 网段 | 和宿主机一样 |
| 端口映射 | 需要 ports: | 没有,容器监听什么宿主机就是什么 |
容器内 127.0.0.1 | 容器自己 | 宿主机 |
| 性能 | 多一层 NAT | 无损耗 |
| firewalld | 管不住映射的端口 | 正常生效 |
host 模式下 ports 段没用
compose 里写了 network_mode: host,ports: 段会被忽略。监听地址完全由容器里的程序自己决定。想改端口得改程序的配置,改 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 sharedyaml
networks:
shared:
external: true两边都加入它。
只在本机暴露
yaml
ports:
- "127.0.0.1:3000:3000"不写 127.0.0.1 默认绑 0.0.0.0,而且 firewalld 拦不住。