Uso de la redirección de puertos de iptables con docker

Tengo un servidor Linux que ejecuta Jenkins (HTTP en el puerto 8080) y el mismo servidor también ejecuta Docker 1.12.1. Usé algunas reglas de iptables (según los documentos oficiales de instalación de Jenkins) para redirigir el puerto 8080 al puerto 80 del host, de modo que HTTP predeterminado funcionaría para Jenkins (es decir, http://myserver en lugar de 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

Sin embargo, estas reglas interrumpen la capacidad de Docker para descargar los recursos correctos a través de HTTP durante un docker build comando. Por ejemplo, RUN apt-get update falla con varios errores de "error al descargar". Hacer wget http://www.google.com dentro del contenedor devuelve el HTML de la página principal de Jenkins. Las solicitudes HTTP del host funcionan bien. La eliminación de las reglas de iptables da como resultado RUN apt-get update trabajando de nuevo. Así que creo que esas reglas de iptables están interfiriendo con el mecanismo de red de docker.

¿Puede coexistir una redirección de puertos de este tipo con Docker? Si es así, ¿cómo se escribirían las reglas de iptables para resolver este problema?

Una posible modificación de las reglas de iptables es eliminar ambas y reemplazarlas por:

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

Esto asegurará que, para mi caso, solo el tráfico TCP en el puerto 80 a través de la interfaz eth0 serás redirigido. El tráfico que se origina en un contenedor de Docker en el host no se redirigirá. Tenga en cuenta que también he omitido la redirección de localhost, aunque presumiblemente eso podría modificarse para evitar filtrar cualquier cosa que se origine en la interfaz docker0.

Otra solución es emplear un proxy inverso para reenviar solicitudes HTTP entrantes en el puerto TCP 80 al puerto 8080 del host. Yo usé Cadi con el siguiente Caddyfile simple:

localhost:80proxy / localhost:8080

Con esto en su lugar, puedo eliminar las reglas de iptables por completo.

Esto parece proporcionar una redirección simple en el puerto 80, además de permitir que los contenedores docker usen HTTP saliente normalmente.