一个 docker 容器可接入多个网络以获得多个网络接口,但需通过 docker network connect 动态添加或 docker compose 声明,不能单次 docker run 指定全部;自定义 bridge 网络支持固定 ip 和 dns 配置,而默认 bridge 不支持。

一个 Docker 容器可以同时接入多个网络,从而拥有多个网络接口(如 eth0、eth1 等),但不能靠单次 docker run 直接指定全部——必须分步操作或借助 Compose 显式声明。核心在于:Docker 本身不提供“多网卡”抽象,而是通过让容器加入多个网络,由内核自动为其创建对应接口。
用 docker network connect 动态添加网络
这是最常用、最稳妥的方式,适合已运行的容器:
- 先创建两个自定义 bridge 网络(带子网):
docker network create --driver=bridge --subnet=172.20.0.0/24 net-adocker network create --driver=bridge --subnet=172.21.0.0/24 net-b - 启动容器并接入第一个网络:
docker run -d --name app --network net-a --ip 172.20.0.10 nginx - 再将其连接到第二个网络(可选指定 IP):
docker network connect --ip 172.21.0.5 net-b app - 进入容器验证:
docker exec app ip a→ 会看到两个 IPv4 地址,分别属于不同子网,对应 eth0 和 eth1(或类似命名)
用 Docker Compose 声明多个网络
适合批量部署和配置固化,结构清晰:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 在
docker-compose.yml中定义多个网络,并为服务指定接入列表:services:<br> web:<br> image: nginx<br> networks:<br> - net-a<br> - net-b<br>networks:<br> net-a:<br> driver: bridge<br> ipam:<br> config:<br> - subnet: 172.20.0.0/24<br> net-b:<br> driver: bridge<br> ipam:<br> config:<br> - subnet: 172.21.0.0/24
- 运行
docker-compose up后,web 容器会自动获得两个网络接口 - 注意:若需固定 IP,可在 service 下加
ipv4_address(仅对支持 IPAM 的网络生效)
手动注入 veth 设备(高级场景)
适用于需要精细控制底层网络设备的情况(如模拟物理多网卡、对接 TAP 或 VLAN):
- 获取容器 PID:
pid=$(docker inspect -f '{{.State.Pid}}' app) - 创建 veth pair:
ip link add veth0 type veth peer name veth1 - 将 veth1 移入容器命名空间:
ip link set veth1 netns $pid - 在容器内重命名并启用:
nsenter -t $pid -n ip link set veth1 name eth1 && nsenter -t $pid -n ip link set eth1 up - 手动配 IP(如
nsenter -t $pid -n ip addr add 192.168.100.2/24 dev eth1)
关键注意事项
实际使用中容易忽略但影响功能的关键点:
- 容器默认只有一条默认路由,通常来自第一个非 internal 网络;跨网通信需手动加路由或调整 metric
- DNS 解析按网络连接顺序生效,最后接入的网络其 DNS 配置优先级最高
-
--network host模式下容器无独立网络命名空间,无法添加额外网络接口 - 默认 bridge 网络(docker0)不支持
--ip和容器名解析,务必用自定义 bridge










