DOCKER SERIES: LAB … Redes: MODOS ( bridge, host, none )
Assim como ocorre em outros softwares de virtualização, o DOCKER também apresenta certos tipos de redes para trabalhar. Na prática servem como MODOS para interface de um ou mais containers. Para efeito comparativo, veja a seguinte captura de tela, cuja fonte é o “recém-lançado” Oracle VM VirtualBox 7.0:

Nela observamos diversas opções para nossa placa de rede (NAT, host-only, bridge) Essas ditam como as máquinas irão se comportar/comunicar entre si e com outras redes alheias (físicas ou virtuais). Para maiores informações visite https://www.virtualbox.org/manual/UserManual.html#settings-network e https://www.virtualbox.org/manual/UserManual.html#networkingdetails
Voltando ao Docker … Seja no trabalho, faculdade, ou até mesmo projetos pessoais, é esperado que se tenha vários containers executando simultaneamente. Por exemplo, um que está rodando JAVA, outro que é o nosso DATABASE, e um terceiro como servidor WEB. As possibilidades são quase infinitas! Contudo para nós, e visando a simplicidade, iremos emular uma aplicação FRONTEND se comunicando com uma aplicação BACKEND. Mas antes, é claro, precisamos conhecer alguns novos comandos!
O primeiro deles é o docker inspect
Passando o id do container, somos capazes de obter informações valiosas acerca do mesmo, incluindo a parte de REDES. Localizada bem ao final, basta rolar até encontrar a seção ‘Networks’
sudo docker inspect e95221a00731

Por padrão, quando criados todos os containers são inseridos na rede BRIDGE. Ok Victor, e como eu vejo quais são as redes “de fábrica”? E tem como mudar isso? Resposta A – através do docker network ls
Resposta B – Sim, no momento da execução de um container ou definindo a sua própria rede.
sudo docker network ls

A teoria nos diz que:
- DRIVER é o termo equivalente para adaptadores ou placas de rede.
- Qualquer container configurado na rede BRIDGE é passível de comunicação (ida e volta) tanto à nível externo (ex: internet) quanto aos seus pares (ex: outros setados para a mesma).
- Qualquer container configurado na rede HOST é conectado diretamente na rede do hospedeiro.
- Qualquer container configurado na rede NONE fica indisponível para outras redes (internas ou externas). Aqui ocorre o isolamento total do container.
Então agora vamos à prática!!!
CRIANDO UMA NOVA REDE
Se for depender apenas do IP para comunicação entre containers, essa não seria tão amigável assim. Isso porque tal parâmetro muda de tempos em tempos, graças ao DHCP interno do Docker. Portanto, vamos adicionar mais uma camada. Exatamente! A partir deste momento a comunicação será baseada em hostname. Ou seja, aquela informação exibida na coluna NAME, depois que executamos docker ps

Para isso, defina você mesmo um nome para cada container executado. Pois do contrário, o docker fará sozinho, sem perguntar e pior, de maneira aleatória. Então, sempre informe algo parecido com o comando a seguir:
sudo docker run -it --name centos1 --network minha-rede centos bash
Mas calma! Ainda não! Bem antes disso necessitamos criar nossa própria REDE. Na prática será do tipo BRIDGE. Mãos à obra:
sudo docker network create --driver bridge minha-rede
sudo docker network ls

Agora sim! Siga em frente! E crie dois novos containers. Por exemplo:
sudo docker run -it --name centos1 --network minha-rede centos bash
sudo docker run -d --name centos2 --network minha-rede centos sleep 5m


E como teste, execute um PING do primeiro para o segundo … Pronto! Bem-sucedido!
COMUNICANDO : FRONTEND (web) <-> BACKEND (db)
Finalizando, e conforme prometido, vamos simular uma aplicação web se comunicando com um banco de dados. Aproveitando a deixa, talvez caiba aqui uma explanação mais detalhada acerca do funcionamento de uma rede BRIDGE. Bem, em primeiro lugar, o driver cria uma rede privada interna ao host para que os containers dessa rede possam se comunicar. Em seguida, o Docker Engine cria todas as pontes necessárias, que são as interfaces, regras de firewall e tabela de rotas. Por último, e caso assim você o faça, o acesso externo será disponibilizado via exposição de portas.
Em nosso exemplo, usaremos um aplicativo fictício composto por um container nodejs e outro db. Sinta-se à vontade para experimentá-lo em seu próprio computador. O aplicativo estará acessível em <localhost>:3000

sudo docker run -d --network minha-rede --name meu-mongo mongo:4.4.6
sudo docker run -d --network minha-rede --name meus-livros -p 3000:3000 aluradocker/alura-books:1.0

(Abrir um browser) http://localhost:3000

(Semear o banco de dados) http://localhost:3000/seed

(Atualizar a página novamente) http://localhost:3000

REFERÊNCIAS:
https://docs.docker.com/network/
https://docs.docker.com/network/bridge/
https://docs.docker.com/network/host/
https://docs.docker.com/network/none/
https://docs.docker.com/network/network-tutorial-standalone/
https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/