在 Docker 中,容器默认使用独立的网络命名空间,但有时我们需要让容器直接使用宿主机的网络栈。以下是几种实现方式:
--network host
参数最简单的方法是运行容器时指定 --network host
参数:
docker run --network host image_name
这样容器将直接使用宿主机的网络栈:
- 容器内的网络接口与宿主机相同
- 容器直接绑定宿主机的端口(无需 -p
参数映射)
- 容器可以直接访问宿主机上的所有网络服务
在 docker-compose.yml
文件中可以这样配置:
version: '3'
services:
your_service:
network_mode: "host"
# 其他配置...
如果只需要共享特定网络接口而不是全部,可以使用 --network container:<name|id>
:
docker run --network container:another_container image_name
安全性:使用宿主机网络会降低容器隔离性,容器内的进程可以直接访问宿主机的网络服务。
端口冲突:容器应用绑定的端口会直接占用宿主机端口,可能导致冲突。
性能:对于高网络吞吐量应用,host 网络模式性能更好,因为避免了网络地址转换(NAT)。
DNS 解析:在 host 网络模式下,容器的 DNS 解析会使用宿主机的配置。
多网卡环境:在宿主机有多个网络接口的情况下,容器可以访问所有接口。
如果只需要访问宿主机服务而不需要完全共享网络栈,可以考虑:
- 使用 --add-host
添加宿主机条目
- 使用特殊 DNS 名称 host.docker.internal
(Docker Desktop 支持)
- 使用默认的 bridge 网络并通过 -p
参数暴露端口