Dockerize Edilmiş Mimari: App, Database, Proxy

Bu mimari, bir web uygulaması (app), bir veri tabanı (db) ve bir ters proxy (nginx) içeren üç ana Docker container’ı kapsar. Bu çözüm Docker-Compose kullanılarak çalıştırılır ve üretim ortamında güvenilir bir yapı sunar.
1. Mimari Tasarım
Bileşenler:
- App Container
- Uygulama Node.js, Python veya başka bir framework kullanabilir.
- Bu container yalnızca iş mantığını işler.
- Uygulama, ortam değişkenlerini kullanarak dinamik yapılandırılır.
- Database Container
- PostgreSQL veya MySQL gibi bir RDBMS kullanılır.
- Veriler
volumeskullanılarak kalıcı hale getirilir. - Gerekli yapılandırmalar için şifreler ve bağlantı bilgileri şifreli bir ortam değişkeni dosyasından (
.env) okunur.
- Proxy Container (nginx)
- Reverse Proxy görevi görür.
- Trafiği uygulamaya yönlendirir ve SSL sertifikası ile HTTPS desteği sağlar.
- Yük dengeleme desteği sunabilir.
İletişim:
- App, Database’e sadece dahili Docker ağı (
bridge network) üzerinden erişir. - Proxy, dış dünyadan gelen istekleri alır ve App container’ına yönlendirir.
2. Dosya Yapısı
project/
├── docker-compose.yml
├── app/
│ ├── Dockerfile
│ ├── src/
│ └── requirements.txt
├── nginx/
│ ├── nginx.conf
├── db/
│ └── init.sql
├── .env
└── README.md
3. Docker-Compose Yapılandırması
docker-compose.yml
version: '3.9'
services:
app:
build:
context: ./app
dockerfile: Dockerfile
ports:
- "5000:5000"
environment:
- DB_HOST=db
- DB_PORT=5432
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
- DB_NAME=${DB_NAME}
networks:
- backend
db:
image: postgres:latest
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
networks:
- backend
proxy:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
- "443:443"
networks:
- backend
- frontend
volumes:
db_data:
networks:
backend:
frontend:
4. App Dockerfile
app/Dockerfile
FROM node:16-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
5. Nginx Konfigürasyonu
nginx/nginx.conf
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://app:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
6. Üretim Ortamı İçin Öneriler
1. Güvenlik:
- Ortam değişkenlerini
.envdosyasında şifreli tutun. - Veritabanı için kullanıcı izinlerini kısıtlayın.
nginxüzerinden HTTPS sertifikası sağlayın. (Let’s Encrypt kullanılabilir.)
2. Performans:
- Uygulama container’ını ölçeklenebilir hale getirin (
docker-compose scaleveyareplicasile). - Yük dengeleme için nginx’i yapılandırın.
- Veritabanı performansı için
connection poolkullanın.
3. Kalıcılık:
- Veritabanı ve loglar için
volumeskullanın. - Yedekleme mekanizmalarını yapılandırın.
4. İzleme ve Loglama:
- Loglar için bir merkezi sistem kullanın (ör. ELK Stack, Prometheus).
- Container’ların durumunu izlemek için araçlar (ör. Docker Healthchecks) ekleyin.
5. Yedeklilik:
- App ve DB container’larını birden fazla node’a dağıtmak için Docker Swarm veya Kubernetes kullanın.
7. Başlatma ve Test
- Ortam Değişkenlerini Ayarlayın:
.envdosyasını oluşturun:DB_USER=myuser DB_PASSWORD=mypassword DB_NAME=mydatabase
- Docker-Compose ile Çalıştırın:
docker-compose up --build - Test:
- Uygulama:
http://localhost:5000 - Proxy:
http://localhost
- Uygulama:
8. Sonuç
Bu yapı, hem geliştirme hem de üretim ortamlarında kullanılabilir. Üretim için dikkat edilmesi gerekenler arasında güvenlik, performans, kalıcılık ve izleme gelir. Docker Compose ile kolayca ölçeklenebilir ve yönetilebilir bir yapı sağlanır.