我的 docker 容器中有一些应用程序发出 http(s) 请求。我该如何配置容器,让所有这些请求都通过外部 http 代理?
Docker 文档建议设置HTTP_PROXY
环境变量,但是,据我了解,这是一个建议设置,容器中的应用程序不会强制使用它。
我无法更改主机系统上的任何内容,因此我正在寻找一些巧妙的 docker 或容器操作系统配置。容器操作系统是 ubuntu:18.04。
答案1
如果要强制使用代理,则需要在网络级别拦截流量。这总是有缺点,因为您需要通过受信任的 CA 扮演中间人角色,因此 HTTPS 流量不容易被拦截。
如果 HTTPS 不是问题(因为您决定忽略它,或者因为您决定将自己的 CA 部署到每个容器的证书信任存储区),那么想到几个拦截流量的位置:
- Docker 主机系统(又称容器的默认网关)
- docker 主机系统的默认网关
无论哪种情况,您都需要利用iptables
(或类似的防火墙工具集)来重定向来自您的容器的流量port 80
(443
如果是 HTTPS)以通过代理进行重定向。
使用iptables
它可能看起来像
sudo iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3129
3129
例如,SQUID 可能监听 http 连接的端口在哪里。
更多信息可以在 SQUID 配置示例中找到:https://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect
答案2
设置环境变量会强制容器内的所有应用程序使用配置的代理。
docker run 示例:
--env HTTP_PROXY="http://127.0.0.1:3001"
--env HTTPS_PROXY="https://127.0.0.1:3001"