Docker: Orquestração de containers com o Docker Swarm
Visão geral da orquestração de contêiner
Quando executamos contêineres em produção temos que nos preocupar como:
- schedular os serviços em nós distribuídos,
- alta disponibilidade,
- implementar a reconciliação,
- o dimensionamento do ambiente
- o registro em log.
Neste artigo, vou a ferramenta de orquestração que vem incorporada ao Docker Engine, o Docker Swarm, para resolver alguns desses problemas.
Pontos importantes:
- manager = gerencia os nodes e containers
- workers = onde os containers são executados
Este exemplo consiste em um node manager e dois nodes workers. Os managers manipulam comandos e gerenciam o estado do swarm. Os workers não podem manipular comandos e são simplesmente usados para executar contêineres em escala. Por padrão, os managers também são usados para executar contêineres.
Passos
Crie seu primeiro swarm
Para facilitar o entendimento vou usar o https://labs.play-with-docker.com, faça o Login/Sign.
Vou criar 1 node de manager e 2 de workers.
Clique 3 vezes no botão +Add Instance, para criar 3 nodes.
Criando o Manager
[node1] (local) [email protected] ~$ docker swarm init --advertise-addr eth0
Resultado:
Swarm initialized: current node (zn2ljc47iah166z7mbjmx4o1h) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-60gbmmu7ec4h1...ia451aepqz 192.168.0.38:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Criando o Worker no Node 2
[node2] (local) [email protected] ~$ docker swarm join --token SWMTKN-1-60gbmmu7ec4h1...ia451aepqz 192.168.0.38:2377
Resultado:
This node joined a swarm as a worker.
Criando o Worker no Node 3
[node3] (local) [email protected] ~$ docker swarm join --token SWMTKN-1-60gbmmu7ec4h1...ia451aepqz 192.168.0.38:2377
Listando os Nodes
Executar no node1
docker node ls
Resultado:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION zn2ljc47iah166z7mbjmx4o1h * node1 Ready Active Leader 18.03.1-ce lchy7h37gybh01uaoifcf2tk1 node2 Ready Active 18.03.1-ce6dfxgdw04f t40kelfin697kdjf96lh4n0f2 node3 Ready Active 18.03.1-ceeoektffd94
Implante seu primeiro serviço
Criando o primeiro serviço
Executar no node1
docker service create -d true --name nginx1 --p 80:80 --mount source=/etc/hostname,target=/usr/share/nginx/html/index.html,type=bind,ro nginx:1.12
Este comando é declarativo. o Docker Swarm tentará manter o estado declarado neste comando, a menos que seja explicitamente alterado por outro comando de service do docker. Esse comportamento é útil quando os nodes ficam inativos, por exemplo, e os contêineres são reprogramados automaticamente em outros nodes.
Listando os serviços
docker service ls
Resultado: ID NAME MODE REPLICAS IMAGE PORTS c87phpl7nerz competent_mccarthy replicated 0/1 true:latest 5s2z3gq9107b nginx1 replicated 1/1 nginx:1.12 *:80->80/tcp jua95ifymrdz trusting_morse replicated 0/1 true:latest
Este comando lista os 3 nodes do swarm. O asterisco (*) ao lado do ID do node representa o node que manipulou esse comando específico (docker node é neste caso).
docker service ps nginx1
Resultado:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS g4ozhxmyokf5 nginx1.1 nginx:1.12 node1 Running Running 5 minutes ago 8if9h0qg4sew \_ nginx1.1 nginx:1.12 node1 Shutdown Complete 5 minutes ago
Testando o nginx rodando no container
Execute o comando curl localhost:80, o resultado será o hostname do node onde o container está sendo executado:
node1