Oi, pessoal!
Neste artigo, vamos detalhar como o Docker trabalha com o ambiente multi-host, trazer alguns exemplos práticos e detalhar cada caso de uso. Boa leitura!
O que muda no Docker 1.9?
Bom, primeiramente, o que existia até o Docker 1.8 continua, o que muda é que foram acrescentados alguns comandos, e como explicado neste texto, na versão 1.9, a funcionalidade de rede do Docker é tratada como um plugin, sendo possível utilizar formas mais elaboradas de rede, sem a necessidade de modificação em sua aplicação. Abaixo, uma listagem dos comandos adicionados:
- docker network create
- docker network connect
- docker network ls
- docker network rm
- docker network disconnect
- docker network inspect
Criando uma rede – Bridge
Quando você instala o Docker Engine, ele cria automaticamente uma interface local de comunicação, tanto para o host – container, quanto para container-container. Chamada de docker0, ela é uma interface virtual criada em modo bridge com a interface principal, isso faz com que o container possa se comunicar com a Internet; geralmente é atribuído para essa interface o IP: 172.21.0.1/16 e, quando não definido, os containers terão um IP dessa rede.
Na versão 1.9 do Docker, é possível criar basicamente dois tipos de rede: Bridge (forma tradicional, e acessível apenas de dentro do host) ou Overlay (que possibilita a comunicação entre outros hosts com Docker, possibilitando assim a criação de cluster de Docker). Abaixo, você pode visualizar como é possível criar uma rede em modo Bridge:
$ docker network create minha-rede cds4554wfedcsaafe564fef3648e8d9d181sase98d8ef8c7ed561e89d9 $ docker network inspect minha-rede [ { "Name": "minha-rede", "Id": "cds4554wfedcsaafe564fef3648e8d9d181sase98d8ef8c7ed561e89d9", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": {}, "Options": {} } ]
Claro que você pode criar uma rede especificando qual range de IP você deseja que seus containers utilizem, veja:
$ docker network create --driver=bridge --subnet=172.28.0.0/16 --ip-range=172.28.5.0/24 --gateway=172.28.5.254 br0 03449da9dc22133889c55b3497bcd821b83e64b20608a680ce6e5025bd491118 $ docker network inspect br0 [ { "Name": "br0", "Id": "03449da9dc22133889c55b3497bcd821b83e64b20608a680ce6e5025bd491118", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.28.0.0/16", "IPRange": "172.28.5.0/24", "Gateway": "172.28.5.254" } ] }, "Containers": {}, "Options": {} } ]
Quando você criar o container, basta especificar agora que deseja utilizar essa rede. Com o comando abaixo, é possível fazer isso:
$ docker run --net=br0 -itd --name=container3 busybox b9b6cea6195c0b66133933364e806d14644f97625c2a7270170fa5b6e4984f22 $ docker network inspect br0 [ { "Name": "br0", "Id": "03449da9dc22133889c55b3497bcd821b83e64b20608a680ce6e5025bd491118", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.28.0.0/16", "IPRange": "172.28.5.0/24", "Gateway": "172.28.5.254" } ] }, "Containers": { "b9b6cea6195c0b66133933364e806d14644f97625c2a7270170fa5b6e4984f22": { "EndpointID": "32970bd2ebb403851b559f81ec9916ddd4f791d5a9c2f30a093a5c1626e7f089", "MacAddress": "02:42:ac:1c:05:01", "IPv4Address": "172.28.5.1/16", "IPv6Address": "" } }, "Options": {} } ]
Legal, não? Você pode criar uma arquitetura que possibilite isolar determinados containers, e fazer com que eles não tenham acesso à Internet. Isso é útil, por exemplo, para containers que executam aplicação de apoio, como redis, mongo etc.
Criando uma rede – Overlay
Note que, no caso acima, como não foram definidos parâmetros adicionais, o Docker criou uma rede em modo Bridge. Diferentemente do modo Bridge, o Overlay necessita que alguns requisitos sejam atendidos, dentre eles podemos destacar:
- Acesso a um serviço de chave-valor distribuído, o Docker suporta Consul, Etcd ou ZooKeeper;
- Um Cluster já montado com acesso a esse serviço de chave-valor distribuído;
- Daemon do Docker configurado corretamente em cada host do cluster.
- Host com Kernel 3.16 ou superior.
As opções disponíveis para criação de uma rede Overlay são:
- –cluster-store
- –cluster-store-opt
- –cluster-advertise
Também é uma boa ideia, embora não obrigatório, que você instale o Docker Swarm para gerenciar o cluster. O Swarm fornece o serviço de descoberta e gestão de servidor que pode te ajudar na implementação.
Quando você cria uma rede, o Docker Engine não sobrepõe a rede criada no momento da instalação. Você pode substituir esse padrão e especificar uma sub-rede diretamente usando a opção –subnet. Em uma rede em modo Bridge, você pode criar apenas uma única sub-rede – uma rede Overlay suporta múltiplas sub-redes.
Além da opção –subnetwork, você pode especificar os parametros –gateway, –ip-range e –aux-address. Veja como ficaria a criação da rede:
$ docker network create -d overlay --subnet=192.168.0.0/16 --subnet=192.170.0.0/16 --gateway=192.168.0.100 --gateway=192.170.0.100 --ip-range=192.168.1.0/24 --aux-address a=192.168.1.5 --aux-address b=192.168.1.6 --aux-address a=192.170.1.5 --aux-address b=192.170.1.6 minha-rede-multihost
O único cuidado que você deve ter é não criar sub-redes conflitantes, pois isso causará um erro no momento da criação ou mau funcionamento no ambiente que deseja montar. Estando a rede criada, basta criar o container passando como parâmetro ao nome da rede, veja:
$ docker run -itd --net=minha-rede-multihost busybox
Nos próximos artigos, vamos trazer detalhadamente um ambiente com Overlay, desde a configuração dos pré-requisitos até a criação de containers em múltiplos hosts, quem sabe um vídeo.