Introdução
Este tutorial abrangente sobre Docker fornece aos desenvolvedores e profissionais de TI uma imersão profunda na tecnologia de contentores. Explorando os conceitos centrais do Docker, a sua arquitetura e estratégias de implementação práticas, os aprendizes adquirirão competências práticas em empacotar, implantar e gerir aplicações em diferentes ambientes informáticos.
Conceitos Essenciais do Docker
O que é o Docker?
O Docker é uma poderosa plataforma de contentores que revoluciona o desenvolvimento e a implantação de aplicações. Como tecnologia de código aberto, o Docker permite aos desenvolvedores empacotar, distribuir e executar aplicações de forma consistente em diferentes ambientes informáticos.
Conceitos Centrais do Docker
Contentores vs Máquinas Virtuais
graph TD
A[Hardware Físico] --> B[Contentores Docker]
A --> C[Máquinas Virtuais]
B --> D[Leve]
B --> E[Kernel do SO Partilhado]
C --> F[Pesado]
C --> G[Sobrecarga Completa do SO]
| Característica | Contentores Docker | Máquinas Virtuais |
|---|---|---|
| Utilização de Recursos | Leve | Intensiva em Recursos |
| Tempo de Inicialização | Segundos | Minutos |
| Nível de Isolamento | Nível de Processo | Sistema Completo |
Arquitetura do Docker
O Docker utiliza uma arquitetura cliente-servidor com componentes chave:
- Daemon do Docker
- Cliente Docker
- Registos Docker
- Imagens Docker
- Contentores Docker
Comandos Básicos do Docker
Instalar o Docker no Ubuntu 22.04:
## Atualizar pacotes do sistema
sudo apt update
## Instalar dependências do Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Adicionar a chave GPG oficial do Docker
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Configurar o repositório Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Instalar o Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## Verificar a instalação do Docker
sudo docker --version
Executando o seu Primeiro Contenedor
## Extrair uma imagem Ubuntu
sudo docker pull ubuntu:latest
## Executar um contendor interativo
sudo docker run -it ubuntu:latest /bin/bash
## Listar contentores em execução
sudo docker ps
## Listar todos os contentores
sudo docker ps -a
Gestão de Imagens
## Procurar imagens
sudo docker search nginx
## Baixar uma imagem
sudo docker pull nginx
## Listar imagens locais
sudo docker images
Rede de Contentores
Tipos de Rede Docker
graph TD
A[Tipos de Rede Docker] --> B[Rede Bridge]
A --> C[Rede Host]
A --> D[Rede Nenhuma]
A --> E[Rede Overlay]
| Tipo de Rede | Descrição | Caso de Utilização |
|---|---|---|
| Bridge | Rede padrão | Comunicação isolada entre contentores |
| Host | Rede de host direta | Aplicações críticas de desempenho |
| Nenhuma | Sem acesso à rede | Contentores completamente isolados |
| Overlay | Rede multi-host | Sistemas de contentores distribuídos |
Técnicas de Mapeamento de Portas
Mapeamento Básico de Portas
## Mapear a porta 80 do contendor para a porta 8080 do host
sudo docker run -p 8080:80 nginx
## Mapear múltiplas portas
sudo docker run -p 8080:80 -p 3306:3306 myapp
Comandos de Gestão de Rede
## Listar redes docker
sudo docker network ls
## Criar rede personalizada
sudo docker network create mynetwork
## Conectar contendor à rede
sudo docker network connect mynetwork mycontainer
## Inspecionar detalhes da rede
sudo docker network inspect bridge
Cenário Avançado de Rede
## Criar rede bridge personalizada
sudo docker network create --driver bridge isolated_network
## Executar contentores na rede personalizada
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
Estratégias de Isolamento de Rede
## Desativar o acesso à rede externa
sudo docker run --network none mycontainer
## Utilizar a rede de host diretamente
sudo docker run --network host mycontainer
Resolução DNS de Contentores
## Ativar resolução DNS automática entre contentores
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
Técnicas Avançadas do Docker
Gestão de Recursos de Contentores
graph TD
A[Gestão de Recursos] --> B[Limites de CPU]
A --> C[Restrições de Memória]
A --> D[Quotas de Armazenamento]
Exemplo de Alocação de Recursos
## Limitar o contendor a 1 núcleo de CPU e 512MB de memória
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## Definir limites de memória e swap
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
Docker Compose para Implantação Multi-Contenedores
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
Boas Práticas de Segurança
| Técnica de Segurança | Implementação |
|---|---|
| Contentores sem privilégios | Utilize a diretiva USER no Dockerfile |
| Sistema de ficheiros de leitura só | Adicione o sinal :ro às montagens de volume |
| Limitar capacidades do contendor | Utilize --cap-drop e --cap-add |
Orquestração de Contentores com Docker Swarm
## Inicializar o cluster Swarm
sudo docker swarm init
## Criar serviço com réplicas
sudo docker service create --replicas 3 --name web nginx
## Escalar o serviço dinamicamente
sudo docker service scale web=5
Configurações Avançadas de Rede
## Criar rede personalizada com sub-rede
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
Monitorização e Registo de Contentores
## Registos de contentores em tempo real
sudo docker logs -f container_name
## Inspecionar métricas de contentores
sudo docker stats container_name
## Limitar o tamanho do ficheiro de registos
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Técnicas de Optimização do Dockerfile
## Construção em várias fases
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Resumo
O Docker representa uma abordagem transformadora para a implantação de software, oferecendo soluções de contenção leves, portáteis e eficientes. Ao dominar os conceitos fundamentais, a arquitetura e as técnicas de linha de comando do Docker, os desenvolvedores podem otimizar o desenvolvimento de aplicações, melhorar a consistência do sistema e aumentar a escalabilidade e o desempenho geral da infraestrutura.



