Использование перенаправления портов iptables с помощью docker

У меня есть сервер 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 8080iptables -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-код для главной страницы Дженкинса. HTTP-запросы от хоста работают нормально. Удаление правил iptables приводит к RUN apt-get update снова работаю. Поэтому я думаю, что эти правила iptables мешают сетевому механизму docker.

Может ли такое перенаправление портов сосуществовать с Docker? Если да, то как можно было бы написать правила iptables для решения этой проблемы?

Возможным изменением правил iptables является удаление обоих и замена на:

iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-ports 8080

Это гарантирует, что в моем случае только TCP-трафик на порту 80 через интерфейс eth0 будет перенаправлен. Трафик, исходящий из контейнера docker на хосте, перенаправляться не будет. Обратите внимание, что я также не включил перенаправление localhost, хотя, предположительно, это можно было бы изменить, чтобы избежать фильтрации всего, что исходит из интерфейса docker0.

Другим решением является использование обратного прокси-сервера для пересылки входящих HTTP-запросов по TCP-порту 80 на порт 8080 хоста. Я использовал Кэдди со следующим простым файлом Caddyfile:

localhost:80proxy / localhost:8080

С учетом этого я могу полностью удалить правила iptables.

Это, по-видимому, обеспечивает простое перенаправление на порт 80, а также позволяет контейнерам docker нормально использовать исходящий HTTP.