https://github.com/chaifeng/ufw-docker
Существует давняя проблема с докерными сетями, которую далеко не каждый умеет решать. Суть проблемы: докерные сети изолированы друг от друга по умолчанию. Как это проявляется? Даже если Контейнер А в bridge сети A попытается по ip соединиться с Контейнером Б в bridge сети B, то соединение не будет установлено.
Ну это ладно, с какого перепугу нам вообще делать запросы между разными bridge сетями?
И вот тут возникет более интересная задача:
- Есть docker nginx, он находится в bridge сети A.
- Есть два веб-сервиса 1 и 2. Они тоже в bridge сети A.
- Оба этих сервиса проксируются через nginx и отвечают по адресам 1.example.ru и 2.example.ru соответственно.
- Сервис 2 - это php fpm. К нему нельзя делать запросы напрямую, только через проксирование.
- В сервисе 1, соответственно, указано 2.example.ru как адрес запросов.
Из-за изоляции докерных сетей, контейнер не может сделать запрос из bridge сети в host сеть. Получаем бесконечный таймаут.
Решение:
1. Запрос делаем не к 2.example.ru, а к http://nginx-proxy/url 2. Добавляем header "Host" со значением "2.example.ru"
Таким образом, сервис вообще не покидает bridge сеть, а (благодаря заголовку Host) nginx правильно понимает, к какому именно домену был запрос.