Orquestração de Contêineres

Docker - Rede

Tipos de Rede

Como funciona

Bridge
Tipo de Rede - Bridge
Cada container tem o seu IP porque usa uma placa de rede virtual simulando uma placa de rede física.
Host
Tipo de Rede - Host
Todos os conatiners compartilham o mesmo IP do servidor físico porque usa "Host Network Namespace", consequentemente compartilham as mesmas portas.
OBS: nginx é um servidor web, então por default tem a porta 80 e 443 exposta. Isso significa que o Host não pode usar essas portas porque senão o servidor web não conseguirá subir, por estarem usando o mesmo ambiente de Rede (Mesmo IPs).
Overlay
Tipo de Rede - Overlay
É um cluster criado com Docker Swarm, onde todos os Hosts/Containers que estiverem dentro do cluster conseguirão comunicar-se. Maior poder de escalabilidade dos Hosts e dos Containers.
OBS: O modo Swarm é um recurso do Docker que fornece funcionalidades de orquestração de contêiner, incluindo clustering nativo de hosts do Docker e agendamento de cargas de trabalho de contêineres.

Prática

Exemplo de Rede no modo Bridge
Todos os containers que estiverem dentro da rede em modo bridge vão conseguir se comunicar usando os seus nomes.

                                // Criar uma rede em modo bridge
                                $ docker network create --driver bridge my-rede

                                // Listar as Redes
                                $ docker network ls

                                // Criar um container em modo daemon para o banco de dados
                                    // -d para rodar em modo daemon o container
                                    // --net my-rede para ligar o container a rede criada
                                    // --name db consul para criar o container db com imagem consul
                                $ docker run -d --net my-rede --name db consul

                                // Criar um container em modo daemon para o frontend
                                    // --env "DB:db" para criar variável de ambiente apontando para container db
                                    // --name web para nomear o container
                                    // -p 8000:5000 para expor porta 8000 do servidor pareando com porta 5000 do container
                                    // chrch/docker-pets:1.0 é a imagem usada para criar ocontainer
                                $ docker run -d --env "DB:db" --net my-rede --name web -p 8000:5000 chrch/docker-pets:1.0

                                // O Hostname é o ID do container
                                $ docker exec -it web sh
                                    # hostname
                                    # exit
                            
Exemplo de Rede no modo Host
Todos os containers estarão dentro do mesmo servidor, sem o isolamento da rede.

                                // Criar um container para o banco de dados
                                $ docker run -d --net host --name db consul

                                // Criar um container para o frontend
                                    // Como é no mesmo host não precisa expor a porta
                                $ docker run -d --env "DB=localhost" --net host --name web chrch/docker-pets:1.0
                            
Exemplo de Rede no modo Overlay
Criar um segundo servidor VM (add new instance).
Criar uma rede em modo bridge nos dois servidores VM.
Criar o frontend em um servidor e o Banco de dados em outro servidor.
Aqui, deu erro, porque para comunicar entre mais de um servidor é necessário configurar um Cluster com Docker Swarm.
É necessário promover um dos servidores como gerenciador, que será o principal que vai estar controlando os demais nós da rede.

                                // Listar as placas de rede da máquina
                                $ ifconfig

                                // Inicializar Docker Swarm **Gera código para adicionar nós ao cluster**
                                $ docker swarm init --advertise-addr 192.168.0.18

                                // Listar os nós da rede
                                $ docker node ls

                                // Criar uma rede em modo overlay
                                $ docker network create -d overlay my-rede-Overlay

                                // Criar um container para o banco de dados como SERVIÇO no nó 1
                                $ docker service create --network my-rede-Overlay --name db consul

                                // Criar um container para o frontend como SERVIÇO no nó 2
                                $ docker service create --network my-rede-Overlay -p 8000:5000 -e "DB=db" --name web chrch/docker-pets:1.
                                
                                // Listar os serviços no servidor principal
                                $ docker service ls

                                // Escalonar o container web, criar três instâncias
                                $ docker service scale web=3
                            
Criar containers como serviço facilita a escalabilidade e permiti escalonar de forma horizontal. Comando para ingressar um node a um cluster Swarm:

                                docker swarm join...