Containers
Explicando o docker-compose.yml
version: '3.7'
networks:
frontend:
driver: bridge
backend:
driver: bridge
services:
redis:
build: ./docker-files/redis
restart: always
volumes:
- ./redis-data:/data
command: --requirepass ${REDIS_PASSWORD}
ports:
- "6379:6379"
networks:
- backend
- frontend
workspace:
build:
context: ./docker-files/workspace
args:
- http_proxy
- https_proxy
- no_proxy\
command: sh -c "cd doric-exchange && chmod -R 777 -c storage/ public/ start.sh && ./start.sh"
volumes:
- ../:/var/www:cached
- ./php-worker/supervisord.d:/etc/supervisord.d
ports:
- "2222:22"
- "3000:3000"
- "3001:3001"
- "8080:8080"
- "8001:8000"
- "8003:8003"
- "8004:8004"
- "8005:8005"
- "4200:4200"
- "5173:5173"
tty: true
networks:
- frontend
- backend
php-fpm:
restart: always
build:
context: ./docker-files/php-fpm
args:
- http_proxy
- https_proxy
- no_proxy
volumes:
- ./php-fpm/php7.4.ini:/usr/local/etc/php/php.ini
- ../:/var/www:cached
expose:
- "9000"
depends_on:
- workspace
networks:
- backend
mysql:
platform: linux/amd64 # For MacOS User uncomment this line
image: mysql:5.7.41-debian
restart: always
environment:
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASSWORD}
- MYSQL_ROOT_USER=root
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- TZ=UTC
volumes:
- ./docker-files/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
- ./mysql-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- backend
nginx:
build:
context: ./docker-files/nginx/dev
restart: always
volumes:
- ../:/var/www
- ./docker-files/nginx/dev/sites/:/etc/nginx/sites-available
- ./docker-files/nginx/dev/ssl:/etc/nginx/ssl
ports:
- "80:80"
- "443:443"
depends_on:
- php-fpm
networks:
- frontend
- backend
Este é um arquivo docker-compose.yml que define e configura serviços para serem executados em contêineres Docker.
A seguir, uma explicação do que cada seção e serviço faz:
Seção version
A primeira linha do arquivo define a versão do formato do arquivo docker-compose.yml que está sendo utilizado. Neste caso, é a versão 3.7.
Seção networks
Em seguida, temos a seção networks que define as redes que serão usadas pelos serviços. Neste arquivo, há duas redes definidas: frontend e backend, ambas usando o driver de rede bridge.
Serviço redis
O primeiro serviço definido é o redis. Ele usa um Dockerfile localizado no diretório ./docker-files/redis para construir uma imagem personalizada. O comando restart: always garante que o contêiner seja reiniciado automaticamente em caso de falhas. O volume ./redis-data:/data mapeia o diretório local redis-data para o diretório /data dentro do contêiner, para que os dados do Redis sejam persistidos. A opção command: --requirepass ${REDIS_PASSWORD} define uma senha para o Redis, que é passada como uma variável de ambiente REDIS_PASSWORD. A porta 6379 é exposta para permitir a conexão com o Redis. O serviço está conectado às redes frontend ebackend.
Serviço workspace
O segundo serviço é o workspace. Ele usa um Dockerfile localizado no diretório ./docker-files/workspace para construir uma imagem personalizada. O comando sh -c "cd doric-exchange && chmod -R 777 -c storage/ public/ start.sh && ./start.sh" é executado no contêiner quando ele é iniciado. Os volumes ../:/var/www:cached e ./php-worker/supervisord.d:/etc/supervisord.d mapeiam os diretórios locais para o diretório /var/www e /etc/supervisord.d dentro do contêiner, respectivamente. As portas de entrada e saída definidas neste serviço são: 2222, 3000, 3001, 8080, 8001, 8003, 8004, 8005, 4200 e 5173. A opção tty: true é adicionada para permitir interação com o terminal. O serviço está conectado às redes frontend e backend.
Serviço php-fpm
O terceiro serviço é o php-fpm. Ele usa um Dockerfile localizado no diretório ./docker-files/php-fpm para construir uma imagem personalizada. O arquivo php7.4.ini é mapeado para o diretório /usr/local/etc/php/php.ini dentro do contêiner. A porta 9000 é exposta para permitir a conexão com o PHP-FPM. O serviço depende do serviço workspace e está conectado à rede backend.
Serviço MySQL
O próximo serviço é o mysql, que configura um banco de dados MySQL para a aplicação. O Dockerfile usado é a imagem oficial do MySQL para Debian, especificamente a versão 5.7.41.
O serviço é configurado com variáveis de ambiente para o nome do banco de dados, nome do usuário, senha do usuário e senha do root. Também é configurado o fuso horário para UTC. Além disso, dois diretórios são montados como volumes: um para os arquivos de inicialização do banco de dados e outro para os dados do banco de dados.
As portas expostas para este serviço são a porta padrão do MySQL (3306), que é mapeada para a porta 3306 do host.
Por fim, este serviço é conectado às redes frontend e backend, pois ele precisa estar acessível para a aplicação e também para o workspace, que pode precisar se comunicar com o banco de dados.
Serviço NGINX
O último serviço no arquivo é o nginx. Este serviço é configurado para servir a aplicação web usando o servidor web NGINX. O Dockerfile usado é uma imagem personalizada baseada na imagem oficial do NGINX.
Este serviço também é configurado com volumes montados para permitir a configuração do NGINX e arquivos SSL. Além disso, este serviço é mapeado para as portas 80 e 443 do host, permitindo que a aplicação seja acessível por meio do navegador.
Este serviço depende do serviço php-fpm, que precisa estar em execução para que o NGINX possa servir a aplicação. Finalmente, o serviço é conectado às redes frontend e backend, permitindo que a aplicação se comunique com o servidor web e também permitindo que o servidor web se comunique com o serviço php-fpm.
Instalando o docker compose
Para instalar o Docker Compose, você deve seguir os seguintes passos:
Verifique se o Docker está instalado em sua máquina, pois o Docker Compose requer que o Docker Engine esteja instalado e em execução.
Baixe a versão mais recente do Docker Compose do site oficial do Docker: https://docs.docker.com/compose/install/
Dependendo do seu sistema operacional, você pode precisar alterar as permissões do arquivo baixado para torná-lo executável. Você pode fazer isso usando o comando shell chmod +x docker-compose.
Mova o arquivo docker-compose para um diretório do seu sistema, como shell /usr/local/bin/, para que ele esteja disponível em seu caminho. Isso permite que você execute o comando docker-compose de qualquer lugar do sistema.
Verifique se a instalação foi bem-sucedida, digitando o comando docker-compose --version no terminal. Isso deve exibir a versão do Docker Compose instalada em seu sistema.
Com o Docker Compose instalado, você pode criar e gerenciar facilmente ambientes de desenvolvimento complexos com vários contêineres. Basta definir a configuração de vários contêineres em um arquivo YAML e executar o comando docker-compose up para criar e executar os contêineres de acordo com a configuração definida no arquivo YAML.
Subindo os containers
Para subir os containers execute o comando abaixo (dentro da pasta do projeto):
docker compose up -d