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

使用每个主机/url的代理配置Docker,docker,http-proxy,docker-toolbox,https-proxy-agent,Docker,Http Proxy,Docker Toolbox,Https Proxy Agent,我在公司环境中使用Windows7上的Docker工具箱。我的工作流程需要从一个工件中提取容器并将其推送到另一个工件(例如外部和内部)。每个工件都需要一个不同的代理来访问它。有没有一种方法可以配置Docker守护进程以基于URL选择代理?或者,如果没有,我还能做些什么来实现这一点?因为Pierre B不支持基于URL的代理选择,所以解决方案是将其指向配置为基于URL选择适当上游代理的本地代理 虽然任何能够进行上游选择的HTTP[S]代理都可以(该项目特别有趣,因为它宣传的基于公司环境中大多数We

我在公司环境中使用Windows7上的Docker工具箱。我的工作流程需要从一个工件中提取容器并将其推送到另一个工件(例如外部和内部)。每个工件都需要一个不同的代理来访问它。有没有一种方法可以配置Docker守护进程以基于URL选择代理?或者,如果没有,我还能做些什么来实现这一点?

因为Pierre B不支持基于URL的代理选择,所以解决方案是将其指向配置为基于URL选择适当上游代理的本地代理

虽然任何能够进行上游选择的HTTP[S]代理都可以(该项目特别有趣,因为它宣传的基于公司环境中大多数Web浏览器使用的协议选择上游的功能),但我选择使用它作为更成熟、更轻量的解决方案。此外,我决定在
docker机器
虚拟机中运行我的代理,以简化其部署,并确保代理在docker守护进程需要时始终运行

下面是我用来设置系统的步骤。我特别感谢您在公司代理的背后提供了在Windows上设置Docker Toolbox的功能,并将从这个答案中获得大量帮助

从这一点开始,我将假设或者,在docker位于
路径中的情况下,作为您的命令行控制台,“username”是您的Windows用户名

步骤1:在目标平台上构建
tinyproxy
从我使用的一个干净的Linux发行版开始,并在其中运行
bash

docker run -it --name=centos centos bash
接下来,安装我们需要的工具:

yum install -y make gcc
之后,我们从Tinyproxy的GitHub存储库中提取Tinyproxy的版本,并将其解压缩到root的主目录中(撰写本文时,最新版本是1.10.0):

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

./configure --enable-upstream \
    --disable-filter\
    --disable-reverse\
    --disable-transparent\
    --disable-xtinyproxy
make
虽然显然需要启用上游功能,但禁用其他默认功能是可选的,但这是一种很好的做法。要确保它实际工作,请运行:

./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/>.
用您的Windows用户名替换“用户名”。请注意,禁用MINGW路径转换需要在“root”之前加上双斜杠-
/

现在我们可以删除容器:

docker rm centos
步骤2:将docker守护程序指向本地代理端口 选择要在其上运行代理的TCP端口号。这可以是未在
docker机器上使用的任何端口。在这个例子中,我将使用数字8618

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

docker-machine rm -f default
接下来,我们为本地主机和所选端口重新创建默认机器设置
HTTP\u PROXY
HTTPS\u 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机器
VM 首先,我们将在
/c/Users/username
目录中创建两个文件(这是我们的
tinyproxy
二进制文件在上述步骤1之后应该驻留的位置),然后我们将它们复制到VM

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

#这些设置可以根据您的喜好定制,
#但端口必须与步骤2中使用的端口相同
听127.0.0.1
端口8618
用户无人
群非群
对数级临界
系统登录
maxclients 50
startservers 2
minspareServers 2
maxspareServers 5
可禁用标题是
#这是实际的代理选择,规则从顶部开始应用
#到底部,最后一个是默认值。更多有关:
# https://tinyproxy.github.io/
上游http proxy1.corp.example.com:80“.foo.example.com”
上游http proxy2.corp.example.com:80“.bar.example.com”
上游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

#/垃圾箱/垃圾箱
#错误终止
set-e
#切换到脚本目录
cd$(目录名$0)
#启动代理服务器
./tinyproxy-c tinyproxy.conf
现在,让我们连接到docker VM,获取根目录,并切换到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自动拉和推图像,选择正确的代理服务器。

我认为仅使用docker是不可能的。在从外部工件触发之前设置一个代理,然后设置另一个代理以推送到另一个工件,这有什么不对?对于包装器脚本,这可能是一个合适的解决方案。考虑到这一点,我知道使用Docker Toolbox执行此操作的唯一方法是使用ssh连接到Docker机器,编辑boot2docker shell脚本,然后运行
Docker机器重新启动
。不是很方便每次你想要推/拉一个工件,更不用说它会杀死所有正在运行的容器。这是另一条路吗?
cp /c/Users/username/boot2docker/{tinyproxy{,.conf},bootlocal.sh} .
chmod 755 tinyproxy bootlocal.sh
chmod 644 tinyproxy.conf
docker-machine restart default