Docker Compose примеры
Полезные примеры Docker Compose конфигураций для различных сервисов.
LAMP Stack
# docker-compose.yml
version: '3.8'
services:
web:
image: httpd:2.4
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/local/apache2/htdocs
- ./httpd.conf:/usr/local/apache2/conf/httpd.conf
depends_on:
- php
- mysql
php:
image: php:8.2-fpm
volumes:
- ./html:/var/www/html
- ./php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: webapp
MYSQL_USER: webuser
MYSQL_PASSWORD: webpassword
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: mysql
PMA_USER: root
PMA_PASSWORD: rootpassword
depends_on:
- mysql
volumes:
mysql_data:
Nginx + PHP + PostgreSQL
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/var/www/html
- ./ssl:/etc/nginx/ssl
depends_on:
- php
php:
image: php:8.2-fpm-alpine
volumes:
- ./html:/var/www/html
- ./php-fpm.conf:/usr/local/etc/php-fpm.conf
environment:
- DATABASE_HOST=postgres
- DATABASE_NAME=webapp
- DATABASE_USER=webuser
- DATABASE_PASSWORD=webpass
depends_on:
- postgres
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: webapp
POSTGRES_USER: webuser
POSTGRES_PASSWORD: webpass
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
redis:
image: redis:7-alpine
command: redis-server --requirepass redispassword
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
Мониторинг (Prometheus + Grafana)
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/etc/grafana/provisioning/dashboards
- ./grafana/datasources:/etc/grafana/provisioning/datasources
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
volumes:
prometheus_data:
grafana_data:
ELK Stack (Elasticsearch + Logstash + Kibana)
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:8.11.0
ports:
- "5044:5044"
- "9600:9600"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
filebeat:
image: docker.elastic.co/beats/filebeat:8.11.0
volumes:
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml
- /var/log:/var/log:ro
- /var/lib/docker/containers:/var/lib/docker/containers:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
depends_on:
- elasticsearch
- logstash
volumes:
elasticsearch_data:
WordPress с Redis
version: '3.8'
services:
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
volumes:
- wordpress_data:/var/www/html
- ./wp-config.php:/var/www/html/wp-config.php
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppassword
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:7-alpine
command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
nginx:
image: nginx:alpine
ports:
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
- wordpress_data:/var/www/html
depends_on:
- wordpress
volumes:
wordpress_data:
mysql_data:
Nextcloud
version: '3.8'
services:
nextcloud:
image: nextcloud:stable
ports:
- "80:80"
environment:
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=nextcloudpass
- POSTGRES_HOST=postgres
- REDIS_HOST=redis
volumes:
- nextcloud_data:/var/www/html
- ./config:/var/www/html/config
- ./custom_apps:/var/www/html/custom_apps
- ./data:/var/www/html/data
depends_on:
- postgres
- redis
postgres:
image: postgres:15-alpine
environment:
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=nextcloudpass
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
command: redis-server --requirepass redispassword
volumes:
nextcloud_data:
postgres_data:
Оптимизация
Используйте именованные тома для постоянного хранения данных и настройте ограничения ресурсов для production среды.
Безопасность
Всегда изменяйте пароли по умолчанию и используйте переменные окружения для чувствительных данных.