====== 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**
* docker swarm –help: Lista as opções do subcomando docker swarm e sua descrição;
* docker swarm init: Inicializa um Cluster Swarm no Docker;
* docker swarm join: Permite ingressar o No no Cluster Swarm;
* docker swarm join-token: Exibe o comando que deve ser executado para ingressar no Cluster Swarm;
* docker node ls: Lista os Nós disponíveis no Cluster.
===== 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**
* **docker node update**: Atualiza informações de um Nó no Cluster Swarm;
* **docker node inspect**: Exibe informações detalhadas de um Nó no Cluster Swarm;
* **docker node rm**: Remove o No de um Cluster Swarm;
* **docker swarm leave**: Permite que o Nó abandone o Cluster Swarm;
* **docker node promote**: Permite promover um Nó a Manager do Cluster Swarm;
* **docker node demote**: Permite rebaixar um Nó Manager do Cluster Swarm.
===== 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.
[[https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/|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.
[[https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/|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**
* **docker service --help**: Lista as opções do subcomando docker service e sua descrição;
* **docker service create**: Cria um serviço no Cluster Swarm; docker service ls: Lista serviços, disponíveis no Cluster Swarm;
* **docker service inspect**: Exibe detalhes de um serviço no Cluster Swarm. A opção ''--pretty'', exibe os detalhes de forma resumida;
* **docker service scale**: Permite escalonar o serviço, aumentando a quantidade de containers que atenderão o seu serviço;
* **docker service ps**: Lista serviços disponíveis no Cluster Swarm;
* **docker service rollback**: Permite reverter para a versão anterior de um serviço. Depois de executar este comando, o serviço e revertido para a configuração que estava em vigor antes do comando docker service update mais recente;
* **docker service logs**: Visualiza os logs de um serviço, disponível no Cluster Swarm;
* **docker service rm**: Remove um serviço disponível no Cluster Swarm.
* **--limit-cpu**: Aceita um número decimal como argumento e limita os recursos da CPU de um serviço;
* **--limit-memory**: Leva bytes como argumento, por exemplo 2G e limita o uso de memória a esse valor;
* **--reserve-cpu**: Reserva uma quantidade específica de recursos da CPU para o serviço;
* **--reserve-memory**: Reserva uma quantidade específica de recursos de memória para o serviço.
===== 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:
* Restrições do nó: São restrições no próprio nó (por exemplo, node.role==worker);
* Restrições do Docker: São restrições no nó que executa o daemon do Docker (por exemplo, engine.labels.operatingsystem==ubuntu 16.04).
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 ====