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:

  1. 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.

  2. Contêineres Docker: São instâncias em execução das imagens Docker, proporcionando um ambiente isolado para a aplicação.

  3. 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.

  4. Docker Hub: Registro público onde desenvolvedores compartilham e acessam imagens pré-construídas, facilitando o uso de componentes comuns em projetos.

  5. 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:

    1. Atualize os pacotes:

      sudo apt update
      
    2. Instale o Docker:

      sudo apt install docker.io
      
    3. 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