---
title: "Docker Compose ile SQL Server + Node.js Geliştirme Ortamı (M1/M2 Mac Dahil)"
description: "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..."
date: 2026-04-14
category: devops
tags: ["docker", "sql-server", "nodejs", "docker-compose", "devops", "mac-m1"]
url: https://mikroerp.dev/blog/docker-compose-sql-server-nodejs-gelistirme/
---

## 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ı

```bash
# 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

```yaml
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)

```bash
# Azure Data Studio veya SSMS ile
Server: localhost,1433
User: sa
Password: DevPass@2024
```

### Container İçinden (Node.js App)

```typescript
// 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ı

```bash
# .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)

```dockerfile
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:

```bash
# ❌ 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:

```yaml
# ✅ Volume ile — veri kalıcı
volumes:
  - sql_data:/var/opt/mssql

# ❌ Volume olmadan — container silinince veri de silinir
```

## Yararlı Komutlar

```bash
# 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ı](/blog/mikro-erp-web-baglanti-cloudflare-tunnel/) — Production'da SQL Server erişimi
- [.env Güvenli Yönetimi](/blog/env-dosyalari-guvenli-yonetim/) — Connection string güvenliği
- [Supabase Migration Sistemi](/blog/supabase-migration-rehberi/) — PostgreSQL migration yönetimi
- [Cross-Database UPDATE](/blog/sql-server-cross-database-update-senkronizasyon/) — Çoklu DB senkronizasyonu

---

*Bu rehber [Microsoft SQL Server Docker Docs](https://learn.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker) ve [Docker Compose Docs](https://docs.docker.com/compose/) dokümantasyonuna dayanarak hazırlanmıştır.*