Table of Contents

Orquestrando ambiente com Docker Swarm

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.

Managers e Workers Nodes

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.

Nó Manager

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.

Nó Worker

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.

Criando Cluster com Docker Swarm

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

FIXME 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

Gerenciamento de Nodes no Cluster Swarm

Listar nós

É 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

FIXME 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.

Definir labels

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

FIXME 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ó.

Inspecionar o 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

Remover nó do Cluster

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

Promoção dos nodes no Cluster

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

FIXME 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

Reverter promoção de um Node

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

Serviços e Tarefas

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.

How services work

Tarefas e agendamento

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.

Tasks and scheduling

Serviços replicados e globais

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.

Gerenciar serviço no Cluster Swarm

Criar Serviço

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

Atualizar Serviço

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

FIXME 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.

Escalonar Serviço

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 

Rollback de Serviço

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

Remover Serviço

Para remover um serviço utilize a opção rm:

docker service rm web
web
docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

Alterar o modo de replicação em um serviço

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

FIXME No modo global o serviço cria um container em cada nó do Cluster.

Visualizar Logs de Serviço

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

FIXME Utilize as teclas Ctrl + c para destravar o terminal.

docker service rm webserver
webserver

Limitar recursos computacionais a um Serviço

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

Gerenciar Constraints no Cluster Swarm

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

Realizar manutenção no Cluster Swarm

Estado do nó

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

Estado Pause