← Назад к справочнику Nginx
🐳
Nginx и Docker
Production-ready конфигурации Nginx для Docker
Found: 10 examples
Базовый docker-compose
Start HereПростейший Nginx в Docker
docker-composebasic
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html:ro
restart: unless-stoppedNginx + Frontend
PopularNginx как reverse proxy для фронтенда в Docker
docker-composefrontendreverse-proxy
version: '3.8'
services:
frontend:
build: ./frontend
environment:
- NODE_ENV=production
expose:
- "3000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
- frontend
restart: unless-stopped
# nginx.conf
# location / {
# proxy_pass http://frontend:3000;
# }Full Stack (Frontend + Backend)
ProductionNginx для фронтенда и API
docker-composefullstackdatabase
version: '3.8'
services:
frontend:
build: ./frontend
expose:
- "3000"
restart: unless-stopped
backend:
build: ./backend
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
expose:
- "8000"
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
- frontend
- backend
restart: unless-stopped
volumes:
postgres_data:Nginx config для Docker
Конфигурация для работы с Docker контейнерами
nginxconfigurationdocker
# nginx.conf
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Логи
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Upstream для backend
upstream backend {
server backend:8000;
}
# Frontend
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://frontend:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}Nginx + SSL в Docker
SSL сертификаты в Docker контейнере
✅ SSL сертификаты монтируются с хоста
dockersslcertbot
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
- /var/lib/letsencrypt:/var/lib/letsencrypt:ro
restart: unless-stopped
# Получение SSL на хосте:
# sudo certbot certonly --standalone -d example.com
# nginx.conf
# server {
# listen 443 ssl http2;
# ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# }Load Balancing
AdvancedБалансировка между несколькими контейнерами
load-balancingscalingdocker
version: '3.8'
services:
backend-1:
build: ./backend
expose:
- "8000"
restart: unless-stopped
backend-2:
build: ./backend
expose:
- "8000"
restart: unless-stopped
backend-3:
build: ./backend
expose:
- "8000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- backend-1
- backend-2
- backend-3
restart: unless-stopped
# nginx.conf
# upstream backend_cluster {
# server backend-1:8000;
# server backend-2:8000;
# server backend-3:8000;
# least_conn;
# }Полезные команды
EssentialРабота с Nginx в Docker
dockercommandsmanagement
# Запустить контейнеры
docker-compose up -d
# Посмотреть логи Nginx
docker-compose logs -f nginx
# Перезапустить Nginx
docker-compose restart nginx
# Перезагрузить конфигурацию без даунтайма
docker-compose exec nginx nginx -s reload
# Проверить конфигурацию
docker-compose exec nginx nginx -t
# Войти в контейнер
docker-compose exec nginx sh
# Остановить все контейнеры
docker-compose down
# Пересобрать и запустить
docker-compose up -d --buildProduction Setup
ProductionProduction-ready конфигурация с health checks
✅ Health checks гарантируют готовность сервисов
productionhealth-checksdocker-compose
version: '3.8'
services:
frontend:
build: ./frontend
expose:
- "3000"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 10s
retries: 3
restart: unless-stopped
backend:
build: ./backend
expose:
- "8000"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
depends_on:
- db
restart: unless-stopped
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
frontend:
condition: service_healthy
backend:
condition: service_healthy
restart: unless-stopped
volumes:
postgres_data:Auto-update с Watchtower
Автоматическое обновление контейнеров
✅ Автоматически обновляет контейнеры при новых образах
dockerauto-updatewatchtower
version: '3.8'
services:
frontend:
image: myregistry.com/frontend:latest
expose:
- "3000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- frontend
restart: unless-stopped
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_POLL_INTERVAL=300
restart: unless-stoppedCustom Nginx Dockerfile
Dockerfile с кастомной конфигурацией
dockerfilecustom-buildnginx
# Dockerfile
FROM nginx:alpine
# Копируем конфигурацию
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf
# Копируем статику (если нужно)
COPY dist /usr/share/nginx/html
# Health check
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --quiet --tries=1 --spider http://localhost/ || exit 1
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
# docker-compose.yml
version: '3.8'
services:
nginx:
build: ./nginx
ports:
- "80:80"
- "443:443"
restart: unless-stopped