Настройте Docker с прокси на хост / URL
Я использую Docker Toolbox на Windows 7 в корпоративной среде. Мой рабочий процесс требует извлечения контейнеров из одного артефакта и переноса их в другой (например, внешний и внутренний). Каждому артефакту необходим отдельный прокси для доступа к нему. Есть ли способ настроить демон Docker для выбора прокси на основе URL? Или, если нет, что еще я могу сделать, чтобы эта работа?
1 ответ
Поскольку, как упоминал Пьер Б., демон Docker не поддерживает выбор прокси на основе URL-адреса, решение состоит в том, чтобы указать ему локальный прокси-сервер, настроенный для выбора правильного прокси-сервера восходящего потока на основе URL-адреса.
В то время как любой HTTP[S] прокси, способный к выбору восходящего потока, подойдет (проект pac4cli особенно интересен тем, что рекламирует возможность выбора восходящего потока на основе протокола автообнаружения прокси, используемого большинством веб-браузеров a в корпоративных настройках), выбрал для использования tinyproxy, как более зрелое и легкое решение. Кроме того, я решил запустить свой прокси внутри docker-machine
ВМ, чтобы упростить ее развертывание и убедиться, что прокси-сервер всегда работает, когда это нужно демону Docker.
Ниже приведены шаги, которые я использовал для настройки моей системы. Я особенно благодарен phoenix за то, что он предоставил шаги по настройке 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
очевидно требуется, отключение других функций по умолчанию не является обязательным, но это хорошая практика. Чтобы убедиться, что это действительно работает, запустите:
./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 на локальный порт прокси
Выберите номер порта TCP для запуска прокси. Это может быть любой порт, который не используется на docker-machine
VM. Я буду использовать номер 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
внутри 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
будет использоваться для подключения к URL-адресам, заканчивающимся на "foo.example.com", напримерhttp://www.foo.example.com
http://proxy2.corp.example.com:80
будет использоваться для подключения к URL-адресам, заканчивающимся на "bar.example.com", таким какhttp://www.bar.example.com
, а такжеhttp://proxy.corp.example.com:80
будет использоваться для подключения всех других URL
Также возможно сопоставить точные имена хостов, 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
Теперь давайте подключимся к виртуальной машине 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
Выйдите из сеанса VM, дважды нажав Ctrl + D, и перезапустите его:
docker-machine restart default
Это оно! Сейчас docker
должен иметь возможность вытягивать и выдвигать изображения с разных URL-адресов, автоматически выбирая нужный прокси-сервер.