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


Bu rehber Microsoft SQL Server Docker Docs ve Docker Compose Docs dokümantasyonuna dayanarak hazırlanmıştır.

📚 İlgili Yazılar