Настройка Docker для работы с локальным прокси-сервером
Проблема
Я использую Synology NAS как файловый сервер, а также для запуска виртуального сервера. В моей сети настроен ограниченный доступ в глобальную сеть, и полноценный доступ в интернет осуществляется только через прокси-сервер, который также работает на этом же NAS.
Недавно я решил перенести сервис FreshRSS с хостинга на свой виртуальный сервер. Запустить и настроить сам сервис оказалось несложно, но возникла проблема с подключением к локальному прокси-серверу.
Суть проблемы: Docker-контейнер не может напрямую обратиться к сервисам, работающим на localhost хост-машины. Если бы прокси был внешним, то подключиться к нему из контейнера было бы просто, но в случае локального прокси требуются дополнительные настройки.
Решение
Для решения этой проблемы можно использовать специальную директиву extra_hosts в Docker Compose, которая позволяет добавить записи в файл /etc/hosts внутри контейнера:
- В файл
compose.yamlдобавьте следующую секцию:
extra_hosts:
- "host.docker.internal:host-gateway"
Что это делает:
host.docker.internal— специальное доменное имя, которое будет доступно внутри контейнераhost-gateway— специальное значение, которое Docker автоматически заменит на IP-адрес хост-системы
Практическое применение
После добавления этой настройки, вы сможете обращаться к любым сервисам, запущенным на хост-машине, используя доменное имя host.docker.internal вместо localhost.
Например, для настройки SOCKS5 прокси в FreshRSS добавьте в конфигурационный файл следующие строки:
'curl_options' => array (
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5,
CURLOPT_PROXY => 'host.docker.internal',
CURLOPT_PROXYPORT => 8080,
),
Дополнительные примечания
- Этот метод работает не только для прокси-серверов, но и для любых других сервисов, запущенных на хост-машине: баз данных, кэширующих сервисов и т.д.
- На различных версиях Docker механизм может немного отличаться, поэтому убедитесь, что вы используете последнюю версию Docker и Docker Compose.
- Для Windows и macOS Docker Desktop уже добавляет запись
host.docker.internalпо умолчанию, но для Linux требуется явное указание, как в примере выше.