Conceitos de docker e docker swarm
Tags: docker
Published: 2020-10-03 13:41:39

>Nesse artigo vamos abordar alguns conceitos fundamentais na hora de entender container e orquestração.

### Irei passar conceitos e práticas dos seguintes assuntos:
* Tipos de instâncias(nodes).
* Status de um node.
* Labels.
* Secret.
* Services.
* Load Balancer.
* Volumes.
* Networks.

**1. Tipos de instâncias.**
No *swarm* temos 2 tipos de nodes _workers_ e os *managers*, os nodes *workers* executam os *serviços* delegados a eles e não é possível fazer nenhuma alteração em nosso cluster, os *managers* permite alterar o cluster, gerenciar os *serviços* e cuidam da saúde do cluster, caso algum container fique indisponível por algum motivo é ele que têm o papel de criar um novo container.

Para promover um node *worker* para *manager* utiliza-se o comando: `docker node promote <hostname ou id do node>` e para rebaixar um node manager: `docker node demote <hostname ou id do node>`

**2. Status de um node.**
Os nodes podem está em três estados, *active*, *pause* e *drain*. O status *active* sinaliza que está tudo certo com a saúde do node e que pode executar tarefas. Já o status *pause* o node fica impossibilitado de receber novas tarefas mas continuam a execução das que estão em execução, e por fim o status *drain* na maioria das vezes é utilizado quando precisamos fazer manutenção nessa instância, mata todos containers em execução, transferem para outros nodes ativos e é impossibilitado de executar novas tarefas.

Para alterar o status de um node: `docker node update --availability <active|pause|drain> <hostname | id do node>`

**3. Labels de um node.**
Os *labels* são rótulos *chave=valor* que podemos implementar em nossos node afim de identifica-los para uma possível regra de execução dos services, podemos rodar um serviço especifico apenas em nodes com determinada *label*.

Para adicionar uma label a um node: `docker node update --label-add <chave=valor> <hostname | id do node>`

**4. Secrets de um node.**
São dados que não podem ser colocados diretamente na aplicação, transmitidos por uma rede ou expostas em algum dockerfile, pode ser senhas, certificados ssl, chaves privadas ssh. Os *secrets* só é visível pelos serviços que possuem o acesso ao mesmo e apenas enquanto estiver em execução.

Para criar um secret: `docker secret create <nome do seecret> <diretório do arquivo>`
Por exemplo: `printf "This is a secret" | docker secret create my_secret_data -`
Para criar um serviço que utilize esse segredo:
`docker service  create --name redis --secret my_secret_data redis:alpine`
Os segredos podem ser acessados pelo serviço no diretório: `/run/secrets/<secret_name>`

**5. Services.**
Um *service* é composto por um ou mais containers, é na criação dele que escolhemos qual imagem utilizar, quais comandos rodar ao subir o serviço, quais as portas expostas, os secrets a serem utilizados, regras de onde será executado, limite de cpus e memórias, número de replicas que deverá está em execução, irei dar um exemplo básico pois existe bastantes configurações, irei abordar mais a fundo algumas configurações quando criarmos uma stack de serviços.

Para criar um serviço:
`docker service create --name my_web nginx`

**6. Load Balancer.**
Load balancer é a técnica de distribuir a carga de trabalho das requisições entre os containers que estão em execução, podemos fazer essa distribuição com o *nginx*, *traefik*, LB de um provedor, entre outros.

**7. Volumes**
Quando falamos de *volumes* no docker estamos falando de um método de persistir e acessar dados dentro dos containers. Com os volumes podemos persistir dados importantes e compartilhar esses dados entre containers caso necessário. Como estamos trabalhando com o swarm temos que utilizar alguma técnica de compartilhamento desse volume, podemos utilizar o S3 ou utilizar algum plugin.

Criando volumes junto com um serviço:
`docker service create --name <nome do service> --mount type=volume,src=<nome do volume>,dst=<local destino no container> nginx` obs: criando dessa maneira apenas o node que criou o serviço terá "acesso" a esse volume, então como visto acima devemos utilizar o S3 como compartilhamento de dados ou utilizar algum plugin.

**8. Networks**
As redes no docker facilitam a comunicação entre containers e ambientes externos, temos alguns tipos de rede no docker:
- *bridge* é a rede padrão quando não especificamos nada na hora da criação dos nossos containers, seu caso de uso é quando precisamos conectar vários containers que estão no mesmo docker host.
- *none* é a ausência de rede, utilizado para isolar um container de comunicação externa.
- *overlay* é utilizada quando precisamos conectar a diferentes docker host ou quando temos muitos serviços em nosso cluster swarm. É um assunto bem extenso e necessita de atenção, pois estamos tratando de comunicação, então mais atenção quanto a segurança.

Para criarmos uma rede no docker:
`docker network create --driver=<driver a ser utilizado> <nome da rede>`

Enfim pessoal, o próximo artigo será mais prático e o assunto abordado será **volumes**.

##Referências
[Documentação Docker](https://docs.docker.com/)
[Ótimo livro sobre Docker](https://stack.desenvolvedor.expert/appendix/docker/)