4.1 Inicialização
Nesse passo, a gente vai configurar o arquivo compose.yaml
pra rodar todos os serviços do nosso app multicontainer. O arquivo compose.yaml
vai incluir configurações pro frontend, backend e pro banco de dados, além de definir redes e volumes.
Definindo a versão do Docker Compose
Começa aí definindo a versão do Docker Compose. Nesse exemplo a gente tá usando a versão 3:
version: '3'
4.2 Definição dos serviços
Serviço 1: Frontend (ReactJS)
Vamos definir o serviço pro frontend, que vai ser construído a partir do diretório frontend e vai ficar disponível na porta 3000:
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
Serviço 2: Backend (Flask)
Vamos definir o serviço pro backend, que vai ser construído a partir do diretório backend. Ele depende do serviço de banco de dados e vai ficar disponível na porta 5000:
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
Onde:
- depends_on: indica que o serviço backend depende do serviço database. Isso quer dizer que o banco de dados vai ser iniciado antes do backend.
- environment: configura as variáveis de ambiente pra conexão com o banco de dados.
Serviço 3: Database (PostgreSQL)
Vamos definir o serviço pro banco de dados, usando a imagem oficial do postgres:13. Configuramos as variáveis de ambiente pra criar o banco de dados e as credenciais do usuário:
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
Onde:
-
environment
: configura as variáveis de ambiente pra criar o banco de dados e o usuário quando o container for iniciado. -
volumes
: conecta o volume db-data pro armazenamento persistente dos dados.
4.3 Configurando redes e volumes
Vamos definir as redes e os volumes que serão usados pelos nossos serviços:
networks:
task-network:
driver: bridge
volumes:
db-data:
Onde:
- networks: define a rede
task-network
com o tipo de driverbridge
, que será usada para comunicação entre os containers. - volumes: define o volume
db-data
para armazenar os dados do banco de dados.
4.4 Arquivo completo docker-compose.yml
Agora vamos juntar todas as partes em um único arquivo docker-compose.yml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
networks:
task-network:
driver: bridge
volumes:
db-data:
Explicação das configurações
-
build
: especifica o caminho do diretório com oDockerfile
para construir a imagem. -
ports
: abre as portas no host para acessar os serviços. -
depends_on
: indica que o serviço depende de outro para garantir a ordem de inicialização. -
environment
: configura variáveis de ambiente para os serviços. -
networks
: define a rede para comunicação entre os containers. -
volumes
: define volumes para armazenamento persistente de dados.
4.5 Rodando a aplicação
Agora que o arquivo compose.yaml
está configurado, a gente pode rodar todos os serviços com um único comando:
docker compose up
Esse comando vai criar e rodar os containers para o frontend, backend e banco de dados, usando as configurações que estão definidas no compose.yaml
.
Verificando o funcionamento
Depois de rodar os containers, confira se todos os serviços estão funcionando direitinho:
- Frontend: abre o navegador e acessa http://localhost:3000 pra verificar o frontend.
- Backend: abre o navegador e acessa http://localhost:5000 pra verificar o backend.
- Database: tenha certeza de que o container do banco de dados está rodando e que ele tá acessível pela conexão de rede com o backend.
GO TO FULL VERSION