Introdução prática ao Docker
No desenvolvimento de software a eficiência e a consistência são fundamentais. Desenvolvedores e equipes de operações buscam soluções que facilitem o gerenciamento, a implantação e a execução de aplicações de forma uniforme em diversos ambientes. É nesse contexto que surgem os contêineres e o Docker, tecnologias que revolucionaram a maneira como o software é construído, testado e implantado.
O que são Contêineres?
Imagine que você está desenvolvendo uma aplicação que funciona perfeitamente no seu computador. No entanto, ao tentar executá-la em outra máquina, surgem problemas devido a diferenças no sistema operacional, versões de bibliotecas ou configurações. Os contêineres resolvem esse problema ao empacotar a aplicação e todas as suas dependências em uma unidade padronizada, garantindo que ela seja executada de maneira consistente em qualquer ambiente.
Principais características dos contêineres:
-
Leveza: Compartilham o kernel do sistema host, tornando-os mais eficientes que máquinas virtuais.
-
Portabilidade: Uma vez criado, um contêiner pode ser executado em diversos ambientes sem modificações.
-
Isolamento: Operam de forma isolada, garantindo que não interfiram em outras aplicações no mesmo sistema.
O que é Docker?
O Docker é uma plataforma de código aberto que simplifica a criação, o gerenciamento e a implantação de contêineres. Lançado em 2013, tornou-se a solução preferida para conteinerização devido à sua facilidade de uso e robusto ecossistema de ferramentas.
Conceitos-chave no Docker:
-
Imagens Docker: Servem como modelos para os contêineres, contendo tudo o que é necessário para executar a aplicação, desde o código até as dependências do sistema.
-
Contêineres Docker: São instâncias em execução das imagens Docker, proporcionando um ambiente isolado para a aplicação.
-
Dockerfile: Arquivo de texto que define as instruções para construir uma imagem Docker, especificando desde a imagem base até as dependências e configurações necessárias.
-
Docker Hub: Registro público onde desenvolvedores compartilham e acessam imagens pré-construídas, facilitando o uso de componentes comuns em projetos.
-
Docker Compose: Ferramenta que permite definir e gerenciar ambientes multi-contêiner usando um arquivo YAML, ideal para aplicações que requerem múltiplos serviços.
Por que usar Docker?
O Docker resolve diversos desafios enfrentados por desenvolvedores:
-
Consistência entre Ambientes: Garante que a aplicação funcione da mesma forma em diferentes ambientes, eliminando o clássico problema de “funciona na minha máquina”.
-
Rapidez: Contêineres iniciam e param rapidamente, otimizando pipelines de teste e implantação.
-
Eficiência de Recursos: Por compartilharem recursos do sistema host, contêineres reduzem a sobrecarga e permitem maior densidade de implantação.
-
Controle de Versão: Possibilita versionar não apenas o código, mas também o ambiente de execução, facilitando rollbacks e depuração.
Arquitetura do Docker
Compreender a arquitetura do Docker é essencial para otimizar seu uso:
-
Docker Daemon (
dockerd
): Processo que gerencia contêineres e lida com objetos Docker, ouvindo solicitações via Docker Engine API. -
Cliente Docker (
docker
): Interface de linha de comando que permite aos usuários interagir com o daemon Docker. -
Objetos Docker: Entidades como imagens, contêineres e serviços utilizados para montar uma aplicação no Docker.
-
Registries Docker: Repositórios para armazenar e compartilhar imagens Docker, sendo o Docker Hub o registry público padrão.
Criando sua Primeira Aplicação com Docker
Vamos colocar em prática criando uma aplicação simples em Python que exibe uma mensagem. Utilizaremos o Docker para executar essa aplicação sem a necessidade de instalar o Python diretamente no sistema host.
Passo 1: Instalar o Docker
-
No Ubuntu:
-
Atualize os pacotes:
sudo apt update
-
Instale o Docker:
sudo apt install docker.io
-
Verifique a instalação:
sudo docker run hello-world
-
-
No macOS e Windows:
Baixe e instale o Docker Desktop a partir do site oficial do Docker.
Passo 2: Escrever o Código Python
Crie um arquivo chamado app.py
com o seguinte conteúdo:
print("Olá, Docker!")
Passo 3: Criar o Dockerfile
No mesmo diretório do app.py
, crie um arquivo chamado Dockerfile
com o seguinte conteúdo:
# Usar uma imagem base do Python
FROM python:3.8-slim
# Definir o diretório de trabalho dentro do contêiner
WORKDIR /app
# Copiar o arquivo app.py para o diretório de trabalho
COPY app.py .
# Definir o comando padrão para executar o script Python
CMD ["python", "app.py"]
Passo 4: Construir a Imagem Docker
No terminal, navegue até o diretório que contém o Dockerfile
e execute:
sudo docker build -t minha-aplicacao-python .
Passo 5: Executar o Contêiner
Agora que criamos a imagem Docker, podemos rodar nossa aplicação dentro de um contêiner:
sudo docker run minha-aplicacao-python
Se tudo estiver correto, o terminal exibirá:
Olá, Docker!
Isso significa que o contêiner foi criado e executou nosso script Python com sucesso.
Gerenciando Contêineres no Docker
Para verificar quais contêineres estão rodando no momento, use:
sudo docker ps
Se quiser listar todos os contêineres, incluindo os finalizados, execute:
sudo docker ps -a
Para parar um contêiner em execução, use:
sudo docker stop <ID_DO_CONTÊINER>
Substitua <ID_DO_CONTÊINER>
pelo ID exibido no docker ps
.
Após parar o contêiner, podemos removê-lo:
sudo docker rm <ID_DO_CONTÊINER>
Se quiser remover todos os contêineres de uma vez, use:
sudo docker rm $(sudo docker ps -aq)
Para excluir uma imagem Docker que não está mais em uso:
sudo docker rmi minha-aplicacao-python
Criando e Executando um Contêiner com Parâmetros
Podemos passar argumentos para a aplicação ao executar o contêiner. Vamos modificar nosso app.py
para aceitar um nome como entrada:
import sys
nome = sys.argv[1] if len(sys.argv) > 1 else "Mundo"
print(f"Olá, {nome}!")
Agora, reconstruímos a imagem:
sudo docker build -t minha-aplicacao-python .
E podemos executar passando um nome como argumento:
sudo docker run minha-aplicacao-python Daniel
Saída esperada:
Olá, Daniel!
Referências