Usando o redirecionamento de porta iptables com docker

Eu tenho um servidor Linux executando Jenkins (HTTP na porta 8080) e o mesmo servidor também está executando o Docker 1.12.1. Usei algumas regras iptables (de acordo com os documentos oficiais de instalação do Jenkins) para redirecionar a porta 8080 para a porta 80 do host, para que o HTTP padrão funcionasse para o Jenkins (ou seja, http://myserver que 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

No entanto, essas regras quebram a capacidade do Docker de baixar os recursos corretos via HTTP durante um docker build comando. Por exemplo, RUN apt-get update falha com vários erros de" falha ao baixar". Estar wget http://www.google.com dentro do contêiner retorna o HTML para a página principal do Jenkins. HTTP obtém do host funciona bem. Remover as regras iptables resulta em RUN apt-get update a trabalhar outra vez. Então, acho que essas regras iptables estão interferindo no mecanismo de rede do docker.

Esse redirecionamento de porta pode coexistir com o Docker? Em caso afirmativo, como alguém escreveria regras iptables para resolver esse problema?

Uma possível modificação nas regras iptables é remover ambos e substituir por:

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

Isso garantirá que, no meu caso, apenas o tráfego TCP na porta 80 através da interface eth0 será redirecionado. O tráfego proveniente de um contêiner docker no host não será redirecionado. Observe que também deixei de fora o redirecionamento localhost, embora presumivelmente isso possa ser modificado para evitar filtrar qualquer coisa originada da interface docker0.

Outra solução é empregar um proxy reverso para encaminhar solicitações HTTP recebidas na porta TCP 80 para a porta 8080 do host. Eu usei Transportador com o seguinte Caddyfile simples:

localhost:80proxy / localhost:8080

Com isso no lugar, posso remover completamente as regras iptables.

Isso parece fornecer um redirecionamento simples na porta 80, além de permitir que os contêineres do docker usem HTTP de saída normalmente.