我怎样才能让我的所有 Docker 容器使用我的代理?

我怎样才能让我的所有 Docker 容器使用我的代理?

我在 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 和透明代理。

https://github.com/silarsis/docker-proxy

答案2

配置 Docker 客户端官方文档展示了如何轻松解决这个问题。

编辑~/.docker/config.json(或%USERPROFILE%\.docker\config.json)文件并添加以下 JSON 代码片段:

{
    "proxies": {
        "default": {
            "httpProxy": "http://localhost:3128",
            "httpsProxy": "https://localhost:3128"
        }
    }
}

这解决了我在apt udpatedebian docker 容器内运行失败的问题。在该 json 文件中添加代理设置并启动新的 docker 容器后,它apt update开始工作。

相关内容