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 usadolasted
).
: indica que oDockerfile
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ção | Comando |
---|---|
Ver containers ativos | docker ps |
Ver todos | docker ps -a |
Parar container | docker stop meu-app |
Remover container | docker rm meu-app |
Ver logs | docker logs meu-app |
Reiniciar container | docker restart meu-app |
Entrar no container | docker exec -it meu-app bash |
Ver imagens | docker images |
Remover imagem | docker rmi <user>/meu-app:v1 |
Limpar imagens pendentes | docker image prune ⚠️ |
Limpar imagens pendentes/sem uso | docker image prune -a ⚠️ |
Limpar recursos | docker 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
- Copie o arquivo
.tar
para o novo servidor (via SCP, pendrive, etc). - 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