根据 host/url 使用代理配置 Docker

Configure Docker with proxy per host/url

我在公司环境中 Windows 7 上使用 Docker Toolbox。我的工作流程需要从一个工件中拉出容器并将它们推送到另一个工件(例如外部和内部)。每个工件都需要不同的代理来访问它。有没有一种方法可以将 Docker 守护程序配置为基于 URL 的 select 代理?或者,如果没有,我还能做些什么来完成这项工作?

由于 Pierre B., Docker daemon 不支持基于 URL 的代理 selection,解决方案是将其指向配置为 select 的本地代理] 基于 URL.

的正确上游代理

虽然任何能够上游 selection 的 HTTP[S] 代理都可以,(pac4cli project being particularly interesting for it's advertised capability to select the upstream based on proxy-auto-discovery protocol used by most Web browsers a in corporate setting), I've chosen to use tinyproxy 作为更成熟和轻量级的解决方案。此外,我决定 运行 我的代理在 docker-machine VM 中,以简化它的部署并确保代理在 Docker 守护程序需要时始终处于 运行ning 状态。

以下是我用来设置系统的步骤。我特别感谢 phoenix for providing steps 在公司代理后面的 Windows 上设置了 Docker 工具箱,并将大量借鉴该答案。

从现在开始,我将假设 Docker Quickstart Terminal or GitBashPATH 中的 docker 作为您的命令行控制台,并且 "username" 是您的 [=140] =] 用户名.

第 1 步:在您的目标平台上构建 tinyproxy

首先拉出一个干净的 Linux 分布,我使用了 CentOS 和 运行 bash 在里面:

docker run -it --name=centos centos bash

接下来,安装我们需要的工具:

yum install -y make gcc

之后,我们从它的 GitHub 存储库中提取 Tinyproxy 的 latest release,并将其解压缩到 root 的主目录中(在撰写本文时,最新版本是 1.10.0):

cd
curl -L https://github.com/tinyproxy/tinyproxy/releases/download/1.10.0/tinyproxy-1.10.0.tar.gz \
    | tar -xz
cd tinyproxy-1.10.0

现在让我们配置并构建它:

./configure --enable-upstream \
    --disable-filter\
    --disable-reverse\
    --disable-transparent\
    --disable-xtinyproxy
make

虽然 --enable-upstream 显然是必需的,但禁用其他默认功能是可选的,但这是一个很好的做法。确保它确实有效 运行:

./src/tinyproxy -h

您应该看到如下内容:

Usage: tinyproxy [options]

Options are:
  -d        Do not daemonize (run in foreground).
  -c FILE   Use an alternate configuration file.
  -h        Display this usage information.
  -v        Display version information.

Features compiled in:
    Upstream proxy support

For support and bug reporting instructions, please visit
<https://tinyproxy.github.io/>.

我们按 Ctrl+D 退出容器,并将可执行文件复制到可从 [=25= 访问的特殊文件夹位置] 虚拟机:

docker cp centos://root/tinyproxy-1.10.0/src/tinyproxy \
    /c/Users/username/tinyproxy

用您的 Windows 用户名替换 "username"。请注意,"root" 之前的双斜杠 - // 是禁用 MINGW 路径转换所必需的。

现在我们可以删除容器了:

docker rm centos

第 2 步:将 docker 守护程序指向本地代理端口

选择 运行 代理的 TCP 端口号。这可以是 docker-machine VM 上未使用的任何端口。我将在此示例中使用数字 8618。

首先,让我们删除现有的默认Docker VM:
警告:这将永久删除所有当前存储的容器和图像

docker-machine rm -f default

接下来,我们重新创建默认机器设置 HTTP_PROXYHTTPS_PROXY 环境变量到本地主机和我们 selected 的端口,然后刷新我们的 shell环境:

docker-machine create default \
    --engine-env HTTP_PROXY=http://localhost:8618 \
    --engine-env HTTPS_PROXY=http://localhost:8618
eval $(docker-machine env)

可选地,我们还可以设置 NO_PROXY 环境变量来列出主机 and/or 通配符(由 ; 分隔),守护程序应该绕过代理直接连接到这些主机。

第 3 步:在 docker-machine VM

中设置 tinyproxy

首先,我们将在 /c/Users/username 目录中创建两个文件(这是我们的 tinyproxy 二进制文件在上述 第 1 步 之后应该驻留的位置)然后我们会将它们复制到 VM。

第一个文件是 tinyproxy.conf,确切的语法在 Tinyproxy 网站上有记录,但下面的例子应该有所有需要的设置:

# These settings can be customized to your liking,
# the port though must be the same we used in Step 2

listen 127.0.0.1
port 8618

user nobody
group nogroup
loglevel critical
syslog on

maxclients 50
startservers 2
minspareServers 2
maxspareServers 5

disableviaheader yes

# Here is the actual proxy selection, rules apply from top
# to bottom, and the last one is the default. More info on:
# https://tinyproxy.github.io/

upstream http proxy1.corp.example.com:80 ".foo.example.com"
upstream http proxy2.corp.example.com:80 ".bar.example.com"
upstream http proxy.corp.example.com:82

在上面的例子中:

  • http://proxy1.corp.example.com:80将用于连接以"foo.example.com"结尾的URL,例如http://www.foo.example.com
  • http://proxy2.corp.example.com:80将用于连接以"bar.example.com"结尾的URL,例如http://www.bar.example.com
  • http://proxy.corp.example.com:80 将用于连接所有其他 URLs

也可以在没有域的情况下匹配准确的主机名、IP 地址、子网和主机。

第二个文件是将启动代理的 shell 脚本,其名称必须是 bootlocal.sh:

#! /bin/sh

# Terminate on error
set -e

# Switch to the script directory
cd $(dirname [=21=])

# Launch proxy server
./tinyproxy -c tinyproxy.conf

现在,让我们连接到 docker 虚拟机,获得根目录,然后切换到 boot2docker 目录:

docker-machine ssh
sudo -s
cd /var/lib/boot2docker

接下来,我们将复制所有三个文件并设置它们的权限:

cp /c/Users/username/boot2docker/{tinyproxy{,.conf},bootlocal.sh} .
chmod 755 tinyproxy bootlocal.sh
chmod 644 tinyproxy.conf

Ctrl+D 两次退出 VM 会话并重新启动它:

docker-machine restart default

就是这样!现在 docker 应该能够自动从不同的 URL 拉取和推送图像 select 正确的代理服务器。