Docker - Gerenciamento de Containers
Containerização
Docker permite empacotar aplicações com todas as suas dependências, garantindo que rodem de forma consistente em qualquer ambiente.
🤔 O que são Containers?
Conceito
Containers são como “caixas” que encapsulam uma aplicação e todas as suas dependências (bibliotecas, configurações, etc.). Servem para garantir que uma aplicação seja executada de forma consistente em diferentes ambientes.
- Resolve o problema: “Na minha máquina funciona!”
- Não é máquina virtual!
- Única missão de um container é fazer uma aplicação específica funcionar!

📊 Exemplo sem Container

📦 Exemplo com Container

⚖️ Docker x VMs

📜 Surgimento do Docker
| Década | Marco |
|---|---|
| 1990s | Primeiras formas de isolamento de processos (chroot) |
| 2000s | Surgimento de LXC (Linux Containers) |
| 2013 | Lançamento do Docker |
Exemplo de chroot
O conceito de isolamento surgiu com o
chroot, que permite alterar o diretório raiz de um processo:
# Cria um diretório
sudo mkdir -p /mycontainer
# Copia binários essenciais e monta um sistemas de arquivos
sudo cp -R /bin /lib /lib64 /usr /mycontainer/
sudo mkdir -p /mycontainer/{dev,proc,sys}
sudo mount -t proc proc /mycontainer/proc
sudo mount -t sysfs sys /mycontainer/sys
sudo mount -o bind /dev /mycontainer/dev
sudo mount -t devpts devpts /mycontainer/dev/pts
# Usa chroot para mudar a raiz do sistema, criando um ambiente isolado.
sudo chroot /mycontainer /bin/bash
🐳 O que é Docker?
Definição
Docker é uma plataforma de virtualização de containers que permite empacotar, distribuir e executar aplicações de forma isolada e consistente. Diferente das máquinas virtuais tradicionais, containers Docker compartilham o kernel do sistema operacional host, tornando-os mais leves e eficientes.
✨ Principais Benefícios
| Benefício | Descrição |
|---|---|
| Isolamento | Cada container roda de forma isolada |
| Portabilidade | ”Build once, run anywhere” |
| Eficiência | Mais leve que VMs tradicionais |
| Escalabilidade | Facilita múltiplas instâncias |
🧩 Componentes Principais
Docker Engine
O mecanismo principal do Docker que cria e gerencia containers.
Docker Hub
Repositório de Imagens
O Docker Hub é o registro público oficial de imagens Docker:
- Repositório oficial de imagens base e populares
- Repositórios públicos e privados
- Integração com sistemas de CI/CD
- Controle de versões através de tags
Dockerfile
Arquivo de Configuração
Arquivo de texto que contém todas as instruções para criar uma imagem Docker.
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]🏗️ Sobre Componentes e Camadas
Imagens
- Templates imutáveis para criar containers
- Contêm código, runtime, bibliotecas e configurações
- Construídas em camadas (cada instrução cria uma nova camada)

Volumes
São espaços de armazenamento para persistir dados (como um HD virtual).
Redes
| Tipo | Descrição |
|---|---|
| bridge | Rede padrão para containers em um único host |
| host | Containers compartilham a rede do host |
| none | Desabilita a rede para o container |
💻 Instalação do Docker
Windows
Requisitos
- Windows 10 ou superior atualizado
- WSL versão 1.1.3 ou superior
Instalando WSL
- No PowerShell como administrador:
wsl --install- Reiniciar e abrir a aplicação “Ubuntu”
- Criar usuário e senha para o sistema Linux
Docker Desktop
- Baixar e instalar do site oficial
- Testar:
docker run hello-worldLinux
🔧 Principais Comandos do Docker
Gerenciamento de Imagens
| Comando | Descrição |
|---|---|
docker build . | Constrói uma imagem a partir de um Dockerfile |
docker pull [imagem] | Baixa uma imagem do Docker Hub |
docker images | Lista todas as imagens locais |
docker rmi [imagem] | Remove uma imagem específica |
Gerenciamento de Containers
| Comando | Descrição |
|---|---|
docker run [imagem] | Cria e inicia um novo container |
docker ps | Lista containers em execução |
docker ps -a | Lista todos os containers |
docker start [container] | Inicia um container existente |
docker stop [container] | Para um container em execução |
docker rm [container] | Remove um container |
Logs e Debugging
| Comando | Descrição |
|---|---|
docker logs [container] | Exibe logs do container |
docker exec -it [container] bash | Acessa o terminal do container |
Opções Comuns do docker run
| Flag | Descrição |
|---|---|
-d | Executa em modo detached (background) |
-p [host]:[container] | Mapeia portas |
-v [host]:[container] | Monta volumes |
--name [nome] | Define um nome para o container |
-t | Define uma tag/nome para a imagem |
🎼 Docker Compose
Orquestração Multi-Container
Docker Compose permite definir e executar múltiplos containers de forma declarativa através de um único arquivo YAML.
🎯 Prática: Dockerizando uma Aplicação Flask-Login
Parte I: Banco de Dados em Container
1. Criar docker-compose.yml
services:
db:
image: mysql:latest
container_name: mysql-container
restart: always
environment:
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "3306:3306"
expose:
- '3306'
volumes:
- ../flask-files/mysql:/var/lib/mysql2. Criar arquivo .env
MYSQL_USER=admin
MYSQL_PASSWORD=admin123
MYSQL_DATABASE=flask-crud
MYSQL_ROOT_PASSWORD=admin123
SECRET_KEY = 'secretkeytest'3. Executar e buildar
docker-compose up --build4. Executar a aplicação
python app.py5. Verificar dados no container MySQL
# Acessar o container
docker exec -it mysql-container bash
# Conectar ao MySQL
mysql -u admin -p
# Selecionar banco e listar dados
USE flask-crud;
SHOW TABLES;
SELECT * FROM user;
# Sair
EXIT;
exitParte II: Dockerizando 100% do Projeto
1. Criar Dockerfile
# Usa uma imagem oficial do Python como base
FROM python:3.11
# Define o diretório de trabalho dentro do contêiner
WORKDIR /app
# Copia os arquivos do projeto para o contêiner
COPY . .
# Instala as dependências
RUN pip install --no-cache-dir -r requirements.txt
# Define a variável de ambiente para evitar buffer no output
ENV PYTHONUNBUFFERED=1
# Expõe a porta 5000
EXPOSE 5000
# Comando para rodar a aplicação
CMD ["python", "app.py"]2. Atualizar docker-compose.yml
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: flask-container
environment:
- SECRET_KEY=${SECRET_KEY}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
depends_on:
db:
condition: service_healthy
ports:
- "5000:5000"
db:
image: mysql:latest
container_name: mysql-container
restart: always
environment:
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "3306:3306"
expose:
- "3306"
volumes:
- ../flask-files/mysql:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 53. Criar .dockerignore
__pycache__/
*.pyc
.env
venv4. Atualizar app.py com URI dinâmica
O que é URI?
Uniform Resource Identifier - string de conexão que descreve onde e como conectar a um banco de dados.
app.config['SQLALCHEMY_DATABASE_URI'] = (
f"mysql+pymysql://{os.getenv('MYSQL_USER')}:{os.getenv('MYSQL_PASSWORD')}"
f"@db:3306/{os.getenv('MYSQL_DATABASE')}"
)5. Buildar novamente
docker-compose up --build📚 EXTRA: Comandos Docker Compose
Comandos Principais
| Comando | Descrição |
|---|---|
docker-compose up | Inicia todos os serviços |
docker-compose up --build | Força rebuild antes de iniciar |
docker-compose build [serviço] | Constrói imagem sem executar |
docker-compose down | Para e remove containers/redes/volumes |
docker-compose ps | Lista containers em execução |
docker-compose logs | Exibe logs de todos os serviços |
docker-compose logs [serviço] | Logs de um serviço específico |
docker-compose stop | Para serviços sem remover |
docker-compose start | Inicia serviços parados |
docker-compose restart | Reinicia todos os serviços |
docker-compose exec [serviço] [cmd] | Executa comando em um serviço |
docker-compose run [serviço] bash | Acessa terminal de um serviço |
Flags Comuns
| Flag | Descrição |
|---|---|
-d | Executa em modo detached (background) |
--build | Força rebuild das imagens |
--force-recreate | Força recriação dos containers |
-f | Especifica arquivo compose alternativo |
Contribuição
Essa página foi criada pelos alunos: Kauã Gonçalves e Carlos Armando