Um guia básico completo pra criar, subir e gerenciar containers Docker localmente. Ideal pra aplicações web, APIs, serviços e microsserviços.


📦 1. ESTRUTURA BÁSICA DO PROJETO

Crie seu projeto com a seguinte estrutura base:

meu_app/
├── Dockerfile
├── requirements.txt (ou package.json, etc.)
├── app.py (ou index.js, main.go...)
└── outros arquivos e subpastas

📄 2. EXEMPLO DE Dockerfile GENERALISTA

# Imagem base (ajuste para seu runtime: node, go, php, etc)
FROM python:3.11-slim

# Diretório de trabalho no container
WORKDIR /app

# Copia dependências primeiro (pra cache ser mais eficiente)
COPY requirements.txt .

# Instala dependências
RUN pip install --no-cache-dir -r requirements.txt

# Copia o restante da aplicação
COPY . .

# Expõe a porta padrão da aplicação (porta que roda o serviço)
EXPOSE 5000

# Comando para rodar (ajuste conforme seu app)
CMD ["python", "app.py"]

📌 Troque o python, pip, requirements.txt, app.py conforme a stack da sua aplicação.

Para mais exemplos de Dockerfile acesse: Dockerfile Examples by AlldDev


🏗️ 3. BUILD DA IMAGEM

docker build -t <user>/meu-app:v1 .

🔍 Explicando:

  • build: cria a imagem
  • -t: “tag” → nome da imagem (<user>/meu-app) + versão (v1) (Pode ser usado lasted)
  • .: indica que o Dockerfile está no diretório atual

🚀 4. SUBIR O CONTAINER

docker run -d -p 8080:5000 --name meu-app <user>/meu-app:v1

🧠 Explicação das flags:

  • -d: roda em segundo plano (detached)
  • -p host:container: mapeia porta local (ex: localhost:8080) para a porta exposta no container (ex: 5000)
  • --name meu-app: dá um nome ao container
  • <user>/meu-app:v1: nome da imagem criada

🔥 5. LIBERAR PORTA NO FIREWALL (RockyLinux)

firewall-cmd --add-port=8080/tcp
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload

📌 Pode variar dependendo da distribuição, iptables, nftables, etc…


🛠️ 6. GERENCIAMENTO BÁSICO DE CONTAINERS

AçãoComando
Ver containers ativosdocker ps
Ver todosdocker ps -a
Parar containerdocker stop meu-app
Remover containerdocker rm meu-app
Ver logsdocker logs meu-app
Reiniciar containerdocker restart meu-app
Entrar no containerdocker exec -it meu-app bash
Ver imagensdocker images
Remover imagemdocker rmi <user>/meu-app:v1
Limpar imagens pendentesdocker image prune ⚠️
Limpar imagens pendentes/sem usodocker image prune -a ⚠️
Limpar recursosdocker system prune -a ⚠️

7. 📦 Exportar e Importar Imagens Docker (Offline / Outro Servidor)

🔁 Exportar imagem Docker para um arquivo .tar

docker save -o nome-da-imagem.tar nome-da-imagem:tag

📥 Importar a imagem Docker em outra máquina

  1. Copie o arquivo .tar para o novo servidor (via SCP, pendrive, etc).
  2. No destino, use:
docker load -i nome-da-imagem.tar

Agora a imagem estará disponível na nova máquina com o mesmo nome e tag.

✅ Útil para ambientes sem internet, deploys offline ou backups de imagens.


🧠 8. ESTRATÉGIAS ADICIONAIS

✅ Multi-stage build (quando usar compilação, como em React/Go):

# Stage 1: build
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# Stage 2: serve app
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html

✅ Variáveis de ambiente:

ENV FLASK_ENV=production

✅ Volume externo (dados persistentes):

docker run -v /meus-dados:/app/data ...

🎁 9. EXEMPLO DE PROJETO PRONTO (PYTHON FLASK)

mkdir flask-app && cd flask-app
echo "flask" > requirements.txt

app.py:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Olá Mundo, minha API está online!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Dockerfile: (como já mostrado no inicio)

Rode no terminal:

docker build -t <user>flask-api:v1 .
docker run -d -p 8080:5000 --name meu-flask <user>/flask-api:v1

Acesse em: http://localhost:8080


💡 BONUS: DICAS

  • Use docker-compose para gerenciar múltiplos serviços (API + banco + nginx)
  • Adicione .dockerignore para evitar copiar arquivos desnecessários
  • Combine com CI/CD (GitHub Actions) para build/push automático