使用每个主机/ URL的代理配置Docker

时间:2019-03-15 19:46:08

标签: docker http-proxy docker-toolbox https-proxy-agent

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

1 个答案:

答案 0 :(得分:0)

由于Pierre B. mentionedDocker daemon不支持基于URL的代理选择,因此解决方案是将其指向配置为根据URL选择正确的上游代理的本地代理

尽管任何能够进行上游选择的HTTP [S]代理都能做到,(pac4cli项目特别有趣,因为它具有广告宣传的基于大多数Web浏览器使用的proxy-auto-discovery协议选择上游的能力。公司设置),我选择使用tinyproxy作为更成熟,更轻巧的解决方案。此外,我决定在docker-machine VM内运行代理,以简化其部署,并确保在Docker守护程序需要代理时,代理始终处于运行状态。

以下是我用来设置系统的步骤。我特别感谢phoenixsteps提供了在企业代理后面在Windows上设置Docker Toolbox的良机,并将从该答案中大量借鉴。

从现在开始,我将使用PATH中的docker作为Docker Quickstart TerminalGitBash,将docker作为命令行控制台,并且“用户名”是Windows用户名。 / p>

步骤1:在目标平台上构建tinyproxy

从拉起一个干净的Linux发行版开始,我使用了CentOS,并在其中运行bash

docker run -it --name=centos centos bash

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

yum install -y make gcc

此后,我们从Tinyproxy的GitHub存储库中提取latest release,并将其提取到根目录的主目录中(在撰写本文时,最新版本为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 退出容器,并将可执行文件复制到可从docker-machine VM访问的特殊文件夹位置:

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

用Windows用户名替换“用户名”。请注意,要禁用MINGW路径转换,必须在“ root”前加上双斜杠{//

现在我们可以删除容器:

docker rm centos

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

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

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

docker-machine rm -f default

接下来,我们为本地主机和我们选择的端口重新创建默认的机器设置HTTP_PROXYHTTPS_PROXY环境变量,然后刷新我们的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环境变量来列出守护程序应绕过代理直接连接到的主机和/或通配符(以;分隔)。

步骤3:在tinyproxy虚拟机中设置docker-machine

首先,我们将在/c/Users/username目录中创建两个文件(这是我们的tinyproxy二进制文件应位于上面的步骤1 之后的位置),然后将其复制到虚拟机。

第一个文件是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将用于连接所有其他URL

还可以匹配确切的主机名,IP地址,子网和不带域的主机。

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

#! /bin/sh

# Terminate on error
set -e

# Switch to the script directory
cd $(dirname $0)

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

现在,让我们连接到Docker VM,获取root权限,并切换到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提取图像和推送图像。