[DÚVIDA] Separação de ambientes no Docker
Opa, tudo joia?
Antes de tudo sou novato em docker e é meu primeiro post no tabnews.
Preciso estudar docker a pedido do meu trabalho e estou fazendo isso transferindo meus projetos pessoais para essa tecnologia, acredito que inserir ela no meu dia a dia vai tornar meu aprendizado mais fácil e rápido além de dar um up em meus projetos hehe.
Bem, de como usar e configurar a internet tá cheia, mas algo que eu não vi ou não entendi e como separar o docker em dois ou mais ambientes...
Vamos ao contexto:
- Tenho um VPS 1GB, já com docker instalado certinho
- Meu projeto é em FastApi (Python), usando Nginx e Mysql
- Dois ambientes (ambiente de dev e ambiente de prod)
- Meu projeto está no github em um repositorio, com as devidas branch de dev e prod
Como estava configurado?
dockerfile (geração da imagem do python, simples)
docker-compose.yml
version: "2"
services:
bp_dev:
container_name: bp_dev
restart: unless-stopped
build: .
ports:
- "8000:8000"
env_file:
- ./Dev/.env
networks:
- backend
bp_prod:
container_name: bp_prod
restart: unless-stopped
build: .
ports:
- "9000:8000"
env_file:
- ./Prod/.env
networks:
- backend
nginx:
container_name: nginx
restart: unless-stopped
image: nginx
ports:
- "80:80"
# - "443:443"
# environment:
# - [email protected]
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
# depends_on:
# - bp_dev
# - bp_prod
logging:
driver: "json-file"
options:
max-size: "100k"
max-file: "1"
networks:
- backend
mysql:
container_name: mysql_db
restart: unless-stopped
image: mysql:8.0.40-debian
env_file:
- docker.env
ports:
- "3444:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- backend
volumes:
mysql_data:
networks:
backend:
Quando eu fiz meu docker bonitinho, upei na branch de dev, um único arquivo com tudo configurado foi perfeito, rodou delicinha, mas quando fui configurar o ambiente de prod, ficou bem ruim...
Com 2 pastas no meu projeto (bp_dev, bp_prod cada um com seu clone do git na branch certa), quando eu rodo o docker-compose eu vou criar 6 servidores, sendo que queria usar apenas um servidor mysql e nginx, meu projeto é pequeno e tem pouco recursos, não vejo razão para duplicar o mysql/nginx.
Comecei deixar as coisas complexas devido a isto, ficando uma estrutura bem chata de gerenciar:
PASTA_PROJETO
./docker-compose.yml ¹
./docker.env
-- Dev/docker-compose-dev.yml ²
-- Dev/docker-compose-prd.yml ³
-- Dev/docker.env
-- Dev/dockerfile
-- Prod/docker-compose-dev.yml 4
-- Prod/docker-compose-prd.yml 4
-- Prod/dockerfile
¹ define o nginx + mysql pro dois ambientes (n vejo necessidade de subir 2 nginx, 2 mysql pra mesma coisa
² define o python rodando fastapi de dev
³ define o python rodando fastapi de prod
4 acabei separando 2 docker-compose, um pra e dev e outro pra prod, pra diferenciar as portas e o nome do container, acredito que isso ficou bem complicado e não seja correto
Tudo isso ficou ruim de gerenciar, preciso entrar em cada pasta para dar docker-compose up -d
ou docker-compose down
, dentro das pastas do projeto eu preciso usar o -f para especificar qual o arquivo docker vai ser utilizado, enfim, ficou complexo.
É assim que se organiza? qual é o comum? como vocês organizam isso? quais dicas tem?
Valeu!