我在企业环境中使用 Windows 7 上的 Docker Toolbox。我的工作流程需要从一个工件中提取容器并将它们推送到另一个工件(例如外部和内部)。每个工件都需要不同的代理来访问它。有没有办法配置 Docker 守护程序以根据 URL 选择代理?或者,如果没有,我还能做些什么来完成这项工作?
1 回答
由于 Pierre B.提到,Docker 守护进程不支持基于 URL 的代理选择,因此解决方案是将其指向一个本地代理,该代理配置为根据 URL 选择正确的上游代理。
虽然任何能够选择上游的 HTTP[S] 代理都可以,(pac4cli项目特别有趣,因为它宣传了基于大多数 Web 浏览器在企业环境中使用的代理自动发现协议选择上游的能力),我已经选择使用tinyproxy,作为更成熟和轻量级的解决方案。此外,我决定在docker-machine
VM 中运行我的代理,以简化其部署并确保代理始终在 Docker 守护进程需要它时运行。
以下是我用来设置系统的步骤。我特别感谢phoenix提供了在公司代理后面的 Windows 上设置 Docker Toolbox 的步骤,并将大量借鉴该答案。
从这一点开始,我将假设Docker Quickstart Terminal或GitBash,其中dockerPATH
作为您的命令行控制台,并且“用户名”是您的 Windows 用户名。
第 1 步:tinyproxy
在您的目标平台上构建
从提取一个干净的 Linux 发行版开始,我使用CentOS并bash
在其中运行:
docker run -it --name=centos centos bash
接下来,安装我们需要的工具:
yum install -y make gcc
之后,我们从它的 GitHub 存储库中提取最新版本的 Tinyproxy,并将其提取到 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并将可执行文件复制到可从docker-machine
VM 访问的特殊文件夹位置:
docker cp centos://root/tinyproxy-1.10.0/src/tinyproxy \
/c/Users/username/tinyproxy
用您的 Windows 用户名替换“用户名”。请注意,双斜杠 -//
在“root”之前需要禁用 MINGW 路径转换。
现在我们可以删除容器:
docker rm centos
第 2 步:将 docker daemon 指向本地代理端口
选择一个 TCP 端口号来运行代理。这可以是docker-machine
VM 上未使用的任何端口。在此示例中,我将使用数字 8618。
首先,让我们删除现有的默认 Docker VM:
警告:这将永久删除所有当前存储的容器和图像
docker-machine rm -f default
HTTP_PROXY
接下来,我们将默认机器设置和环境变量重新创建HTTPS_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
目录中创建两个文件(这是我们的二进制文件在上述步骤 1tinyproxy
之后应该驻留的位置),然后我们将它们复制到 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
将用于连接所有其他 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 虚拟机,获取 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 拉取和推送图像。