Docker Swarm para orquestração de contêineres
Publicados: 2019-08-08Tudo sobre o Docker Swarm e como ele gerencia e orquestra todos os contêineres em um cluster.
O que é Docker Swarm?
Docker swarm é um modo de lidar com um cluster de Docker Engines, daí o nome Swarm. O cluster de hosts do Docker é executado no modo swarm composto por gerentes e trabalhadores. As instâncias do mecanismo docker que participam do enxame são chamadas de nós.
Uma implantação de enxame no nível de produção consiste em nós docker espalhados por vários servidores.
Por que usá-lo? – Orquestração de Contêineres
Quando você está trabalhando em um ambiente de produção, centenas de contêineres docker estarão executando vários aplicativos nele. Gerenciar todos esses contêineres pode ser uma grande dor para todos os engenheiros de DevOps; é aqui que o Docker Swarm o ajuda. Ele gerencia e orquestra o cluster executando vários contêineres docker com facilidade.
Abaixo estão algumas de suas características:
- Alta disponibilidade – visa não oferecer tempo de inatividade ou interrupção.
- Balanceamento de carga – aloca os recursos e solicitações em outros nós no cluster automaticamente se algum nó falhar.
- Descentralizado – vários nós gerenciadores são executados em um ambiente de produção; portanto, o cluster nunca depende de um único nó gerenciador.
- Escalabilidade – usando um único comando docker swarm, você pode facilmente dimensionar ou reduzir contêineres no cluster.
Orquestrar contêineres do Docker
Agora que você conhece o básico do Docker Swarm, vamos ver um exemplo de sua implementação.
Neste exemplo, tenho três máquinas em execução em um cluster com os detalhes abaixo:
manager1: 192.168.56.104 worker1: 192.168.56.105 worker2: 192.168.56.102
Para inicializar o modo swarm no docker, execute o comando abaixo no nó do gerenciador. O sinalizador --advertise-addr
é usado para anunciar a si mesmo aos nós que podem ingressar no cluster.
geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
O comando acima gerará um token que será usado por outros nós para ingressar neste cluster. Copie o comando com o token gerado e execute-o nos nós do trabalhador.
Executando o token no nó worker1.
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Executando o token no nó worker2.
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
Agora, no nó do gerenciador, você pode verificar quais nós estão em execução no cluster.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Vamos construir a imagem docker geekflare_mongodb
que usamos no Dockerfile Tutorial.
docker build -t geekflare_mongodb .
Execute um contêiner da imagem do docker MongoDB criando um serviço de enxame. 27017 é o número da porta na qual o MongoDB está exposto.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged
Verifique se o serviço docker swarm foi iniciado. MODE replicado significa que o contêiner foi replicado em todos os nós do cluster e REPLICAS 1/1 significa que apenas um serviço de enxame está em execução no momento.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
Vamos verificar em qual nó do cluster esse único serviço está sendo executado. Ele está sendo executado no nó manager1.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago
Execute o comando docker ps para obter mais detalhes sobre o contêiner que está executando esse serviço de enxame.
geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
Você também pode executar o serviço de enxame no modo “global” em vez do modo “replicado” padrão. O modo global executa uma tarefa do serviço de enxame em todos os nós do cluster.
Antes de executar o serviço no modo global, deixe-me remover o contêiner em execução existente.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Inicie o serviço swarm dentro de um contêiner docker no modo global usando o sinalizador –mode.
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged
Verifique se o serviço de enxame foi iniciado no modo global. Como três nós (1 gerente, 2 trabalhadores) estão em execução no cluster, é por isso que o número de réplicas é 3.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp
3 serviços estão sendo executados agora em 3 nós, verifique-os executando o comando abaixo.

geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago
Em seguida, deixe-me mostrar como você pode definir o número de réplicas. Antes disso, removerei o contêiner atual, que está em execução.
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
Use o sinalizador –replicas no comando e mencione o número de réplicas que você deseja do serviço swarm. Por exemplo, quero ter duas réplicas do serviço swarm:
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged
Verifique os serviços de enxame atualmente em execução. Você pode ver que uma réplica está em execução no nó manager1 e a outra no nó worker1.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago
Vá para o nó worker1 e verifique se o contêiner docker está executando o serviço swarm.
geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
Para parar este contêiner, execute o comando abaixo.
geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb
Agora, a partir do nó manager1, se você verificar quais nós estão executando o serviço, você verá sua execução no nó manager1 e no nó worker2. O CURRENT STATE do nó worker1 é Shutdown (pois paramos o contêiner executando o serviço). Mas como duas réplicas devem ser executadas desse serviço, outro serviço foi iniciado no trabalhador 2.
É assim que você obtém alta disponibilidade usando o docker swarm.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago
É muito fácil aumentar ou diminuir os contêineres do docker. O comando abaixo aumentará o contêiner do mongo para 5.
geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged
Verifique quantas réplicas do contêiner mongo estão em execução agora, deve ser 5.
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
Verifique onde essas 5 réplicas estão sendo executadas no cluster. 1 réplica está em execução no nó manager1 e 2 réplicas em ambos os nós do trabalhador cada.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago
Em seu cluster, se você não quiser que seus serviços sejam executados no(s) nó(s) gerenciador(es) e quiser mantê-lo apenas para gerenciar os nós, poderá drenar o nó gerenciador.
geekflare@manager1:~$ docker node update --availability drain manager1 manager1
Verifique a disponibilidade do nó do gerenciador.
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Você verá que os serviços não estão mais em execução no nó do gerenciador; eles estão espalhados pelos nós do trabalhador no cluster.
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
Isso foi tudo sobre o Docker Swarm e como orquestrar contêineres no modo docker swarm. Experimente-os em seu ambiente de não produção para ter uma ideia de como funciona.