Olá, pessoal!
Hoje vou mostrar como podemos interligar containers sem precisar expor as portas do nosso host. Mapeamentos de portas não são a única maneira de conectar um container ao outro. Docker também tem um sistema de ligação que permite interligar vários containers juntos e enviar as informações de conexão de um para outro.
A importância de nomear
Para estabelecer os links, o Docker conta com os nomes dos container. Você já viu que cada container que você criar tem um nome criado automaticamente, mas você mesmo pode dar um nome ao container. Essa nomeação fornece duas funções úteis:
- Torna-se útil quando você precisa criar containers com funções especificas e precisa lembrar-se deles, por exemplo um container web ou mysql etc.
- Fica mais fácil fazer o link entre os containers, pois você não precisa decorar um nome que foi gerado aleatoriamente, basta você linkar seu container web com seu container mysql, por exemplo.
Você pode nomear seu recipiente usando o parâmetro –name, por exemplo:
$ docker run -d -P --name web training/webapp python app.py
Isso inicia um novo container e usa o parâmetro –name para nomeá-lo como web. Você pode ver o nome do container utilizando o comando docker ps.
$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
Você também pode usar docker inspect para retornar o nome do container.
Nota: Os nomes dos containers são únicos, então para reutilizar algum nome você deverá parar o container, remover e criar o container com o nome desejado.
Comunicação via Link
O Link permite que você trafegue informações entre os containers de forma segura, pois quem conhece um container conhece apenas o seu par definido no link. Quando você configurar um link, você cria um elo de ligação entre um container de origem e um container de destino. Para criar um link, você deve utilizar o parâmetro –link. Em primeiro lugar, deve-se criar um container que será origem de dados para outro container; desta vez, vamos criar o container de banco de dados:
$ docker run -d --name db training/postgres
Isso criará um novo container chamado db a partir da imagem do postgres, que contém um banco de dados PostgreSQL.
Agora, você precisa excluir o container web criado anteriormente para que possa substituí-lo por outro vinculado ao db:
$ docker rm -f web
Agora, crie um novo container chamado web e vincule ao seu container db.
$ docker run -d -P --name web --link db:db training/webapp python app.py
Isso irá ligar o novo container web com o container db criado anteriormente. O parâmetro –link fica da seguinte forma:
--link <nome ou id>:alias
Você pode ver que o container web agora está ligado ao container db, o que lhe permitirá coletar as informações do container db e, claro, do banco de dados que se encontra lá.
Como pode notar, um link permite que um container de origem forneça informações sobre si próprio e de seus serviços a outro container de destino. No nosso exemplo, o destinatário web pode acessar informações sobre o banco de dados de origem. Para fazer isso, o Docker cria um túnel seguro entre os containers, que não precisam expor as portas externamente. Você deve ter notado que quando iniciamos o container db nós não usamos o parâmetro -P ou -p – isso é uma grande vantagem ao utilizar o link, pois não precisamos expor o container ou serviço; no nosso exemplo, o banco de dados PostgreSQL, para toda a rede.
Na parte 2 deste artigo, veremos como o Docker cria esse túnel e permite a comunicação entre containers.
Abraço!