O que é Docker e por que todo desenvolvedor deveria aprender?
Entenda como o Docker resolve o clássico "na minha máquina funciona"
Se você já trabalha ou está começando na área de desenvolvimento, com certeza já ouviu (ou vai ouvir) alguém falar sobre Docker. E não é à toa: essa ferramenta se tornou praticamente indispensável no dia a dia de quem programa, principalmente quando o assunto é colocar uma aplicação para rodar em diferentes ambientes.
Você já passou pela situação de um código funcionar perfeitamente no seu computador, mas dar erro assim que é colocado em outra máquina ou em produção? Pois é, essa dor de cabeça tem até nome: "mas na minha máquina funciona!". E é exatamente esse tipo de problema que o Docker se propõe a resolver.
Com base nisso, o objetivo deste artigo é te explicar o que é o Docker, como ele funciona por trás dos panos, e por que ele pode facilitar (e muito) a sua vida como desenvolvedor(a). Vamos nessa!
Mas afinal, o que é o Docker?
O Docker é uma ferramenta que permite empacotar uma aplicação, junto com tudo que ela precisa para funcionar (bibliotecas, dependências, variáveis de ambiente, versão específica de uma linguagem, entre outros), dentro de um pacote isolado chamado container.
Em outras palavras, ao invés de você instalar manualmente cada dependência do seu projeto na sua máquina (e torcer para que a versão de cada uma seja compatível com o que o projeto espera), você descreve tudo isso em um arquivo chamado Dockerfile, e o Docker se encarrega de criar um ambiente isolado, com tudo já configurado exatamente daquele jeito.
Uma boa analogia é pensar em um container Docker como se fosse um contêiner de transporte marítimo: não importa o que tem dentro dele, nem qual navio ou caminhão está transportando; o container sempre vai poder ser empilhado, movido e aberto da mesma forma, em qualquer lugar do mundo. Com uma aplicação dentro de um container Docker acontece a mesma coisa: não importa se ela está rodando no seu notebook, no servidor da empresa ou na nuvem, o comportamento será o mesmo, porque o ambiente interno é sempre idêntico.
Container não é a mesma coisa que máquina virtual?
Essa é uma dúvida bem comum. Embora os dois sirvam para isolar um ambiente, eles funcionam de formas bem diferentes.
Uma máquina virtual (VM) simula um computador inteiro, com seu próprio sistema operacional completo, o que faz com que ela consuma bastante memória RAM e demore mais tempo para iniciar. Já um container Docker compartilha o kernel do sistema operacional da máquina hospedeira, e isola apenas a aplicação e suas dependências. Isso faz com que os containers sejam muito mais leves e rápidos de iniciar (geralmente em segundos) do que uma VM.
Como o Docker funciona na prática?
Para trabalhar com Docker, você vai lidar principalmente com três conceitos:
- Dockerfile: um arquivo de texto com as instruções de como construir a imagem da sua aplicação (qual sistema base usar, quais comandos rodar, quais arquivos copiar, etc).
- Imagem (image): o "molde" gerado a partir do Dockerfile. Ela contém tudo que sua aplicação precisa para rodar, mas ainda não está em execução.
- Container: a instância em execução de uma imagem. É o container que, de fato, roda a sua aplicação.
Veja um exemplo simples de Dockerfile para uma aplicação Python:
FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"]
Repare que, nesse Dockerfile, primeiro definimos qual vai ser a imagem base (python:3.11-slim, uma versão enxuta do Python), depois copiamos o arquivo de dependências (requirements.txt) e instalamos tudo com o pip. Só depois copiamos o restante do código e definimos o comando que deve ser executado quando o container subir (python app.py).
Para transformar esse Dockerfile em uma imagem, basta rodar:
docker build -t minha-aplicacao .
E para colocar essa imagem para rodar como um container:
docker run minha-aplicacao
Pronto! Sua aplicação está rodando isolada, exatamente do jeito que foi definida no Dockerfile, não importa em qual máquina você está.
Vale a pena aprender Docker?
Com certeza. Além de resolver o problema de compatibilidade entre ambientes, o Docker facilita bastante o trabalho em equipe (todo mundo roda a aplicação da mesma forma, sem depender de configurar tudo manualmente), e é praticamente um requisito quando o assunto é deploy em nuvem ou arquiteturas mais modernas, como microsserviços.
Claro que, como toda ferramenta, o Docker também tem uma curva de aprendizado, principalmente quando você começa a lidar com múltiplos containers se comunicando entre si (aí entra uma ferramenta chamada Docker Compose, mas isso fica para um próximo post 😉).
E aí, já tinha ouvido falar em Docker antes? Já testou na prática? Um abraço e até a próxima! 😁