Настройте 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-адресов, автоматически выбирая нужный прокси-сервер.

Другие вопросы по тегам