Rede no Docker 1.9

posted in: Tutoriais | 12

Oi pessoal!

Neste post vamos detalhar como o Docker trabalha com o ambiente multi-host, vamos trazer alguns exemplos práticos e vamos 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 acrescentado alguns comandos, e como explicado neste post, na versão 1.9 a funcionalidade de rede do Docker é tratada como um plugin, sendo possível assim 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, chama-se docker0 , ela é uma interface virtual criada em modo bridge com a interface principal, isso faz com que seja possível o container 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 do tipo 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 você isolar determinados containers, e fazer com que eles não tenha acesso a internet por exemplo, isso é útil para containers que executam aplicação de apoio, como redis, mongo, etc.

Criando uma rede – Overlay

Note que no caso acima, como não foi definido 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 este 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ê também 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, isso causará um erro no momento da criação ou mau funcionando 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 posts 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 😉 .

Por hoje era isso, esperamos ter ajudado e tendo dúvidas nos avise para conversarmos, e claro, nos ajude divulgando o Blog!

Entusiasta Open Source, seu principal foco é ir atrás de ideias novas e torna-las realidade através de soluções simples e eficientes, o menos é mais, e o dividir é multiplicar.
  • augustoojj

    Obrigado pelo post, a pouco tempo fiz um pergunta e recebi uma resposta satisfatória e agora este post ajudou ainda mais. Com base nesses posts arrumei um jeito mais simples e fácil de colocar IP nos contêineres só tenho a agradecer !!

  • Oi Augusto, que ótimo que isso foi útil a você! Se tiver mais alguma dúvida ou precisar de ajuda nos avise 😉

  • Muito bom o artigo, vou testar no meu lab de testes. Parabéns! Abraço!

  • pataya temper

    Caso fosse necessário ao criar o container, o mesmo fosse criado com 2 ou mais interfaces de redes é possivel

  • Olá Pataya,
    É possível sim, a partir do Docker 1.10 você pode criar um container (com uma única interface), adicionar uma nova rede utilizando o Docker Network Connect (com o container parado) e iniciar esse container, dessa forma o container em si terá a rede bridge (criada automaticamente) e a rede que você adicionou.

  • Olá , estou com meu docker em uam VM, intalei tudo certinho , depois de baixar minha imagem, meu docker pega ip 172.17.0.1 e nao consigo comunicar(ping) da maquina fisica que é 192.168.15.x . Com eu posso resolver isso ?

  • Oi Roney,
    Na verdade não resolve :) Para isso você deve usar o docker network ou weave para que o container tenha o mesmo ip da rede em que sua VM faz parte.

  • Mateus Quevedo

    Parabéns Cristhian e Cristiano, encontrei agora o blog de vcs e achei super bom o conteúdo. :)

    Gostaria de fazer uma pergunta pra vcs.
    Estou começando a “estudar” o Docker agora e fiquei com uma dúvida. Caso eu queira criar uma vps na Digital Ocean e instalar o docker lá para colocar alguns sites de clientes meus (somente sites em WP). Qual seria o melhor método para fazer essa implementação?

  • Oi Mateus, primeiramente obrigado pelo feedback.
    No seu caso, você deve ter cuidado em algumas coisas, entre elas:
    1 – Use volume: Coloque o /var/www/html mapeado para o host, com isso você evita overhead e mantém seu container enxuto, no post sobre volumes explicamos como fazer isso;
    2 – Tenha um proxy no host: Com isso você poderá alocar um site em cada container e mapear os domínios para lá, recomendo o haproxy que é o mais simples e leve;
    3 – Se possível coloque o apache em um container e php (via php-fpm) em outro, mas você pode utilizar os dois juntos sem problema.
    Temos um post sobre montando seu servidor web que pode te ajudar a pensar nessa arquitetura.
    Se tiver dúvidas pode nos mandar, se preferir pode enviar por e-mail, [email protected].
    Grande abraço!

  • Mateus Quevedo

    Obrigado pelas respostas rápidas pessoal, vcs são d+ :)

    Vou fazer alguns testes aqui sim, ajudaram bastante. Caso surja alguma dúvida, posso pedir a ajuda de vcs?

  • Oi Mateus,
    DEVE! não fique com dúvidas, nosso objetivo é facilitar a adoção dessa tecnologia, então não pense duas vezes.

  • Mateus Quevedo

    Muito obrigado :)