Se você está atento à comunidade de software, você já deve ter ouvido falar do Docker. Com um tremendo aumento de popularidade, recentemente, ele continua a atrair usuários em um ritmo rápido, incluindo muitas empresas globais cuja infraestrutura depende dele.
Mas o que está por trás da popularidade e como isso funciona? Acompanhe este artigo e confira o conceito, o que essa tecnologia proporciona e como explorar o Docker com um pouco de experiência prática. Confira os tópicos:
- O que é Docker?
- Consistência permite gerenciamento fácil do projeto
- Proporciona escalabilidade
- Como o Docker funciona?
- Como eu uso o Docker?
- Conclusão
O que é Docker?
O Docker permite que você execute o software em um ambiente isolado denominado contêiner. Um contêiner é semelhante a uma máquina virtual (VM), mas opera de uma maneira completamente diferente.
Sendo assim, embora forneçam a maior parte do isolamento que uma VM oferece, os contêineres usam apenas uma fração dos recursos disponíveis em seu conjunto de produtos.
Consistência permite gerenciamento fácil do projeto
Digamos que você esteja codificando um aplicativo da web e desenvolvendo em sua máquina local, onde o testa. Em algumas situações, você o executa em um servidor de teste e, em breve, o colocará em um grande servidor de produção para que o mundo o veja.
Neste caso, não seria ótimo se você pudesse ativar consistentemente o mesmo ambiente, exatamente da mesma forma, em todos os seus dispositivos? Bem, se a resposta for “sim, o Docker pode te ajudar.
Se o seu aplicativo da web for executado corretamente dentro de um contêiner do Docker, em sua caixa local, ele poderá ser executado em seu servidor de teste, no servidor de produção e em qualquer lugar.
Dessa forma, isso torna o gerenciamento das dependências do projeto incrivelmente fácil. Não só é simples lidar com bibliotecas externas e módulos chamados diretamente pelo seu código, mas todo o sistema pode ser configurado ao seu gosto.
Assim, se você tiver um projeto de código aberto em uma situação onde um novo usuário deseja baixar e executar, ao utilizar o Docker, o processo é tão simples quanto iniciar um contêiner.
Proporciona escalabilidade
Agora, se você usar o Docker para criar serviços com demandas variadas (como sites ou APIs), é incrivelmente fácil escalar seu provisionamento simplesmente ativando mais contêineres (desde que tudo esteja arquitetado corretamente).
Para isso, existem várias estruturas que possibilitam orquestrar clusters de contêiner, como Kubernetes e Docker Swarm, mas isso é assunto para outro post. Então, fique de olho nos conteúdos do nosso blog!
Como o Docker funciona
Bem, muitas pessoas acreditam que o Docker é uma forma de executar uma máquina virtual, mas não é bem assim. Uma máquina virtual é executada em hardware simulado, ou seja, um sistema operacional totalmente autocontido.
No entanto, os contêineres compartilham nativamente o kernel do host. Isso significa que os contêineres têm um desempenho incrivelmente melhor do que as máquinas virtuais, dependendo do que eles estão fazendo.
Assim, seria possível criar centenas, senão milhares de contêineres em seu PC. Além disso, a inicialização de um contêiner levará segundos ou menos, em comparação com minutos para muitas VMs.
Como os contêineres são leves, é prática comum executar todos os aspectos de um aplicativo em contêineres diferentes, para uma capacidade de manutenção e modularidade maiores.
Por exemplo, você pode ter diferentes contêineres para subir o banco de dados, redis, nginx e assim por diante, todos conseguindo manter a comunicação entre si, de forma harmoniosa.
Como eu uso o Docker?
A fim de exemplificar o uso do Docker, vamos construir um servidor web mínimo em um contêiner. No interesse de mantê-lo simples, usaremos Flask, um microframework da web em Python.
Este é o programa que queremos executar: main.py. Você pode criar uma pasta nova, que chamaremos de app e salvar este arquivo lá:
from flask import Flask app = Flask (__ name__)
@ app.route (‘/’)
def home ():
return ‘Hello from dentro de um contêiner Docker’
if __name__ == ‘__main__’:
app.run(host = ‘0.0.0.0’, port = 80)
Neste caso, não precisa se preocupar se você não estiver familiarizado com o Flask ou Python, pois, tudo o que você precisa saber é que este código retorna uma string em localhost: 80.
Porém, antes de fazer esse app rodar, precisamos entender o que é um contêiner. Eles são definidos por uma imagem (como uma receita), sendo apenas uma instância em execução de uma imagem. Assim, você pode ter vários contêineres em execução da mesma imagem.
Utilizando o Docker Hub
Em todo caso, existe uma coleção pública de imagens, chamada Docker Hub, que contém contribuições oficiais, mas também permite que qualquer pessoa faça suas próprias contribuições.
Além disso, podemos pegar uma imagem do Docker Hub e estendê-la para que faça o que queremos. Para fazer isso, precisamos escrever um Dockerfile – uma lista de instruções para construir uma imagem.
A primeira coisa que faremos em nosso Dockerfile é especificar qual imagem queremos usar/estender. Como ponto de partida, faria sentido escolher uma imagem que já tenha o Python instalado. Usaremos uma com Python 3.7 rodando no Debian stretch.
Aqui está nosso Dockerfile:
FROM python: 3.7-stretch
COPY ./ /app
WORKDIR /app
RUN pip install Flask
CMD [“python”, “main.py”]
Na primeira linha informamos qual imagem gostaríamos de executar, então copiamos o conteúdo da pasta onde estamos para uma pasta chamada app. Logo após isso, instalamos o pacote Flask no contêiner e executamos o comando “python main.py”.
Neste momento temos uma configuração de hierarquia como esta:
app └──main.py Dockerfile
Agora você pode executar o comando $docker build ., isso diz ao Docker para procurar um Dockerfile no diretório atual (.). Mas para torná-lo um pouco mais fácil de executar, vamos dar um nome à nossa imagem construída, chamada de tag.
$ docker build -t flask-hello .
Fazendo funcionar
Como esta é a primeira vez que usamos esta imagem Python do hub, o download leva um ou dois minutos, mas no futuro, ela estará disponível localmente. Após isso, temos uma nova imagem para produzir um contêiner executando $docker run flask-hello
Nosso contêiner é executado com sucesso e obtemos alguma saída do Flask, informando que está pronto para servir nossa página. Mas, se abrirmos um navegador e visitarmos o localhost, não haverá nada para ser visto.
O motivo, claro, é que nosso servidor está sendo executado dentro do contêiner, que possui uma pilha de rede isolada. Por isso, precisamos encaminhar a porta 80 para poder acessar nosso servidor.
Dessa forma, vamos matar o contêiner com CTRL + C e executá-lo novamente com um encaminhamento de porta.
$ docker run -p 80:80 flask-hello
e funciona!
Conclusão
A primeira vez em que você visualiza este processo, pode parecer um pouco prolixo. Mas, acredite, existem ferramentas como docker-compose para automatizar esse fluxo de trabalho e são muito poderosas ao executar vários contêineres/serviços.
Ah! E fica aqui um segredo: quando você começa a entender o Docker, é como se você fizesse parte de um clube de elite. Você pode facilmente baixar e executar o software de qualquer pessoa, sem necessidade de configuração, com apenas alguns toques no teclado.
Em resumo:
- O Docker é uma maneira fantástica de executar código em um ambiente reproduzível de plataforma cruzada.
- Depois de configurar suas imagens, você pode executar seu código em qualquer lugar, instantaneamente.
- Construir diferentes componentes de um aplicativo, em diferentes contêineres, é uma ótima maneira de tornar seu aplicativo fácil de manter.
- Embora este artigo tenha focado nos serviços da Web como exemplo, o Docker pode ajudar em muitos lugares.
- Contêineres, orquestração de contêineres e implantação escalonável são áreas extremamente importantes para as empresas de software e vale a pena você ficar de olho!
Se você quer saber mais sobre assuntos semelhantes, confira outros conteúdos do nosso blog e se cadastre para receber informações sobre nossas vagas em aberto. Aqui, na Ubistart, sempre temos novas oportunidades!