我在Debian Jessie上运行docker,它是公司代理的幕后黑手。为了能够下载泊坞窗图像,我需要将以下内容添加到我的/etc/defaults/docker
http_proxy="http://localhost:3128/"
我可以确认这是有效的。
但是,为了能够从容器中访问interwebz,我需要使用--net host
启动所有会话,然后设置这些env变量:
export http_proxy=http://localhost:3128/
export https_proxy=https://localhost:3128/
export ftp_proxy=${http_proxy}
理想情况下,我希望容器不需要主机网络,而不知道代理(即容器中端口20,80,443的所有出站呼叫都通过主机的代理端口进行)。这可能吗?
如果失败了,是否可以进行站点设置,这将确保这些env变量在本地设置但从未作为图像的一部分导出?我知道我可以用--env http_proxy=...
等传递这些东西,但这很笨拙。我希望它能够为系统上的所有用户工作,而不必使用别名。
(免责声明:我在https://superuser.com/posts/890196上问了这个问题,但目前docker
问题的主页有点模棱两可。)
答案 0 :(得分:7)
主机服务器运行一个运行代理的容器(在本例中为squid),可以执行透明代理。该容器有一些iptables规则,NAT流量进入代理服务器 - 这意味着容器需要以特权模式运行。
主机服务器还包含(并且这里是神奇的)ip路由表条目,它通过代理容器重新路由来自任何容器的所有流量,但是发往目的地为80的代理。
最后一点基本上意味着对于端口80流量,从容器到世界其他地方的路由通过代理容器 - 给它机会NAT和透明代理。