Поскольку, как упоминал Пьер Б. , Docker Daemon , не поддерживает выбор прокси на основе URL, решение состоит в том, чтобы указать ему локальный прокси, настроенный для выбора правильного восходящего потока.прокси на основе URL.
В то время как любой HTTP [S] прокси, способный к выбору восходящего потока, подойдет, ( pac4cli проект особенно интересен тем, что рекламируется возможность выбора восходящего потока на основе proxy-auto-discovery протокол, используемый большинством веб-браузеров (в корпоративных условиях), я решил использовать tinyproxy , как более зрелое и легкое решение.Кроме того, я решил запустить свой прокси-сервер внутри виртуальной машины docker-machine
, чтобы упростить его развертывание и убедиться, что прокси-сервер всегда работает, когда это нужно демону Docker.
Ниже приведены шаги, которые я использовал длянастроить мою систему.Я особенно благодарен Феникс за предоставление шагов для настройки Docker Toolbox на Windows за корпоративным прокси-сервером и буду сильно заимствовать из этого ответа.
Из этогоВ этом случае я приму Docker Quickstart Terminal или GitBash , с докером в PATH
, в качестве консоли командной строки, а "username" - это ваше имя пользователя Windows.
Шаг 1: Сборка tinyproxy
на целевой платформе
Начните с извлечения чистого дистрибутива Linux, я использовал CentOS и запустил bash
внутри него:
docker run -it --name=centos centos bash
Далее установите необходимые инструменты:
yum install -y make gcc
После этого мы извлекаем последний выпуск Tinyproxy из его репозитория GitHub и извлекаем его из дома 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
явно требуется,отключение других функций по умолчанию не является обязательным, но Gooбуду практиковаться.Чтобы убедиться, что он действительно работает, запустите:
./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
Замените «username» на свое имя пользователя Windows.Обратите внимание, что для отключения преобразования пути MINGW требуется двойная косая черта - //
перед «root».
Теперь мы можем удалить контейнер:
docker rm centos
Шаг 2: Направьте демон docker налокальный порт прокси
Выберите номер порта TCP для запуска прокси.Это может быть любой порт, который не используется на виртуальной машине docker-machine
.В этом примере я буду использовать номер 8618.
Во-первых, давайте удалим существующую виртуальную машину Docker по умолчанию:
ПРЕДУПРЕЖДЕНИЕ: Это навсегда удалит все сохраненные в данный момент контейнеры и изображения
docker-machine rm -f default
Затем мы воссоздаем переменные окружения компьютера по умолчанию HTTP_PROXY
и HTTPS_PROXY
для локального хоста и выбранного порта, а затем обновляем нашу оболочку:
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
inside docker-machine
VM
Сначала мы создадим два файла в каталоге /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
Впример выше:
также возможно сопоставить точные имена хостов, IP-адреса, подсети и хосты без доменов.
Второй файл представляет собой сценарий оболочки, который запускает прокси, его имя должно быть bootlocal.sh
:
#! /bin/sh
# Terminate on error
set -e
# Switch to the script directory
cd $(dirname $0)
# Launch proxy server
./tinyproxy -c tinyproxy.conf
Теперь давайте подключимся к виртуальной машине докера, получим 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
Выйдите из сеанса VM, нажав Ctrl + D дважды и перезапустите его:
docker-machine restart default
Вот и все!Теперь docker
должен иметь возможность извлекать изображения из разных URL-адресов, автоматически выбирая правильный прокси-сервер.