← Назад к справочнику 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-stopped

Nginx + Frontend

Popular

Nginx как 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)

Production

Nginx для фронтенда и 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 --build

Production Setup

Production

Production-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-stopped

Custom 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