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 do iptables (conforme 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
, em vez de 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
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 "falha ao baixar". Fazer wget http://www.google.com
dentro do container retorna o HTML para a página principal do Jenkins. HTTP GETs do host funcionam bem. A remoção das regras do iptables resulta no RUN apt-get update
funcionamento novamente. Então, acho que essas regras do 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 do iptables para resolver esse problema?
Uma possível modificação nas regras do iptables é remover ambos e substituir por:
Isso garantirá que, no meu caso, apenas o tráfego TCP na porta 80 através da interface
eth0
seja redirecionado. O tráfego originado de um contêiner docker no host não será redirecionado. Observe que deixei de fora o redirecionamento de localhost também, embora presumivelmente isso possa ser modificado para evitar a filtragem de qualquer coisa originária de interfacedocker0
.Outra solução é empregar um proxy reverso para encaminhar as solicitações HTTP recebidas na porta TCP 80 para a porta 8080 do host. Usei o Caddy com o seguinte Caddyfile simples:
Com isso instalado, posso remover totalmente as regras do 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.