Executando verificação de segurança...
2

[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!

Carregando publicação patrocinada...
2

Eu uso o CapRover no servidor e docker-compose local.

No servidor, crio um "app" do Caprover pra cada ambiente, aponto pro repo do GitHub e configuro o deploy automático com base na branch (na aba Deploy). Da pra criar um captain-definition pra escolher qual DockerFile utilizar.

Ele já tem até o nginx próprio pra fazer o relay pra cada "app". Você só precisaria criar um app do MySql e configurar as variáeis de ambiente nos outros apps.

Recomendo dar uma fuçada no CapRover, é bem legal.

PS: Ao usar a mesma instância do MySql, estou assumindo que está usando bancos de dados diferentes.

1

também uso o caprover pra projetos pessoais e implementei ele na empresa que tô trabalhando, 5 nodes via swarm. funciona divinamente.
só precisei melhorar o nginx do caprover pq ele por padrão abre as pernas se tiver uma demanda massiva de requisições.

1

cara já viu a possibilidade de usar ansible pra configurar seu server? todos os scripts de configuração você passa pra .sh e usar o ansible pra acessar e executar os arquivos .sh no server, fica até mais fácil de gerenciar e replicar caso precise rapidamente

doc do ansible

docker com ansible
mas recomendo ler a documentação primeiro

quando está tendo muito servers é recomenado usar o kubernetes
kubernets pra gerenciar as vms
kubernetes

acho muito melhor automatizar tudo, só faz uma vez o código e executar uns comando e o software faz todo o trabalho pra ti

cloud-init doc
é bom separar a maquina de dev pra prod, use aws e azure eles dão uma maquina gratuita, pra não ficar criando as maquinas manualmete use terraform e use o provider cloud-init no terraform, crie o arquivo.yaml de inicalização das máquina, passa as public keys do ssh pro .yaml, crie os users pra cada server, depois que criar as maquina use o ansible e exceutr os script de configuração do server Não use o write-files do cloud-init vai passar dor de cabeça use o runcmd

isso é o que usaria pra gerenciar a infra, da uma olha pra ver o que te atende

1

o webserver vc consegue fazer usando separação por dominio do nginx. cria dois sites.conf e aponta o proxy dentro deles a porta do python de cada ambiente.

Sobre o mysql, cria dois database nele um para cada ambiente e ao conectar só configurar o databas correto.

1

A pergunta principal é:

Porqyue colcoar o ambiente de dev junto com o de produção? existe algum motivo de ele estar em um servidor e não na sua máquina local?

como vocês organizam isso?

Cada ambiente em um ou mais servidores diferentes

2

Hoje eu preciso por conta para exibição de clientes e testes fechados, chamei de dev mas ta mais para um homolog.

Sobre a máquina, acabo só tendo uma e por isso achei prudente dividir os dois ambientes lá, talvez não seja o ideal então.

1

nesse caso eu faria algo assim:

/services
    /nginx
    /mysql
    docker-compose.yml
    
/dev
    projeto
    docker-compose.yml
    
/prod
    projeto
    docker-compose.yml