Um guia básico de Docker para desenvolvedores
O que é, como vive e do que se alimenta
Há algum tempo, comecei a trabalhar em um projeto aqui na Concrete em que era necessário o uso de Redis. E, por algum motivo ainda desconhecido, eu tive problemas para instalar a ferramenta na minha máquina, o que, consequentemente, me impediria o trabalho. Neste momento eu lembrei que já tinha ouvido falar de algo que poderia me ajudar… E se você está lendo esse post já ouviu também, certo? Sim, estamos falando do Docker! Neste post, vou contar sobre como foi a minha experiência e as primeiras coisas que aprendi ao usar o Docker. Para começar, vamos responder à primeira pergunta.
O que é Docker?
Docker é uma tecnologia parecida com a virtualização, mas ao invés de levantar um sistema operacional completo do zero, a ideia é simplesmente ter o necessário para rodar as aplicações de forma independente (stand alone). Para isso, o Docker usa containers, e cada um deles usa os mesmos recursos da sua máquina local. Com isso, as aplicações não consomem mais recursos para rodar.
Por exemplo, considere que uma aplicação necessita 500Mb de ram. Se você fosse usar uma máquina virtual (ou VM), a sua aplicação consumiria, além dos 500Mb, mais alguns recursos necessários para rodar o sistema operacional de suporte a ela. Usando o Docker para montar e executar os containers, no final a aplicação de fato consumirá somente os 500Mb de ram, pois os recursos de SO são compartilhados com a máquina local.
Como usar o Docker?
Para utilizar o Docker no Linux, você pode seguir o tutorial de instalação neste link. Aqui, eu uso Linux, com o Ubuntu, então os próximos passos vou considerar esse sistema e distribuição. Caso você tenha alguma dúvida sobre fazer aí, é só deixar nos comentários. Ok? Bom, depois de seguir todos os passos, para que outras aplicações consigam acessar os recursos provisionados pelo Docker você precisa adicionar o usuário ao grupo do Docker, com o seguinte comando:
`sudo usermod -a -G docker $USER`
Sempre que você for adicionar algum usuário a um grupo, você precisa reiniciar a máquina para que essa adição seja efetivada. Antes disso, somente o usuário root (sudo) pode executar comandos Docker. Pra você saber quais são os recursos Docker a que você tem acesso depois de adicionar seu usuário pessoal, é só utilizar o comando `docker — version`, que ele indica qual versão da engine está instalada em sua máquina.
O que mais eu descobri sobre o Docker?
Além das coisas mais básicas como o que é e como usar, também consegui mais algumas informações que foram super úteis pra mim e talvez possa te ajudar também. Por exemplo, o Docker também pode ser utilizado pela interface de linha de comandos (CLI), com um simples `docker run`. Para isso, é necessário ter uma imagem docker local ou alguma das imagens disponíveis no Docker Hub.
Além disso, é comum durante o desenvolvimento de aplicações utilizarmos dependências externas, como bancos de dados (Mongo, MySQL, Dynamo) ou outros tipos de aplicações como rabbitMQ, Redis, entre outros. Com o uso de docker, você não precisa mais ter todas essas aplicações externas instaladas. É só você subir uma instância de Docker com a aplicação que precisa.
Também é comum não utilizarmos essas aplicações em suas portas padrão, por questões de segurança. Como o Docker compartilha os recursos com a máquina na qual ele está hospedado, podemos passar parâmetros para que a aplicação seja executada na porta em que desejamos, ao invés de sua porta padrão. Para isso, o comando utilizado deve ser: `docker run -p [porta_host: porta_container] [nome_da_imagem]`. Assim, teremos a imagem em uma porta específica de nossa máquina [host].
Executar o Docker sem prender o terminal, é outra opção que ajudou minha vida. Para isso, é só passar o parâmetro ‘-d’, e assim o container vai ser executado em segundo plano e você pode utilizar o terminal para outras aplicações. Neste caso, se você quiser ver quais aplicações estão rodando, é só usar o comando `docker ps`, que vai listar todos os containers que estiverem ativos. Ao contrário, caso você queira ver containers que não estão executando, mas que estão com as imagens já geradas, o comando é `docker ps -a`. Se você quer executar um container que está listado por meio desse comando, é só usar `docker start [Nome_do_container]` ou `docker start [3_primeiros_caracteres_do_Id]`.
Por exemplo, se tivermos o container com as seguintes informações:
ID: 1ebea884dead
IMAGE: configserver
COMMAND: “java -XX:+UnlockExp…”
CREATED: 11 days ago
STATUS: Exited (1) 11 days ago
NAME: amazing_feynman
Nós poderíamos iniciá-lo de duas formas diferentes: com `docker start amazing_feynman` ou `docker start 1eb`. Em ambos os casos, não é necessário utilizar ‘-d’, pois com o start o terminal não fica preso, ele já inicia ‘detached’, ou seja, em segundo plano.
Caso estejamos usando uma dependência interna, como algum microsserviço necessário para que você rode sua aplicação, é importante ter acesso aos logs da nossa aplicação que está rodando dentro de um container. Para isso, você pode usar o comando ‘docker logs [nome_da_imagem]’. Ele nos trará os logs até o momento em que executamos o comando. Mas se você quiser verificar de forma contínua a sua aplicação, basta utilizar o parâmetro ‘-f’, que vai prender seu terminal, mas fará com que cada nova ação que sua aplicação realizar seja logada em seu terminal. Assim, se tivermos com todas as dependências atualizadas, tanto internas, como externas, seremos capazes de simular nosso código recém desenvolvido, se integrando “diretamente” com nosso ambiente de desenvolvimento. Com isso, podemos garantir o comportamento do código dentro da aplicação antes mesmo da publicação dele.
Podemos subir todo o ambiente do back-end em Dockers, seja uma aplicação web ou mobile, e, com isso, garantir a integração de novas funcionalidades com uma boa perspectiva de qual será o comportamento real em ambiente de desenvolvimento. Ou seja, antes mesmo de subir alguma alteração para o ambiente de desenvolvimento, conseguimos garantir que menos pessoas sejam impactadas, pois as validações de que nada seria quebrado já seriam realizadas em tempo de desenvolvimento, deixando somente as validações de negócio e QA para serem feitas no ambiente de desenvolvimento final.
Também é comum usar Docker nos ambientes de desenvolvimento, homologação e produção, pois assim é possível garantir uma maior equalização entre ambientes, e o gerenciamento de dependências externas fica centralizado. Com os dockers, o processo de levantar mais estâncias de determinada aplicação que esteja com um fluxo maior naquele instante, por exemplo, é possível por meio da orquestração dos containers, com o auxílio de algumas das ferramentas disponíneis para isso, como Kubernets ou Docker Swarn.
Por fim, vale a informação de que, em posse de todos os arquivos fonte referentes a um microsserviço, ou à sua aplicação, seja ela qual for, para gerar uma imagem docker é necessário criar um arquivo Dockerfile.yml, com as instruções para que a imagem seja montada ‘Build’. Com isto pronto, é possível executar o comando ‘docker build -f [Nome_do_arquivo_base] -t [Nome_da_tag] . ‘. Com essa imagem docker gerada, basta utilizar ‘docker run [Nome_da_tag]’ para executar sua aplicação.
E isso foi o que eu aprendi em alguns meses utilizando o Docker, uma poderosa ferramenta para o desenvolvimento. Se você ficou com alguma dúvida em geral ou quer contribuir com a sua experiência, é só deixar um comentário aqui embaixo. E se você quiser aprender junto comigo ou com o pessoal aqui da Concrete, é só dar uma olhada aqui e se candidatar a uma de nossas vagas. Vamos aprender juntos!