Como Construir e Gerenciar Contêineres Docker Eficientemente

DockerBeginner
Pratique Agora

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.