Usando o redirecionamento de porta do iptables com o docker

1

Eu tenho um servidor Linux executando o Jenkins (HTTP na porta 8080) e o mesmo servidor também está executando o Docker 1.12.1. Eu usei algumas regras iptables (como por documentos de instalação oficiais 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 comando docker build . Por exemplo, RUN apt-get update falha com vários erros de "falha ao baixar". Fazer wget http://www.google.com dentro do contêiner retorna o HTML para a página principal do Jenkins. HTTP GETs do host funciona bem. Remover as regras do iptables resulta em RUN apt-get update funcionando novamente. Então eu 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 poderia escrever as regras do iptables para resolver este problema?

    
por meowsqueak 25.08.2016 / 07:47

1 resposta

3

Uma possível modificação nas regras do iptables é remover ambas 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, somente o tráfego TCP na porta 80 pela interface eth0 será redirecionado. O tráfego proveniente de um contêiner docker no host não será redirecionado. Note que eu deixei de fora o redirecionamento localhost também, embora presumivelmente isso possa ser modificado para evitar a filtragem de qualquer coisa originada da interface docker0 .

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

localhost:80
proxy / localhost:8080

Com isso, posso remover completamente as regras do iptables.

Isso parece fornecer um redirecionamento simples na porta 80, bem como permitir que os contêineres do Docker usem o HTTP de saída normalmente.

    
por 29.08.2016 / 05:18