Настраиваем прокси сервер на платформе Docker
Пошаговое руководство по настройке прокси-сервера в Docker через командную строку (CLI) и конфигурационный файл config.json. Зачем нужен Docker прокси.
Олександр Л.
Настройка прокси сервера может потребоваться на платформе Docker в ряде случаев. Самыми распространёнными являются обход лимитов веб-провайдера и проведение тестов разработанного вами ПО во многих геолокациях. Начнём с рассмотрения понятия Докера.
Что собой являет Докер
Докером называется набор продуктов, реализованных по принципу «платформа как услуга» (PaaS), которые используют виртуализацию на уровне ОС, чтобы доставлять программное обеспечение в пакетах, называемых контейнерами, то есть, производить контейнеризацию пакетов. У сервиса предусмотрены разные по оплате уровни: бесплатный и премиум с расширенными функциями. Данное программное обеспечение было выпущено в 2013 году. Иначе говоря, Докером называют платформу для разработки, доставки и запуска программного обеспечения, в которой можно отделить ваше ПО от вашей инфраструктуры. Таким образом, собранный контейнер можно запускать на разных ОС. Кроме того, вам будет приятно узнать, что платформа Docker поддерживает SSL, дающий отличную степень информационно-сетевой безопасности при работе с ней, в частности, при тестировании работы приложений. Контейнеризируемая информация содержит:
- Само ПО, запуск которого требуется разработчиком;
- Среду исполнения — виртмашину с набором минимально необходимых процессов;
- Требуемые для запуска ПО файлы;
- Сервер.
Настраиваем прокси в Докере
Имеются 2 пути настройки: посредством командной строки и используя конфиг. Работа в ком строке выглядит так:
- Поскольку вы будете использовать параметр
proxy.example.com:Port, вам надо узнать айпи адрес своего proxy и используемый port. - В ком строке пишем команду
docker build, которая создаёт конфиг. В ней необходимо использовать аргумент--build-arg. Полная команда будет выглядеть таким образом: Bashdocker build --build-arg HTTP_PROXY="http://proxy.example.com:Port" . - Затем в командной же строке вводим команду
docker runдля запуска созданного конфига. Необходимо использовать аргумент--env. Полная команда будет выглядеть следующим образом: Bashdocker run --env HTTP_PROXY="http://proxy.example.com:Port" redis
Настройка Docker прокси с помощью конфига выглядит так:
- В рабочей директории находите папку
.docker. В ней должен быть файл, названныйconfig.json. Создайте его в случае отсутствия. - В файле, используя нравящийся вам кодовый редактор, вводите строки:
JSON
{ "proxies": { "default": { "httpProxy": "http://proxy.example.com:Port", "httpsProxy": "https://proxy.example.com:Port", "ftpProxy": "https://proxy.example.com:Port", "noProxy": "*.test.example.com,.example.org,127.0.0.0/8" } } } - На месте
proxy.example.com:Portдолжны быть указаны данные вашего айпи и port, как и в примере с ком строкой. - В файле конфига, как видно из кода выше, вы можете использовать 4 варианты прокси:
- HttpProxy — для http варианта с отсутствующим шифрованием;
- HttpsProxy — для https варианта с имеющимся шифрованием;
- ftpProxy — для ftp варианта с целью передачи файлов, используя ftp;
- noProxy — для направления прямого трафика.
Аналогичные варианты прокси вы должны использовать и при работе с ком строкой, зависимо от того, каков ваш прокси. После сохранения файла конфига docker proxy, указанные вами сведения будут применяться ко всем новым контейнерам и для уже готовых контейнеров, загружаемых из репозитория Докера.
Популярные вопросы
Как настроить авторизацию (логин и пароль) для прокси в Docker?
Если ваши прокси требуют аутентификации по логину и паролю, их необходимо добавить напрямую в URL-адрес прокси внутри конфигурационного файла или команды. Формат записи выглядит так: http://username:[email protected]:Port. Обратите внимание: если пароль содержит спецсимволы (например, @, :, /), их нужно закодировать в формате URL-encode.
Почему после изменения config.json текущие запущенные контейнеры не используют прокси?
Конфигурация, прописанная в файле ~/.docker/config.json, применяется в качестве параметров окружения (environment variables) исключительно в момент создания или запуска новых контейнеров. Уже запущенные контейнеры не могут динамически считывать изменения из этого файла. Чтобы они начали работать через прокси, их необходимо остановить, удалить и запустить заново.
Как настроить прокси не для контейнеров, а для самого демона Docker (чтобы скачивать образы)?
Для того чтобы сам Docker мог скачивать образы (выполнять docker pull) через прокси, пользовательских настроек в config.json недостаточно. Требуется настроить прокси для системной службы (Docker daemon). В системах Linux это делается через создание конфигурационного файла по пути /etc/systemd/system/docker.service.d/http-proxy.conf с указанием переменных окружения HTTP_PROXY и HTTPS_PROXY, после чего нужно перезапустить службу командой systemctl restart docker.
Что делать, если контейнеру нужен доступ к локальным сервисам в обход прокси?
Для этого используется параметр noProxy в файле конфигурации или аргумент --env NO_PROXY="...". В нем через запятую указываются доменные имена, хосты или подсети, трафик к которым должен идти напрямую. Обязательно добавляйте туда значения localhost, 127.0.0.1, а также маску внутренней сети вашего Docker-окружения, чтобы не заблокировать межконтейнерное взаимодействие.
Можно лРаботают ли SOCKS5 прокси в конфигурации Docker?и настроить разные прокси для разных контейнеров одновременно?
Да. Файл config.json задает дефолтные (глобальные) настройки для всех контейнеров. Если вам нужно, чтобы определенный контейнер работал через другие прокси, просто переопределите переменные окружения прямо во время его запуска с помощью ключей -e HTTP_PROXY="..." и -e HTTPS_PROXY="..." в команде docker run. Параметры командной строки имеют более высокий приоритет.
Работают ли SOCKS5 прокси в конфигурации Docker?
Официально Docker в файле config.json ожидает параметры httpProxy и httpsProxy. Тем не менее, многие современные инструменты и базовые образы поддерживают протокол SOCKS5, если указать его в схеме URL: socks5://proxy.example.com:Port или socks5h://... (чтобы DNS-запросы также шли через прокси). Если какой-то конкретный софт внутри контейнера не поддерживает socks, придется использовать сторонние утилиты для конвертации трафика (например, proxychains или privoxy).
