Debian环境下如何配置Docker仅使用指定网卡eth1对外提供服务?
我明白你的需求:想让所有Docker容器的服务只通过eth1对外提供,eth0仅保留SSH访问,而且希望在服务器层面统一配置,不用逐个容器修改。之前你尝试的"ip"选项之所以无效,是因为这个配置项早已被废弃,它的作用是设置容器内部的默认IP,而非限制主机端口的绑定范围。
下面给你两个可行的解决方案,按推荐程度排序:
方案1:使用iptables规则统一限制(最简洁可靠)
虽然你觉得这是权宜之计,但实际上这是在主机层面实现统一限制的最直接方法,而且完全符合你的需求。我们只需添加一条规则,阻止所有发往eth0的非SSH流量,同时不影响Docker的正常网络转发:
- 临时添加规则(立即生效,重启后失效):
iptables -I DOCKER-USER -i eth0 ! -p tcp --dport 22 -j DROP
这条规则会插入到Docker的DOCKER-USER规则链最前面,拒绝所有来自eth0的、非22端口(SSH)的流量,容器服务自然只能通过eth1访问。
- 持久化规则(重启后依然生效):
安装iptables-persistent包来保存规则:
apt-get install iptables-persistent
安装过程中会提示你保存当前的iptables规则,选择"是"即可。之后每次重启系统,规则都会自动加载。
方案2:Docker层面配置(自定义网桥+统一端口绑定)
如果你坚持要在Docker内部配置,可以通过自定义网桥+统一端口绑定的方式实现:
步骤1:创建自定义网桥
创建一个绑定到eth1网段的自定义网桥,指定网桥的IP地址(需与eth1同网段且未被占用):
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 my-bridge
步骤2:设置默认使用该网桥
编辑/etc/docker/daemon.json,添加以下配置,让Docker默认使用这个自定义网桥:
{ "graph": "/srv/docker", "default-network": "my-bridge" }
注意:default-network是Docker 17.06+支持的配置项,如果你的版本不支持,可以在启动容器时统一加上--network my-bridge参数,或者用Docker Compose统一配置网络。
步骤3:统一端口绑定到eth1的IP
在启动容器时,指定端口绑定到eth1的IP(192.168.1.10):
docker run -d -p 192.168.1.10:80:80 nginx
如果用Docker Compose,可以在compose文件里统一配置:
services: nginx: image: nginx ports: - "192.168.1.10:80:80" networks: - my-bridge networks: my-bridge: external: true
这样所有容器的端口都会绑定到eth1的IP,不会在eth0上暴露。
为什么之前的配置无效?
你之前在daemon.json里设置的"ip"选项是Docker早期版本的配置项,现在已经被废弃,它的作用是设置容器的默认IP地址,而非限制主机上端口的绑定范围,所以修改后没有效果。
内容的提问来源于stack exchange,提问作者knipp




