Docker

Artigo, tutorial e pequeno depoimento de experiência sobre o uso de containers Docker em um ambiente de produção!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


1. Introdução

No começo do ano fiz uma publicação introdutória sobre o que são os containers – ou contêineres – em sistemas Linux. Caso não tenha lido ainda, recomendo clicando aqui!

Hoje vamos sair da teoria e ir à prática: Comecei a estudar e aprofundar em Docker® – por uma série de fatores mas principalmente a licença permissiva e flexibilidade de configurações antes ao Kubernetes e outros, além da vasta documentação – e quero trazer aqui um misto de artigo, tutorial e relatar minha experiência levando os containers para meus servidores de produção!

2. Senta, que lá vem história!

Quando fiz o primeiro artigo sobre os containers, eu não tive muito interesse real em mexer com eles. Muito preconceito meu, por pensar que esses containeres seriam bons apenas para desenvolvimento de aplicativos e/ou sistemas mobile.

O impulso de estudar containers veio quando fiz um investimento recente num videogame de nova geração e… er… aposentei meu PlayStation 4 com o intento de instalar Linux nele, tal qual fiz com meu PlayStation 2 e também com o PlayStation 3!

Infelizmente ele está na versão 9.60, que está longe de ter jailbreak. Portanto o artigo a respeito vai demorar sair até que eu desbloqueie e rode Linux com sucesso para relatar minha experiência e elaborar um artigo apropriado!

Porém já comecei a me adiantar sobre as possibilidades. Baseado no hardware dele:

  • Processador personalizado de chip único x86-64 AMD “Jaguar” de 8 núcleos @ 1.6 Ghz
  • Placa de vídeo de 1,84 TFLOPS, engine gráfica com base em AMD Radeon™
  • Memória RAM GDDR5 8 GB
  • Armazenamento interno SATA 6Gbs (1Tb mas coloquei um SSD de 480Gb)

E pelo que estudei a princípio, o hardware é plenamente aproveitável para Linux: Você terá os 8 núcleos à disposição e a placa de vídeo também, podendo rodar um sistema doméstico Linux qualquer – Ubuntu, Arch e etc – com Steam e WINE! Apesar de todo o poder, ele possui um processador com poucas Flags, entre elas, carece da flag KVM, usada em virtualização.

Ou seja, o PlayStation 4 com Linux não roda máquinas virtuais nativamente.

Então surgiu a questão: Se não roda máquinas virtuais, como tirar proveito do poder dele? Com containers!

3. Docker

Ao pesquisar a respeito de containeres eu adentrei o mundo do Docker® a princípio. Existe o Podman – solução alternativa e aparentemente mais completa desenvolvida pela RedHat – assim como o orquestrador Kubernetes (K8s), entre os mais conhecidos. – Atentos, para Ubuntu o Kubernetes é fornecido somente no modelo de empacotamento SNAP!

Já expliquei no artigo anterior o conceito por trás de um container, que é de um sistema que funciona em formato de enjaulamento compartilhando hardware com o sistema hospedeiro. O Docker é um frontend que gerencia o módulo LXC do Kernel Linux, facilitando o gerenciamento de recursos de forma automatizada gerenciado pelo daemon Docker.service.

Um container é um pequeno sistema Linux (kernel e pacotes adicionais) conectado ao kernel base do hospedeiro, ao mesmo tempo que compartilha recursos, continua isolado. Comparado a uma máquina virtual, consome bem menos recursos de hardware!

Enquanto isso o Podman é um sistema com mais recursos eliminando o daemon exclusivo para usar o systemD de base.

E o Kubernetes une ambos, sendo um orquestrador, ou seja, um sistema que permite implementar e provisionar containeres diversos em várias máquinas.

3.1 Mão na massa!

Para iniciar seu primeiro container siga esses passos simples. Primeiro instalamos o Docker no sistema. Optei pelo pacote stable do Ubuntu, ou seja, nativo do repositório na versão mais estável. Assim, apesar de receber menos atualizações, ele também vai reiniciar/parar com menos frequência os containeres que executar.

Para instalar, execute:

$ sudo apt install docker.io

Após a conclusão, execute o seguinte:

$ sudo usermod -aG docker SEU_USUARIO

Faça logout e login novamente. Assim o seu usuário poderá controlar o Docker sem permissões de sudo, o que é recomendado por questões de segurança.

Pronto, seu sistema já está adequado para execução de containers. O suporte a KVM não é necessária! Ou seja, pode executar o Docker em um sistema aarch64, AMD64, x86 e outros sem problemas, com ou sem suporte a hypervisor.

Há uma piada interna que você pode rodar um container dentro de uma máquina virtual dentro de um container dentro de uma máquina virtual dentro de um container….. não há limites!

Docker: The Container Metaphor with Profound Revolution | Charles Xu

3.2 Meu Container minha Vida

Os containers podem ser construidos usando Dockerfiles – scripts para automatização – ou podem ser feitos em runtime, ou seja, no ato da execução. Vamos iniciar um container simples de runtime, utilizando um repositório existente.

Faça o seguinte comando:

$ docker run -it ubuntu bash

Isso fará o docker procurar por uma imagem do ubuntu, não vai achar e vai baixa-la. As imagens dos containers são bem menores que um sistema completo mas igualmente completas. O resultado será semelhante a:

Unable to find image ‘ubuntu:latest’ locally
latest: Pulling from library/ubuntu
Digest: sha256:20fa2d7bb4de7723f542be5923b06c4d704370f0390e4ae9e1c833c8785644c1
Status: Downloaded newer image for ubuntu:latest

E por fim, você estará neste shell:

root@f798ec21ef84:/#

Ou seja, a imagem do container foi baixada, um container foi iniciado e você está no shell dentro do container! O que for feito aqui não afeta o seu sistema operacional principal. Todos os comandos já possuem a permissão de root, você pode baixar algum pacote com apt, instalar, rodar comandos como rm ou mkdir, entre outros.

Para sair, um simples exit basta.

O container criado pode ser visualizado na lista de containers:

$ docker ps -a

O resultado será semelhante a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f798ec21ef84 ubuntu "bash" 2 minutes ago Exited (0) 3 seconds ago interesting_faraday

Seu container ganhou um nome aleatório, no meu caso foi interesting_faraday. Para iniciá-lo novamente, use:

$ docker start interesting_faraday

O resultado será semalhante a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f798ec21ef84 ubuntu “bash” 5 minutes ago Up 18 seconds interesting_faraday

Para acessar o shell do container novamente (use o nome aleatório conforme o seu registrou):

$ docker exec -it interesting_faraday bash

Para parar e remover esse container do sistema, use:

$ docker stop interesting_faraday && docker rm interesting_faraday

3.2.1 Redes

Para criar uma rede bridge que comunique seu container à rede LAN, expondo-o para os demais computadores e retirando-o de rodar como bridge – somente localhost com o hospedeiro – ou mesmo de utilizar somente as mesmas especificações do hospedeiro, use as informações sobre a subnet, gateway e dispositivo com o comando “$ ip a“:

$ sudo docker network create -d macvlan –subnet=192.168.0.0/24 –gateway=192.168.0.1 -o parent=eth0 macvlan

Assim, no item 3.3 você poderá isolar o container em questão de redes. Poderá executar N containers em seu computador, cada um com seu próprio IP e/ou endereço MAC, utilizando a mesma placa de rede.

Se não fizer isso poderá ver erros de conexão se criar containers na mesma placa com IP’s ou portas semelhantes.

3.3 Customizando

Os containers podem ser customizados de infinitas maneiras a depender do que você deseja fazer!

Alguns parâmetros comuns são:

docker run -d \
-h HOSTNAME_DO_CONTAINER \ # Este permite customizar o hostname interno do container
–ip IP_DO_CONTAINER \ # Este permite definir um IP LAN para o container
–name NOME_DO_CONTAINER \ # Este define um nome fixo, assim ele não será aleatório como visto antes
–privileged \ # Este permite que o container tenha privilegios elevados na execução dos aplicativos
–dns 127.0.0.1 \
–dns 1.1.1.1 \
–restart=unless-stopped \ # Este fará o container sempre se manter funcionando a menos que você o desligue
–network macvlan \
–mac ENDEREÇO_MAC \ # Este permite definir um endereço MAC
-v /mnt/DO_HOSPEDEIRO:/mnt/DO_CONTAINER \ # Este permite passar um diretório do hospedeiro para dentro do container
ubuntu:latest # Altere aqui para trocar o sistema/imagem

O parâmetro -v é um dos mais importantes pois se você passar o mapeamento de uma pasta global local para o container armazenar dados de aplicações, poderá destruir o container e preservar a configuração da aplicação, podendo atualiza-lo em versão ou mesmo fazer downgrade para uma versão mais nova.

Sempre que um container é excluído e outro é criado o endereço MAC muda.

4. Containers, containers, containers e containers!

Você pode se deleitar sobre o banquete de containers que existem no hub.docker hoje, com mais de 9 milhões de imagens prontas, dos mais diversos serviços e aplicativos! Para usá-las basta trocar no código do item 3.3 aonde diz “ubuntu:latest” para o container desejado. Há outros repositórios como a LinuxServer.io.

Em essencia tem de tudo: samba, mysql, node.js, nextcloud, pihole, etc.

Você pode rodar containers de uma distro em outra! Ou seja, pode rodar aplicações do Fedora com empacotamento .rpm dentro do Ubuntu hospedeiro. Ou rodar OpenSUSE dentro do Gentoo, rodar ArchLinux dentro do Manjaro, etc.

O limite é que você só pode rodar containers de um sistema no mesmo tipo de sistema: Linux em Linux, Windows em Windows e FreeBSD em FreeBSD.

5. GitHub

Enquanto estudava reuni bastante material e desenvolvi alguns código para facilitar quem estiver chegando agora ao mundo dos containers.

Fiquem à vontade para acessar este repositório do meu GitHub , deixei vários scripts shell que automatizam a configuração de containers e/ou também tem código para customizar containers com Dockerfile.

Lá também tem vários exemplos de configurações diversas, como o PiHole, Dominio, SAMBA, MySQL e outros. O repositório será atualizado com novos scripts à medida que eu progredir nos estudos de containeres!

6. Depoimento

Eu comecei a colocar containers em produção no lugar de várias máquinas virtuais. A primeira foi o PiHole® que é um serviço de filtro DNS que eu costumo colocar em máquina virtual para ser algo prático e isolado, porém é o sistema é leve demais pra consumir tanto hardware sem necessidade.

Costumava deixar algo entre 15 e 25 GB de disco pra VM + 1 nucleo de CPU e 1 Gb de RAM. Com container esse valor caiu pra algo em torno de 300Mb de disco, 1 thread de CPU e algo próximo de 400mb de RAM. Considerando que cuido de vários clusteres com máquinas virtuais, o que eu puder tornar a experiência enxuta sem perder desempenho e funcionalidade será benéfico, poderei executar mais aplicações no mesmo hardware sem problemas!

O hardware que até então rodava com ressalvas 4~5 máquinas virtuais pode rodar tranquilamente mais de 15 containers das mesmas aplicações.

7. Conclusão

Não vou comentar sobre dockerfiles nesta publicação porque o assunto merece uma publicação dedicada, é bastante ampla a possibilidade de criar imagens customizadas para o Docker!

Além disso, pretendo falar em publicações futuras sobre orquestragem de containers e também sobre como utilizar o hub.docker.com para hospedar suas imagens customizadas de forma prática.

De forma simples e direta os containers são com certeza uma solução eficiente para tornar prático o provisionamento de serviços Linux sem requerer configurações completas de máquinas virtuais, que por práticas que sejam, ainda consomem muito hardware desnecessariamente. Principalmente considerando que containers executam bem em sistemas pequenos como RaspberryPi, OrangePi e outras SoCs!

Você pode criar um container para o Kodi, outro para o SAMBA, outro pra NFS, mais um para LAMP sendo um outro dedicado ao MySQL, enfim, vários serviços de forma isolada do sistema! Se algum der algum problema, você pode simplesmente destrui-lo e fazer outro.

#UrbanCompassPony

Deixe um comentário