Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?

Configurando Controlador/OCR em Docker Swarm

Uma guia para configuração.

Antes da instalação


Todas as maquinas deverão estar com docker devidamento instalados. Os exemplos abaixo se baseiam na instalação na distro Linux CentOS

Instale o Docker-Compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Desabilitar o firewall de todas as maquinas que irão participar do Swarm

sudo systemctl stop firewalld.service && \
sudo systemctl disable firewalld.service

Adicionar usuário para ter permissão de executar o docker sem o sudo e habilitar o docker como serviço

curl -fsSL https://get.docker.com -o get-docker.sh && \
sudo sh get-docker.sh  && \
sudo usermod -aG docker $USER && \
sudo systemctl enable docker

Inicializando Docker Swarm em todas as maquinas


Para inicar o Docker Swarm basta "eleger" qual das maquinas será a lider do Swarm e executar o script abaixo

docker swarm init --advertise-addr <IP da maquina lider>

Atenção: A instrução acima somente deverá ser executada na maquina lider, as demais maquinas não deve executar esta instrução

A instrução acima irá gerar um resultado parecido como o abaixo:

docker swarm join --token <Token> <IP:Porta>

Esse resultado deve ser guardado e executado nas demais maquinas que irão fazer parte do Swarm.

Após os passos acima, na maquina lider, execute o código abaixo para visualizar quais nós fazem parte do Docker Swarm.

docker node ls

Configurando network para funcionamento dos containers


Todos os containers dessa solução devem estar na mesma rede do Docker Swarm para todos "enxergarem". A instrução abaixo criar a rede que será utilizada pelos containers.

docker network create -d overlay <Nome da rede>

Atenção: Esta é a rede que será utilizada pelos demais containers. Caso seu nome seja alterado deverá ser alterado nas Stack YML

Configurando Portainer


O Portainer é uma ferramenta que analisa Stacks, Serviços e Containers. Para sua instação basta executar o script abaixo na maquina lider

curl -L https://downloads.portainer.io/portainer-agent-stack.yml -o portainer-agent-stack.yml && \
docker stack deploy --compose-file=portainer-agent-stack.yml portainer

Configurando Zookeeper


Zookeeper e Kafka para uma melhor escalabilidade e segurança devem ser configurados em cluster. Na maquina lider criar a Stack YML abaixo chamada "zoo-stack.yml".

version: '3.1'

services:
  zoo1:
    image: zookeeper
    hostname: zoo1
    networks:
      - <Nome da rede>
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 1>
    volumes:
      - /home/digix/docker/volumes/zookeeper/datalog:/datalog
      - /home/digix/docker/volumes/zookeeper/data:/data

  zoo2:
    image: zookeeper
    hostname: zoo2
    networks:
      - <Nome da rede>
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 2>
    volumes:
      - /home/digix/docker/volumes/zookeeper/datalog:/datalog
      - /home/digix/docker/volumes/zookeeper/data:/data

  zoo3:
    image: zookeeper
    hostname: zoo3
    networks:
      - <Nome da rede>
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 3>
    volumes:
      - /home/digix/docker/volumes/zookeeper/datalog:/datalog
      - /home/digix/docker/volumes/zookeeper/data:/data

networks:
  <Nome da rede>:
    external: true

No YML acima, pode ser visto que foi criado 3 serviços do Zookeeper. Cada serviço tem seu ID e está alocado em uma maquina diferente. Isso faz com que em caso de queda de um dos serviços, o Zookeeper consiga continuar de pé. O mesmo irá acontecer com o YML do Kafka

Atenção: Quando o Zookeeper está configurado em cluster em 3 serviços, ele somente irá continuar em pé quando apenas um serviço cai. Se mais serviço ficam fora, o Zookeeper não consegue gerenciar mais. O mesmo acontece para 5 serviços configurados, ele consegue gerencia no máximo com 2 serviços fora. Se 3 serviços estão fora ele já não consegue gerenciar mais.

Conforme pode ser visto no YML acima, existem pastas internas que devem existir antes da execução da Stack. Estas pastas são chamadas de volumes e são sincronizadas com a pasta do container. Isso é importante por que em caso de falha do container, os arquivos estão seguros

    - /home/digix/docker/volumes/zookeeper/datalog
    - /home/digix/docker/volumes/zookeeper/data

Atenção: Estas pastas devem serem criadas em todas as maquinas que fazem parte do Docker Swarm

Para criar a Stack do Zookeeper basta executar o comando abaixo:

docker stack deploy -c zoo-stack.yml zoo

O comando abaixo é para validar se a stack foi criada com sucesso.

docker service ls

Configurando Kafka


Na maquina lider criar a Stack YML abaixo chamada "kafka-stack.yml".

version: '3.7'
services:
  kafka-1:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9091
        published: 9091
        protocol: tcp
        mode: host
    networks:
      - <Nome da rede>
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 1
      HOSTNAME_COMMAND: "docker info | grep ^Name: | cut -d' ' -f 2"
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka-1:9092,OUTSIDE://{{.Node.Hostname}}:9091
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9091
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_DELETE_TOPIC_ENABLE: "true"
      KAFKA_LOG_ROLL_HOURS: 24
      KAFKA_LOG_RETENTION_HOURS: 24
      KAFKA_LOG_DIR: /data
      KAFKA_LOG_DIRS: /data
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_LOG_RETENTION_BYTES: -1
      KAFKA_COMPRESSION_TYPE: "gzip"
      KAFKA_CONTROLLED_SHUTDOWN_ENABLE: "true"
      KAFKA_CONTROLLED_SHUTDOWN_MAX_RETRIES: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 3000
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 1>
    volumes:
      - /home/digix/docker/volumes/kafka:/data

  kafka-2:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9091
        published: 9091
        protocol: tcp
        mode: host
    networks:
      - <Nome da rede>
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 2
      HOSTNAME_COMMAND: "docker info | grep ^Name: | cut -d' ' -f 2"
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka-2:9092,OUTSIDE://{{.Node.Hostname}}:9091
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9091
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_DELETE_TOPIC_ENABLE: "true"
      KAFKA_LOG_ROLL_HOURS: 24
      KAFKA_LOG_RETENTION_HOURS: 24
      KAFKA_LOG_DIR: /data
      KAFKA_LOG_DIRS: /data
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_LOG_RETENTION_BYTES: -1
      KAFKA_COMPRESSION_TYPE: "gzip"
      KAFKA_CONTROLLED_SHUTDOWN_ENABLE: "true"
      KAFKA_CONTROLLED_SHUTDOWN_MAX_RETRIES: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 3000
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 2>
    volumes:
      - /home/digix/docker/volumes/kafka:/data

  kafka-3:
    image: wurstmeister/kafka:latest
    ports:
      - target: 9091
        published: 9091
        protocol: tcp
        mode: host
    networks:
      - <Nome da rede>
    depends_on:
      - zoo1
      - zoo2
      - zoo3
    environment:
      KAFKA_BROKER_ID: 3
      HOSTNAME_COMMAND: "docker info | grep ^Name: | cut -d' ' -f 2"
      KAFKA_ZOOKEEPER_CONNECT: "zoo1:2181,zoo2:2181,zoo3:2181"
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka-3:9092,OUTSIDE://{{.Node.Hostname}}:9091
      KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:9091
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_DELETE_TOPIC_ENABLE: "true"
      KAFKA_LOG_ROLL_HOURS: 24
      KAFKA_LOG_RETENTION_HOURS: 24
      KAFKA_LOG_DIR: /data
      KAFKA_LOG_DIRS: /data
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_LOG_RETENTION_BYTES: -1
      KAFKA_COMPRESSION_TYPE: "gzip"
      KAFKA_CONTROLLED_SHUTDOWN_ENABLE: "true"
      KAFKA_CONTROLLED_SHUTDOWN_MAX_RETRIES: 3
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 3000
    deploy:
      mode: global
      placement:
        constraints:
          - node.hostname == <Nome da maquina 3>
    volumes:
      - /home/digix/docker/volumes/kafka:/data

networks:
  <Nome da rede>:
    external: true

Conforme pode ser visto no YML acima, existem pastas internas que devem existir antes da execução da Stack. Estas pastas são chamadas de volumes e são sincronizadas com a pasta do container. Isso é importante por que em caso de falha do container, os arquivos estão seguros

    - /home/digix/docker/volumes/kafka:/data

Atenção: Estas pastas devem serem criadas em todas as maquinas que fazem parte do Docker Swarm

Para criar a Stack do Kafka basta executar o comando abaixo:

docker stack deploy -c kafka-stack.yml kafka

O comando abaixo é para validar se a stack foi criada com sucesso.

docker service ls
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.