Docker Compose ve Nginx ile Çok-özel Web Uygulamaları
Giriş Giriş Giriş
Modern web uygulamaları nadiren tek bir monolithic process olarak çalıştırılırlar. Bunun yerine, birden fazla işbirliği hizmetinden oluşur: bir ön ve bir API, bir veritabanı, önbellek, bir mesaj kuyruk ve belki de bir iş koşucusu.Bir iş seti, bu çok ayarlı sistemlerini her bir konteynerin yaşam döngüsünü yönetmek için, onların bağımlılıkları hızlı bir şekilde hataya ve zaman alıcı bir şekilde tanımlamak için bir araya gelir.Dockere ve Nginx birlikte, doğrulayıcı bir şekilde genişletici bir şekilde, bu multi-konuşturucuyu kullanarak, en iyi şekilde genişletici bir şekilde kontrol etmek için bir şekilde bir araya getirir.
Önlemler Önlemler
Atla dalıştan önce, sisteminizde aşağıdakilere sahip olmanızı sağlayın:
- [FONT=0]Docker Motor[[Dönemli: 1 veya 20.10 veya yeni) – [[Döntgen:2)Install Docker[Döntme: 3)
- [FONT:0]Docker Komp[[Dönetici] [V2 şimdi Docker K:0) ile entegre edilmiştir; [0]- [[Döntme:2|Install Docker Komp)
- [FONT:0)Basic tanıdıklık[Dönetici: 1) terminal komutları ve YAML sözlüğü ile.
Seçmeli olarak, SSL yapılandırma bölümünü takip etmeyi plansanız sunucunuza işaret eden bir alan adı vardır.
Docker Kompüsü Derinlik
Docker Compose sadece basit bir “docker run” sarmalayıcı değildir.Bu, hizmet, ağ, hacimler, çevre değişkenleri, yeniden yapılandırılan tek bir dosyada yapılandırın ve bulut sağlayıcıların bir parçası.
Hizmetler Hizmetler
Her konteyner görüntüsü, limanları, hacimleri, ortamı ve bağımlılıklar, algFLT:2) anahtar. Hizmetler, toplayıcıların otomatik olarak oluşturduğu özel bir köprü ağı aracılığıyla birbirleriyle iletişim kurabilir. Bu, hizmet iletişimi için asla ev sahibi limanlara açmanız gerektiği anlamına gelir - sadece dış dünyaya ortaya çıkmanız gerekir.
Ağlar
Varsayılan olarak, meta-taptif olarak, tüm hizmetler için tek bir ağ oluşturur, onlara DNS tabanlı hizmet keşiflerini ev sahibi adı olarak kullanarak servis adını verir. Örneğin, adı verilen bir hizmet olarak, başka hizmetler tarafından ulaşılabilmektedir.You can also define custom networks for partition - for example, only the correct on a public-face network and keeping database kapsayıcıları iç bir ağ üzerinde tutabilir.
networks:
frontend:
backend:
services:
nginx:
networks:
- frontend
app:
networks:
- frontend
- backend
db:
networks:
- backend
Ciltler
Volumes, Docker konteynerleri tarafından üretilen verileri sürdürmek için tercih edilen mekanizmadır. Boşaltmada, onlara üst düzeydeki hacimleri ilan edebilir ve onları hizmetlere arayabilirsiniz.Bu veritabanı için temel, dosya yüklemeleri ve herhangi bir devletli hizmettir.
volumes:
db_data:
services:
postgres:
image: postgres:16
volumes:
- db_data:/var/lib/postgresql/data
Çevre Değişkenleri
Çevre değişkenlerini kullanarak dış yapılandırma. Onları geliştirme için bir koleksiyon dosyasında zorlayabilirsiniz, ancak üretim için www.FLT:7) dosyaları veya Docker sırları kullanmalısınız. Boşanmış dosya aynı dizinin içinde yer alıyorsanız.
services:
api:
image: my-api:latest
env_file:
- ./api.env
environment:
- NODE_ENV=production
Nginx'i bir Ters Proxy olarak yapılandırın - Advanced Proxy – Advanced
Nginx, yüksek performans, düşük hafıza ayak izi ve zengin bir özellik seti nedeniyle geri dönüşümlü olarak parlıyor.Çok sınırlı bir mimaride Nginx, müşteri istekleri kabul ediyor ve URI, üst düzeylere veya hatta vücut içeriğine dayanarak uygun hizmet için onları ileri sürüyor.
Birden Upstreams ile Temel Ters Proxy
İşte statik varlıklar ve WebSockets'i de ele geçirmek dahil olmak üzere iki farklı uygulama arasında trafik nasıl bölüneceğini gösteren daha tam bir yapılandırma:
upstream app1_upstream {
server app1:8000;
}
upstream app2_upstream {
server app2:8001;
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# App 1 – main web frontend
location / {
proxy_pass http://app1_upstream;
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;
}
# App 2 – admin dashboard
location /admin/ {
proxy_pass http://app2_upstream/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# WebSocket support (e.g., for live updates)
location /ws/ {
proxy_pass http://app1_upstream;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
# Static assets – serve directly for better performance
location /static/ {
alias /var/www/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
}
Blokların kullanımını dikkate alın. Bir tek sunucuyla bile, bir upstream grubu kullanarak sunucu blokuna dokunmadan daha fazla çoğaltma eklemek kolay hale getirir.
SSL/TLS Let's Encrypt
Üretim için, HTTPS'ye hizmet etmek, kullanılamaz. Örneğin, Certbot veya ESFLT:0)acme.sh) tarafından yapılan sertifikaları Nginx konteynerine yerleştirmek için ortak bir modeldir.
services:
nginx:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./certs:/etc/nginx/certs:ro
- ./static:/var/www/static:ro
ports:
- "80:80"
- "443:443"
depends_on:
- app1
- app2
Otomatik yenileme için, sertifikalar yenilenirken bir cron işi çalıştırıp Nginx'i yeniden yükleyen bir arkadaşınız konteyner ekleyebilirsiniz.
Yük Balancing ve Sağlık Kontrolleri
Birden fazla çoğaltmaya hizmet ölçeklendiğinde, Nginx, yuvarlak-robin, en azından bağlantı veya IP'nin bunu Docker Compose'sFLT:16 ile bir araya getirebiliyor:
upstream api_servers {
least_conn;
server api:80 max_fails=3 fail_timeout=30s;
}
Sinirli konteynerleri tespit etmek için, Nginx, Docker'in sağlık kontrollerine ve sadece geçiş yapan konteynerlere güvenmektir.
Docker Boşalıcı Dosyası – Gerçek Bir Dünya Örnek
Her şeyi bir Node.js API'si olan bir web uygulaması için pratik bir komplike dosyasına birleştirelim, Nginx tarafından servis edilen bir Reakt kutusu, bir PostgreSQL veritabanı ve Redis önbelleği. Nginx konteyner statik dosyaları ve proxy API talepleri hizmet edecek.
version: "3.9"
services:
nginx:
image: nginx:alpine
container_name: reverse-proxy
restart: unless-stopped
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./frontend/build:/var/www/frontend:ro
- ./certs:/etc/nginx/certs:ro
ports:
- "80:80"
- "443:443"
depends_on:
- api
- frontend
networks:
- public
frontend:
image: my-frontend:latest
# In production, frontend is built into static files and served by Nginx
# This container may run a dev server, but Nginx will bypass it for static files
container_name: frontend-dev
ports:
- "3000:3000"
networks:
- public
# healthcheck: ...
api:
image: my-api:latest
container_name: api-server
restart: unless-stopped
env_file:
- ./api/.env.production
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
networks:
- public
- internal
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
interval: 30s
timeout: 10s
retries: 3
postgres:
image: postgres:16-alpine
container_name: database
restart: unless-stopped
environment:
POSTGRES_USER: app_user
POSTGRES_DB: app_db
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
volumes:
- pgdata:/var/lib/postgresql/data
secrets:
- db_password
networks:
- internal
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app_user"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: cache
restart: unless-stopped
volumes:
- redisdata:/data
networks:
- internal
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
volumes:
pgdata:
redisdata:
networks:
public:
internal:
internal: true
secrets:
db_password:
file: ./secrets/db_password.txt
Bu dosyadaki anahtar noktalar:
- [FONT:0) Ağ izolasyonu[[DÜT:1): AÇIYORÇIYORÇLARI: 0,2|0|0|B][/FONT=0) Bu, iletişim kurmak için bağlantılı olan tek hizmettir.The database and cache is not reachable from outside the Docker overlay.
- [FONT:0) Sekreterlikler[DÜDÜT:1): Şifre gibi hassas veriler Docker sırları olarak depolanır, konteyner içindeki dosyalar olarak monte edilir. Bu onları çevre değişkenlerinde sızıntıktan kaçınır.
- [FONT:0)Sağlık kontrolleri[Döneticiler: Hizmetler sağlık kontrollerini ilan eder, böylece bu nedenle bunu GÜNCELT:24) şartsız olarak bekleyebilir. Nginx sadece API'nin sağlıklı olduğundan sonra başlayacaktır.
- [FONT:0]Statik varlıklar[[Döneticiler[Dönderlik): Önde inşa edilen çıktı doğrudan Nginx'e monte edilir, Nginx'e ön uçlu sunucuya çarpmadan statik dosyaları hizmet etmesine izin verir.
Uygulamayı işe almak - Adım Tarafından Adım
Komplike dosyası ve Nginx konfigürasyonu hazır, dağıtım birkaç basit komut içerir. Birincisi, tüm yapılandırma dosyalarının yerinde olmasını sağlar:
project/
├── docker-compose.yml
├── nginx/
│ └── nginx.conf
├── api/
│ └── .env.production
├── frontend/
│ └── build/
├── certs/
│ └── (fullchain.pem, privkey.pem)
└── secrets/
└── db_password.txt
Sonra koşmak:
docker compose pull # pull latest images
docker compose up -d # start all services in background
docker compose ps # verify services are running
docker compose logs -f # tail logs for all services
Her şey yukarılandığında, uygulamanızı alan alanınızı ziyaret ederek test edin. İstekleri doğru şekilde teyit etmek için Nginx logları kontrol edin. yapılandırma veya çevre değişkenlerini güncellemeniz gerekiyorsa, ilgili dosyaları ve koşmak:
docker compose up -d --no-deps --build nginx # rebuild only nginx if config changed
Sıfır zamanlı dağıtımlar için, [[0)blue-green) veya [[Döneticileri [Döneticileri ile [Döneticileri 3 ), Komplak sağlık kontrolleri ile ilgili olarak.
Scaling ve Performans Tuning
Docker Compose API gibi devletsiz hizmetleri ölçeklendirmek için önemsiz yapar:
docker compose up -d --scale api=3
Şimdi API konteynerinin üç kopyası çalışıyor. Nginx, yukarı uç blok ile yapılandırıldı, bunlar arasında otomatik olarak istekler dağıtacak.
- [FONT][/0)Enable Gzip sıkıştırması [[Dönetici:0) Nginx'te metin bazlı cevaplar için kullanılabilir.
- [FONT:0]Set uygun önbellek başlıkları [Dönetici varlıklar için [Döneticiler için gösterilenler)
- [FONT:0) Küresel statik dosyaların teslim edilmesi için bir CDN).
- [FONT:0)Tune Nginx işçi süreçleri CPU çekirdeğiyle eşleşmek için: [[ŞUFONTT:0).
- [0]- ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
Veritabanı için API'nizde bağlantı havuzunuz olmasını ve PgBouncer'i bir yancar konteyner olarak kullanmayı düşünün.
Sorun Ortak Konuları Sorun Gidermek
İyi yapılandırılmış bir kurulumla bile, işler ters gidebilir. İşte sık sık sık tuzaklar ve onları nasıl düzeltin:
- [FONT:0)Container, olarak başka bir hizmete ulaşamaz: Her iki hizmetin aynı Docker ağı üzerinde olduğunu kontrol edin.
- [FONT:0]Nginx 502 Kötü Kapısı döndürür).: Üstk konteyner koşmayabilir veya beklenen limanda dinlemez.Ayrıca proxy pass URL'nin doğru protokolü ve port içerdiğini de garanti eder.
- [FONT=0] Sayılarla ilgili hataların izini [Dönler: Yükler kontenjanların mülkiyetini devralır.Kullanıcı adı alanlarını kullanın veya Nginx ve hizmet konteynerinde yönerge yapın.
- [FONT:0]SSL sertifikası yenilemez[[Dönetici: certbot standalone kullanıyorsanız, port 80 ve 443 yenileme sırasında Nginx tarafından engellenmez.SSL sertifikası, çatışmalardan kaçınmak için bir webroot yöntemi veya certbot kullanın.
- [FONT=0)Environment değişkenleri yüklenemez[Dönetici: Verify theİLFLT:36] Dosya doğru yerdedir veya doğru yerdedir.
Güvenlik En İyi Uygulamaları
Üretimde çok sayıda uygulama yürütmek vigilance gerektirir:
- [FONT=0) Asla kök olarak konteyner koşmaz (Dönder: 1 ) Gerekli olmadıkça.AptFLT:39'u kullanın veya Dockerfile'de belirtilen bir şekilde belirtebilirsiniz.
- [FONT:0) Sürekli kırılgan tarama ile görüntülenebilir. Resmi temel görüntüler ve pin versiyonları kullanın.
- [FONT:0]Restrikt ağ maruziyeti[Döntgen: Sadece internete ters proxy limanlarını açığa çıkartın. Tüm diğer hizmetler iç ağlarda olmalıdır.
- [FONT:0]Sesli yönetim[Döneticileri, API anahtarları ve jetonları için[PFONT=0) kullanılır.Docker sırları iyi bir başlangıçtır; daha büyük kurulumlar için HashiCorp Vault'u düşünün.
- [FONT=0)Enable Docker Content Trust[Dönemli Görüntü imzalarını doğrulamak için).
- [FONT:0)Yönergesel olarak giriş ve denetim[DÜT:1) ELK yığını gibi merkezi bir giriş çözümü veya ELK yığını gibi merkezi bir giriş çözümü.
- [0]Tamam kaynak sınırları[[Dönemli kaynaklar:0] Kompaj dosyasında, bir konteynerin diğerlerinden çıkmasını engellemek için.
services:
api:
deploy:
resources:
limits:
cpus: '0.50'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M
Bu sınırlar Docker swarm kullanırken saygı duyuyorlar; düz bir eğlence için, (Ücretsizliğe veya K8'leri üretim orkestrası için kullanmak daha iyi olsa da).
Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç
Docker Compose ve Nginx birlikte güçlü, ölçeklenebilir ve çok dolu bir web uygulamaları dağıtmak için kullanılabilir bir platform oluşturur.Tek bir YAML dosyasında, üretim ile çevre paritesini elde edersiniz. Nginx, değişkenleri, ölçeklendirme ipuçları ve sorun giderme için merkezi bir SSL noktası sunar.