Docker Swarm
O docker swarm é uma ferramenta para criar um cluster de nós docker. Com o docker swarm, podemos criar serviços em cluster, tornando-os mais fáceis de gerenciar e escalar. Como o docker swarm é integrado ao docker engine, não precisamos de nenhum software adicional para configurar um cluster docker.
O docker swarm trabalha com tokens. Toda vez que uma nova máquina se junta a um cluster, fornece um token de identificação. O docker engine usa este token para adicionar a nova máquina ao cluster.
Por padrão, o docker swarm usa uma abordagem de implantação baseada em controle de versão. Isso significa que, para implantar um novo serviço, você cria uma nova imagem do serviço e a envia para o cluster. O docker engine, em seguida, verifica se há uma versão mais recente da imagem em execução e, se houver, atualiza o serviço para a nova imagem.
O docker swarm também pode ser configurado para implantar novos serviços usando um processo de implantação rolling update. Com esta abordagem, o docker engine atualiza cada nó do cluster para a nova imagem, um de cada vez. Isso significa que o serviço continua a ser executado durante a atualização, minimizando o tempo de inatividade.
Uma das principais vantagens do Docker Swarm é que ele é compatível com a maioria dos recursos do Docker Engine, o que significa que você pode usar a mesma interface para gerenciar seus servidores e aplicações em um cluster. Além disso, o Swarm é fácil de configurar e gerenciar, pois ele vem com uma ferramenta de linha de comando chamada Swarm Manager.
Outra vantagem do Swarm é que ele oferece suporte a vários algoritmos de balanceamento de carga, o que significa que você pode escolher o algoritmo que melhor se adapta às suas necessidades. Além disso, o Swarm também pode ser configurado para gerenciar vários tipos de aplicações, como aplicativos web, bancos de dados e serviços de mensagens.
Um nó é uma instância do mecanismo do Docker que participa do Swarm. Você também pode pensar nisso como um nó do Docker. É possível executar um ou mais nós em um único computador físico ou em um servidor em nuvem, mas as implantações em produção do Swarm geralmente incluem nós Docker distribuídos em várias máquinas físicas ou até em nuvem.
Para realizar o deploy de suas aplicações em um cluster Swarm, você envia uma definição de serviço (service) para um nó manager. O nó manager despacha unidades de trabalho chamadas task para nós worker.
Os nós manager também executam as funções de orquestração e gerenciamento de cluster, necessárias para manter o estado desejado do cluster Swarm. Os nós manager elegem um único líder para conduzir tarefas de orquestração.
Os nós worker recebem e executam tarefas despachadas dos nós manager. Por padrão, os nós manager também executam serviços como os nós worker, mas você pode configurá-los para executar exclusivamente tarefas do manager e serem apenas nós de gerência.
Um agente é executado em cada nó worker e relata as tarefas atribuídas a ele. O nó worker notifica o nó manager do estado atual de suas tarefas designadas, para que o gerenciador possa manter o estado desejado de cada nó worker.
A partir da instância dca-manager, execute os comandos para criar um cluster utilizando o Docker Swarm:
docker swarm init --advertise-addr 10.4.5.10 Swarm initialized: current node (an33bf4rlcod9j9faa8qgas45) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4n9g378tnn56u2cqdzq15g4z9xy5yfse3po63inwl7oarz2kw6-duqx176i5btzyey8oi3kmj7l8 10.4.5.10:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Copie o resultado do comando docker swarm init e logue nas instâncias dca-wk-01 e dca-wk-02.
docker swarm join --token SWMTKN-1-4n9g378tnn56u2cqdzq15g4z9xy5yfse3po63inwl7oarz2kw6-duqx176i5btzyey8oi3kmj7l8 10.4.5.10:2377 This node joined a swarm as a worker.
Alterne para a instância dca-manager e liste os nós presentes no Cluster Swarm:
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 * dca-manager Ready Active Leader 27.3.1 uo96zfyv1ysj4r59spapb4dte dca-wk-01 Ready Active 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Para exibir novamente o comando para ingressar o Nó Worker no Cluster, execute o seguinte comando:
docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4n9g378tnn56u2cqdzq15g4z9xy5yfse3po63inwl7oarz2kw6-duqx176i5btzyey8oi3kmj7l8 10.4.5.10:2377
Se você precisar adicionar outros nós com a função de Manager para criar um ambiente Multi Master, execute o seguinte comando:
docker swarm join-token manager.
Descrição dos Comandos
É possível filtrar um Nó pelo seu papel de Gerenciador (manager):
docker node ls --filter role=manager ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 * dca-manager Ready Active Leader 27.3.1
docker node ls --filter role=worker ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION uo96zfyv1ysj4r59spapb4dte dca-wk-01 Ready Active 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Na coluna AVAILABILITY os Nós estão como Active, indicando que estão disponíveis para receber tarefas. Ainda é possível definir como DRAIN e PAUSE.
Defina o label app=backend para o nó dca-manager:
docker node update --label-add app=backend docker-manager
Defina o label app=frontend para o nós dca-wk-01 e dca-wk-02:
docker node update --label-add app=frontend dca-wk-01 docker node update --label-add app=frontend dca-wk-02
Os labels são usados para classificar e realizar atualizações em nós no cluster Swarm.
Para remover um label utilize o comando docker node update
–label-rm label nome_do_nó.
Utilize a opção inspect para visualizar informações sobre o nó:
docker node inspect dca-manager [ { "ID": "an33bf4rlcod9j9faa8qgas45", "Version": { "Index": 9 }, "CreatedAt": "2024-10-08T17:07:49.213367934Z", "UpdatedAt": "2024-10-08T17:07:49.725129355Z", "Spec": { "Labels": {}, "Role": "manager", "Availability": "active" }, "Description": { "Hostname": "dca-manager", "Platform": { "Architecture": "x86_64", "OS": "linux" }, "Resources": { "NanoCPUs": 2000000000, "MemoryBytes": 4101947392 }, "Engine": { "EngineVersion": "27.3.1", "Plugins": [ { "Type": "Log", "Name": "awslogs" }, { "Type": "Log", "Name": "fluentd" }, { "Type": "Log", "Name": "gcplogs" }, { "Type": "Log", "Name": "gelf" }, { "Type": "Log", "Name": "journald" }, { "Type": "Log", "Name": "json-file" }, { "Type": "Log", "Name": "local" }, { "Type": "Log", "Name": "splunk" }, { "Type": "Log", "Name": "syslog" }, { "Type": "Network", "Name": "bridge" }, { "Type": "Network", "Name": "host" }, { "Type": "Network", "Name": "ipvlan" }, { "Type": "Network", "Name": "macvlan" }, { "Type": "Network", "Name": "null" }, { "Type": "Network", "Name": "overlay" }, { "Type": "Volume", "Name": "local" } ] }, "TLSInfo": { "TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBajCCARCgAwIBAgIUIWeyQQs+85CCjz+vMldWqiNWg90wCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjQxMDA4MTcwMzAwWhcNNDQxMDAzMTcw\nMzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABMQOV65DqvzSUg0LsmWUqCW4DiOt12qE4qz7h0H/edk77QZ9bmoLXrJb1NQZ\nYb/nyw1f+EcVvVMT8YKX8N3s60ajQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBTuvkpqoRx481dMwfWjo5ZCQ/cC2jAKBggqhkjO\nPQQDAgNIADBFAiEA+iJWg5jgEsS0Sf0C33KnzgJffZLgMQ1rDqEoP06JXzwCIGKl\nEOXbs5NAIlVIyMsL3QK3rIK9FOxt/m44AnWUJtZ1\n-----END CERTIFICATE-----\n", "CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh", "CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExA5XrkOq/NJSDQuyZZSoJbgOI63XaoTirPuHQf952TvtBn1uagteslvU1Blhv+fLDV/4RxW9UxPxgpfw3ezrRg==" } }, "Status": { "State": "ready", "Addr": "10.4.5.10" }, "ManagerStatus": { "Leader": true, "Reachability": "reachable", "Addr": "10.4.5.10:2377" } } ]
Utilize a opção inspect para filtrar informações sobre os labels do nó dca-wk-01:
docker node inspect --pretty dca-wk-01 | grep Labels -A 2
Para remover um Nó do Cluster, utilize a opção rm juntamente com a opção –force:
docker node rm dca-wk-02 --force
Alterne para a instância dca-wk-02 e abandone o Cluster através do seguinte comando:
docker swarm leave
Para ingressar novamente no Cluster, colete novamente o token na instância dca-manager:
docker swarm join-token worker
Antes de promover um Nó a Manager, liste os servidores que participam do Cluster:
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 * dca-manager Ready Active Leader 27.3.1 uo96zfyv1ysj4r59spapb4dte dca-wk-01 Ready Active 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
O valor Leader na coluna MANAGER STATUS define que o Nó é o gerente e realiza todo o gerenciamento do cluster. O valor Reachable significa que o nó é um nó gerente que participa do quórum. Se o nó líder ficar indisponível, ele estará qualificado para a eleição como o novo líder. O valor Unavailable significa que o nó é um gerente não pode se comunicar com outros gerentes.
Em nosso exemplo, vamos promover a instância dca-wk-01 para Nó Manager:
docker node promote dca-wk-01
Node dca-wk-01 promoted to a manager in the swarm.
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 * dca-manager Ready Active Leader 27.3.1 uo96zfyv1ysj4r59spapb4dte dca-wk-01 Ready Active Reachable 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Remova a função manager da instância dca-manager através da opção demote:
docker node demote dca-manager
Manager dca-manager demoted in the swarm.
Alterne para a instância dca-wk-01 que agora faz o papel de Manager e liste novamente os servidores que participam do Cluster:
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 dca-manager Ready Active 27.3.1 uo96zfyv1ysj4r59spapb4dte * dca-wk-01 Ready Active Leader 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Na instância dca-wk-01, promova a instância docker-manager a Nó Manager:
docker node promote dca-manager
Node dca-manager promoted to a manager in the swarm.
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 dca-manager Ready Active Reachable 27.3.1 uo96zfyv1ysj4r59spapb4dte * dca-wk-01 Ready Active Leader 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Remova a função Manager da instância dca-wk-01 através da opção demote:
docker node demote dca-wk-01
Manager dca-wk-01 demoted in the swarm.
Alterne para a instância dca-manager e liste os servidores que participam do Cluster:
docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION an33bf4rlcod9j9faa8qgas45 * dca-manager Ready Active Leader 27.3.1 uo96zfyv1ysj4r59spapb4dte dca-wk-01 Ready Active 27.3.1 6l66tu6no37aug0dchc6nln2i dca-wk-02 Ready Active 27.3.1
Descriçao dos Comandos
Um serviço é a definição das tarefas a serem executadas nos nós manager ou worker. É a estrutura central do sistema do cluster Swarm e a raiz principal da interação do usuário com o Swarm.
Uma tarefa é uma instância de uma imagem de aplicativo em um nó em execução. Uma tarefa pode ser criada manualmente ou através de um serviço.
No modelo de serviços replicados, o manager distribui um número específico de tarefas de réplica entre os nós, com base na escala que você definiu no estado desejado.
Para serviços globais, o swarm executa uma tarefa para o serviço em cada nó disponível no cluster.
Uma tarefa carrega um container do Docker e os comandos para serem executados dentro do container. É a unidade de programação atômica do Swarm. Os nós manager atribuem tarefas aos nós worker, de acordo com o número de réplicas definidas na escala de serviço. Quando uma tarefa é atribuída a um nó, ela não pode ser movida para outro nó. Ele só pode ser executado no nó atribuído ou falhar.
Uma tarefa é a unidade atômica de agendamento dentro de um cluster Swarm. Quando você declara um estado de serviço desejado, criando ou atualizando um serviço, o orquestrador percebe o estado desejado agendando tarefas. Por exemplo, você define um serviço que instrui o orquestrador a manter três instâncias HTTP Server em execução. O orquestrador responde criando três tarefas. Cada tarefa é um slot que o agendador preenche, gerando um container. O container é a instanciação da tarefa. Se uma tarefa de HTTP Server falhar em sua verificação de integridade ou travar, o orquestrador criará uma nova tarefa de réplica que gerará um novo container.
Existem dois tipos de implantações de serviços: replicados e globais.
Para um serviço replicado, você especifica o número de tarefas idênticas que deseja executar. Por exemplo, você decide implantar um serviço HTTP com três réplicas, cada um servindo o mesmo conteúdo.
Já o serviço global, é um serviço que executa uma tarefa em cada nó. Não há um número pré-especificado de tarefas. Cada vez que você adiciona um nó ao cluster Swarm, o orquestrador cria uma tarefa e o agendador atribui a tarefa ao novo nó.
Bons candidatos para serviços globais são agentes de monitoramento, um antivírus ou outros tipos de containers que você deseja executar em todos os nós do cluster Swarm.
Para criar um serviço no cluster Swarm, execute o comando:
docker service create --name web nginx q434dsy2jjszcwn29np0zasaj overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service q434dsy2jjszcwn29np0zasaj converged
docker service ls ID NAME MODE REPLICAS IMAGE PORTS q434dsy2jjsz web replicated 1/1 nginx:latest
Para exibir detalhes de um serviço no Cluster, execute o seguinte comando:
docker service inspect --pretty web ID: q434dsy2jjszcwn29np0zasaj Name: web Service Mode: Replicated Replicas: 1 Placement: UpdateConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Update order: stop-first RollbackConfig: Parallelism: 1 On failure: pause Monitoring Period: 5s Max failure ratio: 0 Rollback order: stop-first ContainerSpec: Image: nginx:latest@sha256:d2eb56950b84efe34f966a2b92efb1a1a2ea53e7e93b94cdf45a27cf3cd47fc0 Init: false Resources: Endpoint Mode: vip
Para atualizar um serviço expondo uma porta no container, execute o seguinte comando:
docker service update --publish-add 80 web web overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service web converged
docker service ls ID NAME MODE REPLICAS IMAGE PORTS q434dsy2jjsz web replicated 1/1 nginx:latest *:30000->80/tcp
O Docker Swarm utiliza como padrão o modo ingress, que permite o acesso a aplicação NGINX, em todos os Nós do Cluster através de seu IP e uma porta aleatório criada.
Para atualizar a quantidade de réplicas, execute o seguinte comando:
docker service scale web=2 web scaled to 2 overall progress: 2 out of 2 tasks 1/2: running [==================================================>] 2/2: running [==================================================>] verify: Service web converged
docker service ls ID NAME MODE REPLICAS IMAGE PORTS q434dsy2jjsz web replicated 2/2 nginx:latest *:30000->80/tcp
Utilize o subcomando ps para listar a quantidade de containers no serviço:
docker service ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zsx5ycycjgu3 web.1 nginx:latest dca-manager Running Running 4 minutes ago 79qodtvagrtu \_ web.1 nginx:latest dca-wk-02 Shutdown Shutdown 4 minutes ago fmnlu450p6vt web.2 nginx:latest dca-wk-02 Running Running about a minute ago
Para reverter uma mudança em um serviço, execute o seguinte comando:
docker service rollback web web rollback: manually requested rollback overall progress: rolling back update: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service web converged
docker service ls ID NAME MODE REPLICAS IMAGE PORTS q434dsy2jjsz web replicated 1/1 nginx:latest *:30000->80/tcp
Para remover um serviço utilize a opção rm:
docker service rm web
web
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
Crie novamente o serviço de nome webserver, só que agora mudando o modo de replicação para global:
docker service create --name webserver --mode global httpd 5l4ez5deqygam0qu62drvp2il overall progress: 3 out of 3 tasks 6l66tu6no37a: running [==================================================>] uo96zfyv1ysj: running [==================================================>] an33bf4rlcod: running [==================================================>] verify: Service 5l4ez5deqygam0qu62drvp2il converged
docker service ls ID NAME MODE REPLICAS IMAGE PORTS 5l4ez5deqyga webserver global 3/3 httpd:latest
No modo global o serviço cria um container em cada nó do Cluster.
Para visualizar logs utilize a opção logs:
docker service logs webserver webserver.0.qsxavutp7vsv@dca-manager | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.qsxavutp7vsv@dca-manager | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.qsxavutp7vsv@dca-manager | [Wed Oct 09 12:34:50.857364 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) configured -- resuming normal operations webserver.0.qsxavutp7vsv@dca-manager | [Wed Oct 09 12:34:50.857825 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND' webserver.0.mh0j9rtbukqv@dca-wk-01 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.mh0j9rtbukqv@dca-wk-01 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.mh0j9rtbukqv@dca-wk-01 | [Wed Oct 09 12:34:57.814139 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) configured -- resuming normal operations webserver.0.mh0j9rtbukqv@dca-wk-01 | [Wed Oct 09 12:34:57.814223 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND' webserver.0.l9myctsgokik@dca-wk-02 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.l9myctsgokik@dca-wk-02 | AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message webserver.0.l9myctsgokik@dca-wk-02 | [Wed Oct 09 12:34:56.746158 2024] [mpm_event:notice] [pid 1:tid 1] AH00489: Apache/2.4.62 (Unix) configured -- resuming normal operations webserver.0.l9myctsgokik@dca-wk-02 | [Wed Oct 09 12:34:56.746271 2024] [core:notice] [pid 1:tid 1] AH00094: Command line: 'httpd -D FOREGROUND'
Para acompanhar, em tempo real, os logs de um serviço utilize a opção –follow ou -f:
docker service logs --follow webserver
Utilize as teclas Ctrl + c para destravar o terminal.
docker service rm webserver
webserver
Para criar um serviço limitando o uso de 20% de 1 CORE do processador e uso de 512 de memória RAM, execute o seguinte comando:
docker service create --name web --publish target=80,published=80 --replicas=3 --limit-cpu 0.2 --limit-memory 256M nginx ra0bviqewagnq6akyl13dlvul overall progress: 3 out of 3 tasks 1/3: running [==================================================>] 2/3: running [==================================================>] 3/3: running [==================================================>] verify: Service ra0bviqewagnq6akyl13dlvul converged
docker service inspect web | grep Resources -A 3 "Resources": { "Limits": { "NanoCPUs": 200000000, "MemoryBytes": 268435456
docker service rm web
web
Descrição dos Comandos e Opções
–pretty, exibe os detalhes de forma resumida;As restrições (Constraints) no cluster Swarm são usadas para limitar os nós nos quais um contêiner pode ser executado. Existem dois tipos de restrições:
As restrições podem ser especificadas ao criar um serviço ou ao adicionar um nó ao cluster Swarm.
Para demonstrar o uso de contrains, vamos criar um serviço de nome webserver e limitar seu agendamento somente em nós que possuam o label app=backend:
docker service create --name webserver --replicas 1 --publish 8000:80 --constraint node.labels.app==backend nginx
docker service ps webserver
Para migrar a réplica para um outro nó no cluster, vamos atualizar o serviço webserver:
docker service update --constraint-rm node.labels.app==backend --constraint-add node.labels.app==frontend webserver
docker service ps webserver
Verifique o estado de cada Nó do Cluster Swarm:
docker node ls
Atualize o serviço webserver para trabalhar com 2 réplicas:
docker service scale webserver=2