Docker Swarm


O conteúdo a seguir descreve um breve resumo sobre docker swarm, vale a pena relembrar que os conceitos básicos do docker são altamente utilizados, tal como a escrita de Dockerfile’s e docker-compose.yaml’s.

Me agradeça depois http://labs.play-with-docker.com/

Files: Docker_Swarm_Arquivo

Docker Swarm

Basicamente vai ‘clusterizar’ os containers de maneira ‘redundante’ de modo que seja possível aumentar ou reduzir o número de conatiners - scale up / scale down de mandeira simples.

Quando se inicia o docker swarm a máquina (sim a máquina ou a vm o que quer que seja) se torna parte de um ‘cluster’, nao sei ao certo o limite de máquinas por clusters mas de alguma maneira mágica o swarm irá tomar conta de iniciar as instância e cuidar de qualquer coisa relacionada a ele:

  • loadbalancers
  • ip virtuais
  • volumes
  • portas

No entanto é possível utilizar o docker normalmente sem o swarm - mesmo com o swarm rodando

Assim é possível adicionar ‘quantos nós se queira’ e assim ao iniciar o processo de ‘service’ - serviços o docker swarm irá escolher os nós e iniciar os containers nele, entenda que o swarm cuidará de:

  • Criar ips
  • Criar volumes
  • Fazer o downloads das images*
  • Criar um loadbalancer para encaminhar o tráfego dos nós para as respectivas instâncias*
  1. via docker pull, uma build image de um nó não é compartilhada pelos outros, caso necessário use docker save / docker load para compartilhar as imagens
  2. essa é a mágica de verdade, não importa em qual nó do cluster você acesse, ele irá encaminhar o tráfego ao um dos nós que possua o serviço / container procurado.

Topologia

Ao iniciar o docker swarm é gerado um token e o mesmo, por padrao, se torna uma ‘manager’ ou ‘leader’ que irá gerenciar os ‘nodes’ conectados a ele. Node é qualquer máquina que se conecte a um docker swarm manager, ele não podera rodar comandos docker swarm pois não tem privilégios, apenas recebe os comandos do leader/manager

Vale a pena dizer que todos os participantes de um cluster podem ser leader, não restrições, no entanto não é uma prática muito utilizada.

Manager/Leader

Tem a função de gerenciar e criar as redes / containers dentro dos outros nós e em sí mesmo, a manager também rodará containers

Mãos a obra

Nesse pequeno exemplo iremos utilizar 4 vms com o docker-ce instalado (já vem com o swarm junto), teremo 2 managers e 2 nós e rodaremos um simples alpine com ping.

Está tudo certo?

    --- node1 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.067/0.067/0.067 ms
    [node1] (local) root@10.0.25.3 ~
    $ ping -c 1 node2
    PING node2 (10.0.25.4): 56 data bytes
    64 bytes from 10.0.25.4: seq=0 ttl=64 time=0.510 ms

    --- node2 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.510/0.510/0.510 ms
    [node1] (local) root@10.0.25.3 ~
    $ ping -c 1 node3
    PING node3 (10.0.25.5): 56 data bytes
    64 bytes from 10.0.25.5: seq=0 ttl=64 time=0.545 ms

    --- node3 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.545/0.545/0.545 ms
    [node1] (local) root@10.0.25.3 ~
    $ ping -c 1 node4
    PING node4 (10.0.25.6): 56 data bytes
    64 bytes from 10.0.25.6: seq=0 ttl=64 time=0.562 ms

    --- node4 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.562/0.562/0.562 ms
    [node1] (local) root@10.0.25.3 ~

Sim!

Iniciando Docker Swarm

Manager

    [node1] (local) root@10.0.25.3 ~
    $ docker swarm init --advertise-addr 10.0.25.3
    Swarm initialized: current node (vwpdqjrby2jqjwrh5up0jqrq3) is now a manager.
To add a worker to this swarm, run the following command:
        docker swarm join \
        --token SWMTKN-1-1n0x18tqo0byx7nrso8s1akqd4chtgtegtnhtwdybadaz5slm9-5ktat0y4gcg6iila03i589o9y \
        10.0.25.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Nós

    [node2] (local) root@10.0.25.4 ~
    $ docker swarm join \
    >     --token SWMTKN-1-1n0x18tqo0byx7nrso8s1akqd4chtgtegtnhtwdybadaz5slm9-5ktat0y4gcg6iila03i589o9y \
    >     10.0.25.3:2377
    This node joined a swarm as a worker.

    [node3] (local) root@10.0.25.5 ~
    $ docker swarm join \
    >     --token SWMTKN-1-1n0x18tqo0byx7nrso8s1akqd4chtgtegtnhtwdybadaz5slm9-5ktat0y4gcg6iila03i589o9y \
    >     10.0.25.3:2377
    This node joined a swarm as a worker.

    [node4] (local) root@10.0.25.6 ~
    $ docker swarm join \
    >     --token SWMTKN-1-1n0x18tqo0byx7nrso8s1akqd4chtgtegtnhtwdybadaz5slm9-5ktat0y4gcg6iila03i589o9y \
    >     10.0.25.3:2377
    This node joined a swarm as a worker.

Verificando

    [node1] (local) root@10.0.25.3 ~
    $ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
    9ggt09ftl8s4ugm6awbdz3xww     node4               Ready               Active
    n2xks4t5hubgyr8ity7wlzpgo     node3               Ready               Active
    umgn109ken9bkfz5skq0ab0iu     node2               Ready               Active
    vwpdqjrby2jqjwrh5up0jqrq3 *   node1               Ready               Active              Leader