Docker Compose ile SQL Server + Node.js Geliştirme Ortamı (M1/M2 Mac Dahil)
Docker Compose ile SQL Server 2022 ve Node.js geliştirme ortamı nasıl kurulur? M1/M2 Mac'te Rosetta ile SQL Server çalıştırma, volume management ve...
Sorun: Local’de SQL Server Nasıl Çalıştırılır?
SQL Server Windows’a özgüdür. macOS veya Linux’ta geliştirme yapıyorsanız Docker tek gerçek çözümdür. Apple Silicon (M1/M2/M3) Mac’lerde ise ek yapılandırma gerekir.
Ön Gereksinimler
- Docker Desktop (en güncel sürüm)
- M1/M2/M3 Mac için: Rosetta 2 kurulu olmalı
# Rosetta 2 kurulumu (Apple Silicon Mac)
softwareupdate --install-rosetta --agree-to-license
Docker Desktop → Settings → General:
- ✅ Use Virtualization Framework
- ✅ Use Rosetta for x86/amd64 emulation on Apple Silicon
docker-compose.yml
version: '3.8'
services:
db:
image: mcr.microsoft.com/mssql/server:2022-latest
container_name: sqlserver-dev
platform: linux/amd64 # M1/M2 Mac için zorunlu
ports:
- "1433:1433"
environment:
- ACCEPT_EULA=Y
- MSSQL_SA_PASSWORD=DevPass@2024
- MSSQL_PID=Developer # Ücretsiz Developer Edition
volumes:
- sql_data:/var/opt/mssql
healthcheck:
test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "DevPass@2024" -Q "SELECT 1" -C -b
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
app:
build: .
container_name: node-app
ports:
- "3000:3000"
environment:
- DB_HOST=db
- DB_PORT=1433
- DB_USER=sa
- DB_PASSWORD=DevPass@2024
- DB_NAME=AppDB
depends_on:
db:
condition: service_healthy
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
volumes:
sql_data: # Veritabanı verisi container silinse bile kalır
Bağlantı Şekilleri
Container Dışından (Host Makineden)
# Azure Data Studio veya SSMS ile
Server: localhost,1433
User: sa
Password: DevPass@2024
Container İçinden (Node.js App)
// mssql modülü ile bağlantı
import sql from 'mssql';
const config: sql.config = {
server: process.env.DB_HOST || 'db', // Docker service adı
port: parseInt(process.env.DB_PORT || '1433'),
user: process.env.DB_USER || 'sa',
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME || 'AppDB',
options: {
encrypt: false, // Local dev'de gerekli değil
trustServerCertificate: true, // Self-signed cert kabul et
},
pool: {
max: 10,
min: 0,
idleTimeoutMillis: 30000,
},
};
const pool = await sql.connect(config);
.env Dosyası
# .env — Git'e EKLEMEYİN
DB_HOST=db
DB_PORT=1433
DB_USER=sa
DB_PASSWORD=DevPass@2024
DB_NAME=AppDB
Dockerfile (Node.js App)
FROM node:20-slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
Sık Karşılaşılan Sorunlar
1. Container Başlamıyor (M1/M2 Mac)
Error: no matching manifest for linux/arm64/v8
Çözüm: platform: linux/amd64 satırını ekleyin ve Rosetta’yı etkinleştirin.
2. Connection Refused
Error: connect ECONNREFUSED 127.0.0.1:1433
Çözüm: Container içinden localhost yerine Docker service adı (db) kullanın. depends_on ile healthcheck’i bekleyin.
3. SA Şifre Kuralları
SQL Server SA şifresi en az 8 karakter, büyük harf, küçük harf, rakam ve özel karakter içermeli:
# ❌ Geçersiz
MSSQL_SA_PASSWORD=password123
# ✅ Geçerli
MSSQL_SA_PASSWORD=DevPass@2024
4. Veritabanı Verisi Kaybolması
Volume tanımlamayı unutursanız container silindiğinde tüm veri gider:
# ✅ Volume ile — veri kalıcı
volumes:
- sql_data:/var/opt/mssql
# ❌ Volume olmadan — container silinince veri de silinir
Yararlı Komutlar
# Container'ları başlat
docker compose up -d
# SQL Server loglarını izle
docker logs -f sqlserver-dev
# Container içinde SQL komutu çalıştır
docker exec -it sqlserver-dev /opt/mssql-tools18/bin/sqlcmd \
-S localhost -U sa -P "DevPass@2024" -C \
-Q "CREATE DATABASE AppDB"
# Container'ları durdur (veri korunur)
docker compose stop
# Container'ları SİL (volume kalır)
docker compose down
# Container VE volume'ları sil (DİKKAT: veri gider!)
docker compose down -v
İlgili Yazılar
- Cloudflare Tunnel ile Web Bağlantısı — Production’da SQL Server erişimi
- .env Güvenli Yönetimi — Connection string güvenliği
- Supabase Migration Sistemi — PostgreSQL migration yönetimi
- Cross-Database UPDATE — Çoklu DB senkronizasyonu
Bu rehber Microsoft SQL Server Docker Docs ve Docker Compose Docs dokümantasyonuna dayanarak hazırlanmıştır.