Encaminhar um IP para um contêiner docker

3

Até onde eu entendi, o docker executa contêineres com seus próprios IPs e portas totalmente abertas, na interface de ponte docker0.

Digamos que eu inicie um contêiner, e ele tenha seu próprio IP: 172.17.0.11, e eu tenho uma interface ethernet virtual, eth0.1, com o IP público 93.x.x.x

Como faço para encaminhar a eth0.1 para o contêiner docker, para que eu possa alcançar o contêiner via eth0.1 IP?

Posso encaminhar todas as portas de uma só vez? (talvez com um script)

Como desabilito o comportamento padrão do docker, para que cada contêiner receba apenas um IP na interface docker0 e eu configure manualmente o encaminhamento?

@Xavierlucas

Vinculei isso porque achei que foi explicado melhor por lá. Se você verificar a configuração do debian, eu adiciono ao arquivo / etc / net / interfaces isto:

post-up /sbin/ifconfig eth0:X IP.OF.FAIL.OVER netmask 255.255.255.255 broadcast IP.OF.FAIL.OVER
post-down /sbin/ifconfig eth0:X down

Desta forma, eu tenho uma interface virtual (eth0: 0), que tem um IP público encaminhado pelo meu provedor. Eu acho que o roteamento é feito pelo provedor, pois não há rotas ou configurações adicionais no meu servidor

Nota:

Há uma pergunta de acompanhamento

por que o encaminhamento de porta não está funcionando nessa configuração?

    
por Mascarpone 23.12.2014 / 17:37

2 respostas

7

Primeiramente, você não desejaria encaminhar todas as portas de uma só vez, pois assim você não teria necessariamente acesso ao host. Isso definitivamente deve ser um processo manual.

Espero que você tenha um serviço da Web em execução no contêiner do Docker, portanto, se desejar encaminhar, por exemplo, a porta 80 de seu endereço IP eth0.1 para o endereço IP do contêiner do Docker, use a seguinte regra iptables ;

iptables -A PREROUTING -t nat -i eth0.1 -p tcp --dport 80 -j DNAT --to 172.17.0.11:80
iptables -A FORWARD -p tcp -d 172.17.0.11 --dport 80 -j ACCEPT

Essas regras podem ser modificadas para qualquer outro contêiner de portas / docker, conforme necessário.

    
por 23.12.2014 / 20:15
6

OK, então vou dar uma resposta alternativa aqui, pois agora entendo que você não está se referindo a interfaces virtuais, mas ao aliasing de IP.

Primeiro, se você não precisar encaminhar todas as portas, apenas uma, simplesmente use (você precisa expor a porta em seu dockerfile, obviamente):

docker run -d -p 93.x.x.x:hostPort:containerPort registry/image

No outro caso, se você não usar esse alias de IP para qualquer outra coisa além de comunicar de / para seu contêiner com o restante de sua rede, poderá dar uma olhada no meu projeto modesto: docker-flatip e atribui diretamente esse IP a um link ethernet virtual conectado do container a uma segunda ponte dedicada a contêineres planos.

Eu escrevi enquanto enfrentei um caso de uso um pouco particular. Lembre-se de que isso está na borda de quais contêineres docker estão e é muito melhor encontrar uma solução, se possível, para não vincular um determinado endereço IP a um contêiner para propósitos de orquestração e escalabilidade.

O ponto principal disto para poder alcançar um container como era qualquer outro host em sua rede com configuração de regras de iptables mais fácil. No meu caso, foi necessário implantar vários agentes de geração de carga a partir de uma solução comercial com regras específicas do iptables, onde cada um precisava de um IP público e não podia ser descoberto automaticamente. Ele atua como um wrapper após a execução / antes de parar seus contêineres para que as regras do iptables sejam adicionadas / removidas com facilidade.

Com essa pequena ferramenta, você acabaria iniciando seu contêiner assim (se estiver realmente certo de que deseja encaminhar todas as portas, não incentivadas em todos ):

cid=$(docker run -d registry/image)

Ou

docker start $cid

Então:

docker-flatip add $cid 93.x.x.x/32 -i tcp:all,udp:all

E parando assim:

docker-flatip del $cid

docker stop $cid
    
por 28.12.2014 / 13:19