![我怎样才能让我的所有 Docker 容器使用我的代理?](https://linux22.com/image/1444023/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E8%AE%A9%E6%88%91%E7%9A%84%E6%89%80%E6%9C%89%20Docker%20%E5%AE%B9%E5%99%A8%E4%BD%BF%E7%94%A8%E6%88%91%E7%9A%84%E4%BB%A3%E7%90%86%EF%BC%9F.png)
我在 Debian Jessie 上运行 docker,它位于公司代理后面。为了能够下载 docker 镜像,我需要将以下内容添加到我的/etc/defaults/docker
http_proxy="http://localhost:3128/"
我可以确认这是有效的。
但是,为了能够从我的容器内访问 interwebz,我需要启动所有会话,--net host
然后设置这些环境变量:
export http_proxy=http://localhost:3128/
export https_proxy=https://localhost:3128/
export ftp_proxy=${http_proxy}
理想情况下,我希望容器不需要主机网络,也不需要知道代理(即容器中对端口 20、80、443 的所有出站调用都通过主机的代理端口进行)。这可能吗?
如果不这样做,是否可以设置站点,以确保这些环境变量在本地设置但永远不会作为图像的一部分导出?
更新:我知道我可以用 etc 传递这些东西--env http_proxy=...
,但这样很笨重。我希望它对系统上的所有用户都有效,而不必使用别名。
答案1
主机服务器运行一个运行代理(在本例中为 squid)的容器,该容器可以执行透明代理。该容器有一些 iptables 规则,可将流量 NAT 到代理服务器 - 这意味着该容器需要在特权模式下运行。
主机服务器还包含(这就是神奇之处) IP 路由表条目,这些条目通过代理容器重新路由来自任何容器(代理除外)的所有流量,这些流量发往端口 80。
最后一点本质上意味着对于端口 80 流量,从容器到世界其他地方的路由要经过代理容器 - 使其有机会进行 NAT 和透明代理。
答案2
这配置 Docker 客户端官方文档展示了如何轻松解决这个问题。
编辑~/.docker/config.json
(或%USERPROFILE%\.docker\config.json
)文件并添加以下 JSON 代码片段:
{
"proxies": {
"default": {
"httpProxy": "http://localhost:3128",
"httpsProxy": "https://localhost:3128"
}
}
}
这解决了我在apt udpate
debian docker 容器内运行失败的问题。在该 json 文件中添加代理设置并启动新的 docker 容器后,它apt update
开始工作。