首页 > 解决方案 > Docker Compose 忽略来自其他容器的 iptables 配置

问题描述

我支持公司代理。为了在没有设置的情况下使用来自互联网的 Docker 容器,http_proxy或者https_proxy我正在使用nclarier/redsocks docker容器。

如果我通过运行docker run --privileged=true --net=host -d ncarlier/redsocks proxy.domain.com 8080然后运行另一个容器来使用它,然后在 ubuntu 容器内docker run -it ubuntu bash执行,一切都很好。curl google.com

但是,如果我将容器与 docker-compose 一起使用,则第二个容器无法访问互联网/不使用代理服务器。

这是yaml:

version: '3'  
services:
  proxy:
    image: ncarlier/redsocks
    command: proxy.domain.com 8080
    privileged: true 
    network_mode: "host"
  othercontainer:
    image: ubuntu
    depends_on:
      - "proxy"
    network_mode: "host"
    stdin_open: true
    tty: true

Docker compose 有什么不同吗?它需要一些特殊属性吗?Nclarier/redsocks 图像使用 iptables 来路由流量,我高度怀疑这是断点。

标签: dockerdocker-composeiptables

解决方案


好吧,问题本身与它无关docker-compose,它只是浮​​出水面。

docker-compose为它启动的容器创建自己的桥接网络,即使您没有指定它。

nclarier /redsocks镜像创建 iptable 规则以通过其代理路由流量,它通过指定一个接口来实现这一点——docker0恰好是桥接网络。

如果您不指定接口,一切都很好。来自可以访问 Internet 的每个网络的所有流量都通过 redsocks 代理进行路由。

我已经为该图像创建了一个PR,并希望这对其他人也有帮助。


推荐阅读