Remover porta exposta da janela de encaixe

6

Estou criando um contêiner de uma imagem que tinha uma porta publicada (3000). Quero publicar uma nova porta (3030) e somente esta, se eu usar o --publish 3030:3030 acabo com ambas as portas publicadas (3000 e 3030).

É possível, de alguma forma, despublicar uma porta de um contêiner em execução ou preciso iniciar minha imagem do zero?

    
por Olivier 27.08.2014 / 17:39

3 respostas

8

A maneira mais simples é criar uma nova imagem: geralmente, você sempre quer que o contêiner docker e as imagens sejam reproduzíveis. Se você alterar manualmente algo que se desvia da sua imagem, você se rouba desse comportamento (algo em que alguém mais gerenciando a infraestrutura em que você está trabalhando) esperaria.

Atualmente não há uma maneira limpa de fazer isso por meio da API do Docker , mas verifique se há um novo desenvolvimento em sua documentação.

Especificamente, há um relatório de erros (volumes / portas editáveis / alteráveis no github) que você pode querer comentar on / subscribe to if isso lhe interessa.

Neste momento, gerenciar diretamente o DNAT com o iptables é o caminho a ser seguido. É como o docker faz isso de qualquer maneira, mas esteja ciente de que além do efeito desejado, não tenho certeza se há efeitos colaterais (por exemplo, o docker tentando adicionar novamente essas regras, etc.)

Primeiro, você terá que procurar a porta encaminhada na seguinte lista:

iptables -t nat --line-numbers --numeric --list

que produz uma saída como esta:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
num  target     prot opt source               destination
1    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.1.1:80
2    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8081 to:172.17.1.2:80
3    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8082 to:172.17.1.3:80

então, você pode excluir a (s) regra (s) correspondente (s) usando

iptables -t nat -D DOCKER $num
, por ex. para substituir a regra que corresponde à porta 8081 você tem que usar
iptables -t nat -D DOCKER 2

Aproveite!

    
por 06.09.2014 / 16:57
0

docker create -p 127.0.0.1:0:3000 exporá a porta 3000 à porta do host aleatório ligada apenas à interface do host local. Não é a melhor solução, mas garante que a porta não seja acessível pela rede.

    
por 17.03.2017 / 20:56
0

Eu tinha começado um pequeno script para remover volumes registrados de uma imagem do docker. Ele usa uma solução alternativa usando " docker save " para um tarball com camadas, editando os metadados e " docker load " incluindo o histórico. Adicionar a opção para remover portas expostas era apenas outro truque que o script pode fazer.

Dê uma olhada em docker-copyedit - ele pode ajudar se as portas de despejo ocorrerem regularmente.

    
por 29.04.2018 / 21:05

Tags