Após a instalação do docker, você tem 3 redes por padrão:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
Estou tentando manter isso simples. Portanto, se você iniciar um contêiner por padrão, ele será criado dentro da rede bridge (docker0).
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
No dockerfile do Jenkins, as portas 8080
e 50000
estão expostas. Essas portas são abertas para o contêiner em sua rede de ponte. Assim, tudo dentro dessa rede de ponte pode acessar o contêiner na porta 8080
e 50000
. Tudo na rede de bridge está na faixa privada de. "Subnet": "172.17.0.0/16",
Se você quiser acessá-los de fora, terá que mapear as portas -p 8080:8080
. Isso mapeará a porta do seu contêiner para a porta do seu servidor real (a rede host). Assim, acessar seu servidor em 8080
irá direcionar para sua rede bridgen na porta 8080
.
Agora você também tem sua rede de host. Que não contêineres a rede de contêineres. Portanto, se você iniciar um contêiner na rede do host, ele terá a seguinte aparência (é o primeiro):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
A diferença está nas portas. Seu contêiner agora está dentro de sua rede host. Portanto, se você abrir a porta 8080
em seu host, acessará o contêiner imediatamente.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
Eu abri a porta 8080
em meu firewall e quando 8080
estou acessando meu servidor na porta estou acessando meus jenkins. Acho que este blog também é útil para entendê-lo melhor.
--net=host
dentro de um Dockerfile?docker build --network=host
. A rede de host especificada para a construção docker serve apenas para baixar os pacotes necessários para a construção da imagem. Quando você deseja executar seu contêiner na rede host, você ainda precisará definir a opção --network = host.network_mode: "host"
(ref - docs.docker.com/compose/compose-file/#network_mode )A
--net=host
opção é usada para fazer com que os programas dentro do contêiner do Docker pareçam estar sendo executados no próprio host, da perspectiva da rede. Ele permite ao contêiner um maior acesso à rede do que ele normalmente pode obter.Normalmente você tem que encaminhar portas da máquina host para um contêiner, mas quando os contêineres compartilham a rede do host, qualquer atividade de rede acontece diretamente na máquina host - assim como aconteceria se o programa estivesse sendo executado localmente no host em vez de dentro de um recipiente.
Embora isso signifique que você não precisa mais expor as portas e mapeá-las para portas de contêiner, significa que você precisa editar seus Dockerfiles para ajustar as portas nas quais cada contêiner escuta, para evitar conflitos, pois não é possível ter dois contêineres operando no mesmo porta do host. No entanto, o verdadeiro motivo para essa opção é a execução de aplicativos que precisam de acesso à rede difícil de encaminhar para um contêiner no nível da porta.
Por exemplo, se você deseja executar um servidor DHCP, você precisa ser capaz de ouvir o tráfego de broadcast na rede e extrair o endereço MAC do pacote. Essas informações são perdidas durante o processo de encaminhamento de porta, portanto, a única maneira de executar um servidor DHCP dentro do Docker é executar o contêiner como
--net=host
.De modo geral,
--net=host
é necessário apenas quando você executa programas com necessidades de rede incomuns e muito específicas.Por último, de uma perspectiva de segurança, os contêineres do Docker podem escutar em muitas portas, embora eles apenas anunciem (exponham) uma única porta. Normalmente, isso é bom, pois você apenas encaminha a única porta esperada; no entanto, se você usar
--net=host
, terá todas as portas do contêiner escutando no host, mesmo aquelas que não estão listadas no Dockerfile. Isso significa que você precisará verificar o contêiner de perto (especialmente se não for seu, por exemplo, um oficial fornecido por um projeto de software) para ter certeza de não expor inadvertidamente serviços extras na máquina.fonte
--net=host
contêineres verão o tráfego, mas é claro que apenas um programa por vez pode escutar em uma determinada porta, não importa em qual contêiner você o execute, nesta configuração )fonte
host
) se houver a possibilidade de executar vários contêineres no mesmo host. Em outros casos (onde o isolamento da rede não é necessário), eu preferiria--net=host
.