Os Fundamentos do Docker: Guia Completo para Desenvolvedores
Descubra os conceitos essenciais do Docker, como criar e gerenciar contêineres e as melhores práticas para integração contínua e implantação.
InSkillCoach
Os Fundamentos do Docker: Guia Completo para Desenvolvedores
O Docker revolucionou a forma como desenvolvemos, implantamos e executamos aplicações. Este guia apresenta os conceitos fundamentais do Docker e como utilizá-lo de forma eficiente no seu fluxo de trabalho de desenvolvimento.
O que é o Docker?
O Docker é uma plataforma de conteinerização que permite empacotar uma aplicação e suas dependências em um “contêiner” isolado, que poderá ser executado em qualquer servidor. Diferentemente das máquinas virtuais, os contêineres não exigem um hypervisor e são executados diretamente no kernel da máquina host.
Vantagens do Docker
- Consistência de ambiente: “Funciona na minha máquina” passa a ser “Funciona em qualquer lugar”
- Isolamento: As aplicações são executadas de forma isolada, sem interferir umas nas outras
- Eficiência de recursos: Mais leve que as VMs tradicionais
- Implantação rápida: Inicialização rápida dos contêineres
- Escalabilidade fácil: Replicação simples dos contêineres
Arquitetura do Docker
A arquitetura do Docker é composta por vários componentes principais:
- Docker Daemon (dockerd): O serviço que gerencia os contêineres
- Docker Client: A interface de linha de comando
- Docker Registry: O repositório onde as imagens são armazenadas (por exemplo, o Docker Hub)
- Docker Images: Templates somente leitura usados para criar contêineres
- Docker Containers: Instâncias em execução das imagens
Instalação do Docker
Windows
# Instalar o Docker Desktop para Windows
# Baixar em https://www.docker.com/products/docker-desktop
# Seguir as instruções de instalação
Linux (Ubuntu)
# Atualizar a lista de pacotes
sudo apt-get update
# Instalar os pré-requisitos
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# Adicionar a chave GPG oficial do Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Configurar o repositório estável
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Instalar o Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Adicionar seu usuário ao grupo docker
sudo usermod -aG docker $USER
macOS
# Instalar o Docker Desktop para Mac
# Baixar em https://www.docker.com/products/docker-desktop
# Seguir as instruções de instalação
Comandos Essenciais do Docker
Gerenciamento de Imagens
# Baixar uma imagem
docker pull ubuntu:latest
# Listar as imagens
docker images
# Construir uma imagem a partir de um Dockerfile
docker build -t mon-app:1.0 .
# Remover uma imagem
docker rmi ubuntu:latest
Gerenciamento de Contêineres
# Criar e iniciar um contêiner
docker run -d -p 8080:80 --name mon-conteneur nginx
# Listar os contêineres em execução
docker ps
# Listar todos os contêineres (incluindo os parados)
docker ps -a
# Parar um contêiner
docker stop mon-conteneur
# Iniciar um contêiner existente
docker start mon-conteneur
# Remover um contêiner
docker rm mon-conteneur
Interação com os Contêineres
# Executar um comando em um contêiner em execução
docker exec -it mon-conteneur bash
# Exibir os logs de um contêiner
docker logs mon-conteneur
# Copiar arquivos para/de um contêiner
docker cp mon-fichier.txt mon-conteneur:/chemin/destination
docker cp mon-conteneur:/chemin/source/fichier.txt .
Criação de Dockerfile
Um Dockerfile é um arquivo de texto que contém todos os comandos para montar uma imagem Docker.
# Usar uma imagem base
FROM node:14-alpine
# Definir o diretório de trabalho
WORKDIR /app
# Copiar os arquivos de dependências
COPY package*.json ./
# Instalar as dependências
RUN npm install
# Copiar o restante dos arquivos
COPY . .
# Expor uma porta
EXPOSE 3000
# Definir o comando a ser executado na inicialização do contêiner
CMD ["npm", "start"]
Melhores Práticas para Dockerfiles
- Usar imagens base leves, como o Alpine Linux
- Combinar os comandos RUN para reduzir o número de camadas
- Limpar os caches após a instalação dos pacotes
- Usar o .dockerignore para excluir arquivos desnecessários
- Especificar versões exatas das dependências
- Usar usuários não-root para executar a aplicação
Docker Compose
O Docker Compose é uma ferramenta para definir e executar aplicações com múltiplos contêineres.
Exemplo de docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- ./app:/app
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/app
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=app
volumes:
postgres_data:
Comandos do Docker Compose
# Iniciar todos os serviços definidos no docker-compose.yml
docker-compose up -d
# Parar todos os serviços
docker-compose down
# Ver os logs de todos os serviços
docker-compose logs
# Reconstruir as imagens e iniciar
docker-compose up -d --build
Redes Docker
Por padrão, o Docker cria várias redes:
- bridge: Rede padrão para os contêineres
- host: Remove o isolamento de rede entre o contêiner e o host
- none: Desativa a rede
Criação e Gerenciamento de Redes
# Criar uma rede
docker network create mon-reseau
# Listar as redes
docker network ls
# Conectar um contêiner a uma rede
docker network connect mon-reseau mon-conteneur
# Inspecionar uma rede
docker network inspect mon-reseau
Volumes Docker
Os volumes permitem persistir dados fora dos contêineres.
Tipos de Volumes
- Volume nomeado: Gerenciado pelo Docker
- Bind mount: Vinculado a um caminho específico no host
- Volume tmpfs: Armazenado em memória (não persistente)
Comandos de Gerenciamento de Volumes
# Criar um volume nomeado
docker volume create mon-volume
# Listar os volumes
docker volume ls
# Usar um volume ao iniciar um contêiner
docker run -d -v mon-volume:/data --name mon-conteneur ubuntu
# Associar um diretório do host a um contêiner
docker run -d -v /chemin/hote:/data --name mon-conteneur ubuntu
# Remover um volume
docker volume rm mon-volume
Docker Registry
Um registry é um serviço de armazenamento e distribuição de imagens Docker.
Interação com o Docker Hub
# Fazer login no Docker Hub
docker login
# Aplicar uma tag a uma imagem
docker tag mon-app:1.0 utilisateur/mon-app:1.0
# Enviar uma imagem para o Docker Hub
docker push utilisateur/mon-app:1.0
# Baixar uma imagem do Docker Hub
docker pull utilisateur/mon-app:1.0
Implantar um Registry Privado
# Iniciar um registry local
docker run -d -p 5000:5000 --name registry registry:2
# Aplicar uma tag a uma imagem para o registry local
docker tag mon-app:1.0 localhost:5000/mon-app:1.0
# Enviar para o registry local
docker push localhost:5000/mon-app:1.0
Segurança no Docker
Boas Práticas
- Manter o Docker atualizado para se beneficiar das correções de segurança
- Escanear as imagens para detectar vulnerabilidades (com Docker Scout ou Trivy)
- Limitar as capacidades dos contêineres
- Usar usuários não-root nos contêineres
- Assinar as imagens com o Docker Content Trust
- Restringir os recursos (CPU, memória) dos contêineres
Configuração Segura
# Executar um contêiner com restrições de recursos
docker run -d --name mon-conteneur --memory="512m" --cpus="0.5" nginx
# Executar um contêiner com um usuário específico
docker run -d --user 1000:1000 --name mon-conteneur nginx
# Executar um contêiner em modo somente leitura
docker run -d --read-only --name mon-conteneur nginx
Casos de Uso Comuns
Aplicações Web
# Executar uma aplicação web Node.js
docker run -d -p 3000:3000 --name node-app node-app:1.0
# Executar um servidor Nginx como proxy reverso
docker run -d -p 80:80 --name nginx -v ./nginx.conf:/etc/nginx/nginx.conf nginx
Bancos de Dados
# Iniciar um banco de dados MySQL
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=password -v mysql_data:/var/lib/mysql mysql:8.0
# Iniciar um banco de dados PostgreSQL
docker run -d --name postgres -e POSTGRES_PASSWORD=password -v postgres_data:/var/lib/postgresql/data postgres:13
CI/CD
# Executar testes em um contêiner
docker run --rm -v $(pwd):/app -w /app node:14 npm test
# Construir uma aplicação em um contêiner
docker run --rm -v $(pwd):/app -w /app maven:3.8-openjdk-11 mvn package
Integração com o Kubernetes
O Docker funciona muito bem com o Kubernetes, orquestrador de contêineres:
- Criar imagens Docker para a sua aplicação
- Enviar as imagens para um registry acessível
- Definir manifestos Kubernetes para implantar os contêineres
- Usar o kubectl para gerenciar as implantações
Conclusão
O Docker transformou o desenvolvimento de software ao tornar as aplicações mais portáteis, mais fáceis de implantar e de escalar. Dominar o Docker tornou-se uma competência essencial para desenvolvedores e profissionais de DevOps.
Seguindo este guia, você adquiriu os conhecimentos fundamentais para:
- Compreender os conceitos-chave do Docker
- Criar e gerenciar contêineres
- Trabalhar com imagens e volumes
- Usar o Docker Compose para aplicações com múltiplos contêineres
- Seguir as melhores práticas de segurança
Para ir além, explore a orquestração de contêineres com o Kubernetes, os pipelines de CI/CD baseados em Docker e a arquitetura de microsserviços.
Sobre InSkillCoach
Especialista em treinamento e tecnologias
Coach especializado em tecnologias avançadas e IA, apoiado pela GNeurone Inc.
Certificações:
- AWS Certified Solutions Architect – Professional
- Certificações Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comentários
Os comentários são alimentados pelo GitHub Discussions
Conecte-se com o GitHub para participar da discussão