Перейти к основному содержанию

Настройка Docker для работы с локальным прокси-сервером

20 January 2025 | 269 words | tags: #docker

Проблема

Я использую Synology NAS как файловый сервер, а также для запуска виртуального сервера. В моей сети настроен ограниченный доступ в глобальную сеть, и полноценный доступ в интернет осуществляется только через прокси-сервер, который также работает на этом же NAS.

Недавно я решил перенести сервис FreshRSS с хостинга на свой виртуальный сервер. Запустить и настроить сам сервис оказалось несложно, но возникла проблема с подключением к локальному прокси-серверу.

Суть проблемы: Docker-контейнер не может напрямую обратиться к сервисам, работающим на localhost хост-машины. Если бы прокси был внешним, то подключиться к нему из контейнера было бы просто, но в случае локального прокси требуются дополнительные настройки.

Решение

Для решения этой проблемы можно использовать специальную директиву extra_hosts в Docker Compose, которая позволяет добавить записи в файл /etc/hosts внутри контейнера:

  1. В файл 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 требуется явное указание, как в примере выше.