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

如何让Docker容器访问主机的非默认路由私有网络?

解决Docker容器无法访问私有非默认路由网络的问题

你的核心问题在于:Docker默认桥接网络(docker0)的流量会优先走主机的默认路由(指向公网网关189.69.77.1),但私有网段192.168.77.0/24的路由规则只在主机层面生效,容器的网络栈并不知道该如何到达这个私有网段,所以才会出现能ping通主机私有IP,却无法访问同网段其他主机的情况。

下面是几个针对性的解决方案,按规范程度排序:

方案1:创建自定义Docker桥接网络(推荐)

这种方式不会干扰Docker默认网络,还能给自定义网络单独配置路由规则:

  1. 先创建一个自定义桥接网络:
docker network create --driver bridge --subnet 172.18.0.0/16 custom-private-net
  1. 在主机上添加路由规则,让自定义网络的流量访问192.168.77.0/24时,走主机的私有接口enp0s31f6.4000
ip route add 192.168.77.0/24 via 192.168.77.21 dev enp0s31f6.4000 src 172.18.0.1
  1. 使用这个自定义网络启动你的容器:
docker run -d --restart=unless-stopped --network custom-private-net -p 127.0.0.1:3000:3000/tcp --name mongoclient -e MONGOCLIENT_DEFAULT_CONNECTION_URL=mongodb://192.168.77.21:27017,192.168.77.40:27017,192.168.77.41:27017/graylog?replicaSet=ars0 -e ROOT_URL=http://192.168.77.21/nosqlclient mongoclient/mongoclient

方案2:修改Docker默认网桥的路由规则

如果你不想新增自定义网络,可以直接给默认的docker0网桥添加路由:

  1. 先确认docker0的网关IP(通常是172.17.0.1):
ip addr show docker0
  1. 添加路由规则,让docker0的流量访问私有网段时走主机私有接口:
ip route add 192.168.77.0/24 via 192.168.77.21 dev enp0s31f6.4000 src 172.17.0.1
  1. 重启Docker服务让路由生效:
systemctl restart docker

方案3:使用Host网络模式(快速但不推荐)

这种方式让容器直接复用主机的网络栈,无需配置路由,但会失去容器网络的隔离性:

修改启动命令,添加--network host参数(注意去掉原有的端口映射参数,因为容器会直接使用主机端口):

docker run -d --restart=unless-stopped --network host --name mongoclient -e MONGOCLIENT_DEFAULT_CONNECTION_URL=mongodb://192.168.77.21:27017,192.168.77.40:27017,192.168.77.41:27017/graylog?replicaSet=ars0 -e ROOT_URL=http://192.168.77.21/nosqlclient mongoclient/mongoclient

提示:如果需要限制容器端口只能被本地访问,可以通过NGINX代理或者容器内部的应用配置来实现。

验证配置效果

启动容器后,进入容器测试连通性:

docker exec -it mongoclient ping 192.168.77.40

如果能ping通,再测试MongoDB连接是否正常即可。

另外,你的现有iptables规则已经允许Docker相关的转发流量,无需额外修改;如果还是有问题,可以临时关闭防火墙排查:

systemctl stop firewalld

内容的提问来源于stack exchange,提问作者Jan Doberstein

火山引擎 最新活动