Docker um canivete suíço em RaspberryPI

Criando um Cluster com Docker Swarm e RaspberryPI 3

Thiago Soares
Docker: Um canivete suíço
5 min readMar 16, 2020

--

Como é difícil a escolha de ter que fazer a monografia no curso de Ciências da Computação!, tantas matérias estudadas, várias áreas novas surgindo e vários campos de interesse diferentes. Bem resolvi me aventurar por um mundo desconhecido de uma tecnologia que estava sendo lançada na época, o Docker.
Peguei essa tecnologia para estudar e fazer uma aplicação prática dela, mas não sabia o tamanho do buraco que estava entrando r; pois bem resolvi pegar uma aplicação simples somente para estudo de caso, e até em uma linguagem que não dominava na época, o Ruby, para poder fazer algo bem desruptivo e ter o máximo de aprendizado! Logo não sabia que iria ter o máximo de sofrimento também! Sim, mas só fui descobrir ao longo do caminho e já não podia retornar mais, até porque adoro um desafio.

Pois bem, por que escolher o Docker?

A resposta é simples, estava querendo muito aprender sobre micro-serviços e Cloud, vi no Docker uma boa oportunidade para isso, e sem falar que ser homogêneo em qualquer ambiente, brilhava aos meus olhos! Qualquer Desenvolvedor já dever ter passado por problemas de o seu código não rodar em tal sistema/ambiente … o Docker acaba com isso!.

Docker um canivete suíço em Raspberry Pi

Então, aonde rodar o projeto que estava a fim de fazer? Grande pergunta pra mim! Se rodasse na minha máquina estava sendo infiel ao que queria provar, então vi um projeto de aprendizagem para crianças ao desenvolvimento, o Raspberry Pi.
Pensei, se eu consegui fazer rodar nessa máquina com poucos recursos, estou provando o meu caso de uso, provando que o Docker realmente funciona em qualquer ambiente. Comecei os trabalhos! pesquisando, comprando minhas primeiras placas(2), pois achei que podia queimar alguma, escrevendo a monografia.
O código da API, foi cedido por um colega que estava fazendo uma POC (prova de conceito), a minha idéia também era uma POC, então veio a calhar!, bem tudo foi feito com autorização é claro!; eu parei o código bem ao início da POC.
Comecei escrevendo os meus scripts do Docker para o MacBook, que fazia nas horas vagas.
Quando o meu primeiro “build” funcionou, fiquei muito feliz! mal sabia eu que no Raspberry Pi, nada iria funcionar! Por um detalhe que me passou despercebido de início, o processador!. O Raspberry PI usa o ARM, esse tipo de processador não entende as instruções dos processadores para Notebook (Intel, AMD etc), então eu tive que reescrever todo o meu script para essa arquitetura, foi complexo! muita tentativa e erro, como ele possui pouco processamento e memória, os meus “builds” demoravam um bom tempo para rodar(horas) e por fim quebrar … foram meses nesse sofrimento e agonia!

Porém quando funcionou, jamais esquecerei essa data e hora!

Bem, mais você deve estar se perguntando, porquê do meu desespero? Pois bem, no meio do caminho eu quis fazer algo além. Criar um cluster com os micro-serviços que estava construindo.
Isso mesmo, eu mudei a minha monografia no meio do caminho, tive que reescrever uma boa parte dela, mas não me arrependo da decisão.
O mais difícil para a construção, confesso que o foi o Ruby, pois tive que aprender a fazer a instalação do Ruby na unha, grande aprendizado! mas depois consegui fazer com RVM e tudo fluiu bem:

# Install RVM, Ruby, and Bundler
RUN \curl -sSL https://rvm.io/mpapis.asc | gpg — import -
RUN \curl -L http://get.rvm.io | bash -s stableRUN /bin/bash -l -c “source /etc/profile.d/rvm.sh”
RUN /bin/bash -l -c “rvm install 2.3.3”
RUN /bin/bash -l -c “gem install bundle — no-ri — no-rdoc”

Depois, parti para os scripts de deploy do cluster usando o Swarm, segue uma pequena parte de deploy:

#service deployment deploy:
mode: replicated
replicas: 1
labels: [APP=API]
#service resource management
resources:
#Hard limit — Docker does not allow to allocate more
limits:
cpus: ‘2.25’
memory: 512M
#Soft limit — Docker makes best effort to return to it
reservations:
cpus: ‘1.25’
memory: 256M
#service restart policy
restart_policy:
condition: on-failure
#delay: 5s
max_attempts: 10
window: 120s
#service update configuration
update_config:
parallelism: 1
delay: 5s
failure_action:
continue monitor: 10s
max_failure_ratio: 0.3
#placement constraint — in this case on ‘worker’ nodes only
placement:
constraints: [node.role == manager]

O Swarm é um orquestrador de containers, ele não é muito famoso, creio que o Kubernets seja mais hoje em dia.
Eu achei o Swarm um canivete suíço, por isso o título da monografia, ele me deu muitas informações sobre os serviços rodando nele, e muitos poder de ação, para o momento era muito bom.
O pior foi aprender os conceitos e como fazer tudo se interligar; remover da api configurações de banco em arquivo e reescrevê-las usando informações do ambiente(environments) é um desses exemplos:

Eu quis deixar tudo automatizado, e mais simples possível. Acabei por fim, tendo que fazer algumas alterações na própria API, para fazer tudo funcionar.

O meu conhecimento melhorou bastante depois que passei algumas horas no play do Docker, esse projeto me ajudou bastante e recomendo para todos aqueles que estão em estágios iniciais e queiram aprender.
Outra recomendação de dou é para anotar os comandos, para não se perder e/ou esquecer, eu o fiz no Github do projeto.

Vantagens

As maiores vantagens do Docker, são o fato de não precisar se preocupar com a instalação de libs/dependências no ambiente da sua máquina e causar incompatibilidades, poder usar diferentes sistemas operacionais, a portabilidade, poder gerar uma imagem e distribuir (Docker Hub) e poder criar ambientes por script.

Desvantagens

As maiores desvantagens do Docker são a curva de aprendizagem (depende do que se queira realizar), o fato de ter que montar o ambiente por script é uma desvantagem para usuários sem conhecimentos de Linux e ter que adequar a aplicação ao Docker.

Resultado

Bem o resultado de meio período sem dormir e muito conhecimento está na imagem abaixo!Formado Bacharel em Ciências da Computação!!

Segue o repositório do projeto:
https://github.com/tsoarescruz/Docker_cluster_project

--

--