You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Debian环境下如何配置Docker仅使用指定网卡eth1对外提供服务?

解决Docker容器仅在指定网卡(eth1)暴露服务的问题

我明白你的需求:想让所有Docker容器的服务只通过eth1对外提供,eth0仅保留SSH访问,而且希望在服务器层面统一配置,不用逐个容器修改。之前你尝试的"ip"选项之所以无效,是因为这个配置项早已被废弃,它的作用是设置容器内部的默认IP,而非限制主机端口的绑定范围。

下面给你两个可行的解决方案,按推荐程度排序:

方案1:使用iptables规则统一限制(最简洁可靠)

虽然你觉得这是权宜之计,但实际上这是在主机层面实现统一限制的最直接方法,而且完全符合你的需求。我们只需添加一条规则,阻止所有发往eth0的非SSH流量,同时不影响Docker的正常网络转发:

  1. 临时添加规则(立即生效,重启后失效):
iptables -I DOCKER-USER -i eth0 ! -p tcp --dport 22 -j DROP

这条规则会插入到Docker的DOCKER-USER规则链最前面,拒绝所有来自eth0的、非22端口(SSH)的流量,容器服务自然只能通过eth1访问。

  1. 持久化规则(重启后依然生效):
    安装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

火山引擎 最新活动