У меня есть сервер Linux с Jenkins (HTTP на порту 8080), и на том же сервере также работает Docker 1.12.1. Я использовал некоторые правила iptables (в соответствии с официальной документацией по установке Jenkins) для перенаправления порта 8080 на порт 80 хоста, чтобы HTTP по умолчанию работал для Jenkins (т.е. http://myserver
скорее, чем http://myserver:8080
):
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080
Однако эти правила нарушают способность Docker загружать нужные ресурсы через HTTP во время docker build
команда. Например, RUN apt-get update
дает несколько ошибок "не удалось загрузить". Делать wget http://www.google.com
внутри контейнера возвращает HTML для главной страницы Jenkins. HTTP GET от хоста работает нормально. Удаление правил iptables приводит к RUN apt-get update
снова работает. Поэтому я думаю, что эти правила iptables мешают сетевому механизму докеров.
Может ли такое перенаправление портов сосуществовать с Docker? Если да, то как написать правила iptables для решения этой проблемы?
Возможное изменение правил iptables - удалить оба и заменить на:
iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-ports 8080
Это гарантирует, что в моем случае только TCP-трафик на порт 80 через интерфейс eth0
будет перенаправлен. Трафик, исходящий из контейнера докеров на хосте, не будет перенаправлен. Обратите внимание, что я также не учел перенаправление localhost, хотя, по-видимому, его можно изменить, чтобы избежать фильтрации всего, что происходит из интерфейса. docker0
.
Другое решение - использовать обратный прокси-сервер для пересылки входящих HTTP-запросов через TCP-порт 80 на порт 8080 хоста. Я использовал Кэдди со следующим простым Caddyfile:
localhost:80
proxy / localhost:8080
После этого я могу полностью удалить правила iptables.
Кажется, это обеспечивает простое перенаправление на порт 80, а также позволяет контейнерам докеров использовать исходящий HTTP в обычном режиме.