Структура docker-compose.yml
version: '3.9'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./www:/var/www/html:ro
depends_on:
php:
condition: service_healthy
networks:
- app-net
php:
image: php:8.2-fpm-alpine
volumes:
- ./www:/var/www/html
healthcheck:
test: ["CMD", "php-fpm", "-t"]
interval: 10s
timeout: 5s
retries: 3
networks:
- app-net
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-net
redis:
image: redis:7-alpine
command: redis-server --requirepass ${REDIS_PASS}
networks:
- app-net
volumes:
mysql-data:
networks:
app-net:
Файл .env для переменных
DB_ROOT_PASS=supersecret
DB_NAME=myapp
DB_USER=appuser
DB_PASS=dbpassword
REDIS_PASS=redispass
Команды управления
docker compose up -d # Запустить в фоне
docker compose down # Остановить
docker compose logs -f # Логи
docker compose ps # Статус сервисов
docker compose exec php sh # Войти в контейнер
💡 Используйте именованные тома (volumes) для персистентных данных — они сохраняются при docker compose down.