Skip to main content

Docker 개요

Multi-SaaS Kit의 Docker 환경을 소개합니다.

핵심 원칙

원칙설명
프로젝트별 독립각 프로젝트는 완전히 독립된 Docker 환경
2파일 체계amd64/arm64 아키텍처별 docker-compose 파일
소스/데이터 분리코드는 workspace/, 데이터는 data/
Makefile 통합모든 명령은 make 명령어로 실행

아키텍처

┌─────────────────────────────────────────────────────────────┐
│ localhost:{APP_PORT} │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ nginx │ │
│ │ (리버스 프록시 + 정적 파일) │ │
│ └────────────────────────┬────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ web │ │
│ │ (Laravel + PHP-FPM) │ │
│ └────────────┬────────────────────────┬───────────┘ │
│ ↓ ↓ │
│ ┌────────────────────┐ ┌─────────────────────┐ │
│ │ postgres │ │ redis │ │
│ │ (PostgreSQL) │ │ (캐시/세션/큐) │ │
│ └────────────────────┘ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘

서비스 구성

서비스이미지역할포트
nginxnginx:alpine웹서버, 리버스 프록시APP_PORT:80
webCustom PHP 8.4Laravel 애플리케이션9000 (내부)
postgrespostgres:18데이터베이스DB_PORT:5432
redisredis:7-alpine캐시, 세션, 큐REDIS_PORT:6379

서비스별 역할

nginx:

  • 외부 요청 수신 (:80)
  • PHP 요청은 web:9000으로 프록시
  • 정적 파일 직접 서빙 (/js, /css, /images)
  • Gzip 압축, 보안 헤더

web (Laravel):

  • PHP-FPM으로 실행
  • Laravel 애플리케이션 처리
  • PostgreSQL, Redis 연결
  • OPcache 활성화

postgres:

  • 모든 데이터 저장
  • RLS (Row-Level Security) 지원
  • 헬스체크로 준비 상태 확인

redis:

  • 세션 저장 (session.save_handler)
  • 캐시 (CACHE_DRIVER=redis)
  • 큐 (QUEUE_CONNECTION=redis)
  • AOF 영속성 활성화

파일 구조

workspace/{project}/
├── _docker/
│ ├── docker-compose.amd64.yml # Intel/AMD용
│ ├── docker-compose.arm64.yml # Apple Silicon용
│ └── conf/
│ ├── nginx/
│ │ └── default.conf # nginx 설정
│ ├── php/
│ │ ├── Dockerfile # PHP 이미지 빌드
│ │ ├── php.ini # PHP 설정
│ │ └── docker-entrypoint.sh
│ ├── postgres/
│ │ └── init.sql # 초기 SQL (선택)
│ └── redis/
│ └── redis.conf # Redis 설정 (선택)
└── .env # 환경변수

데이터 분리

소스 코드와 런타임 데이터를 완전히 분리합니다.

multi-saas-kit/
├── workspace/{project}/ # 소스 코드 (Git 관리)
│ ├── _docker/
│ └── web/

└── data/
└── {PLATFORM_NAME}/{project}/ # 런타임 데이터 (Git 제외)
├── postgres/ # PostgreSQL 데이터
└── redis/ # Redis 데이터

장점:

  • 릴리즈 스냅샷이 가벼움 (데이터 미포함)
  • 백업/복원 단순화 (data/ 폴더만 백업)
  • 소스와 데이터 명확히 구분

네트워크 구조

{PLATFORM_NAME}-{PROJECT_NAME}-network    # 프로젝트별 독립
├── nginx
├── web
├── postgres
└── redis

{PLATFORM_NAME}-shared-network # 플랫폼 공유
└── postgres (외부 연결용)
  • 프로젝트 네트워크: 프로젝트 내부 서비스 통신
  • 공유 네트워크: pgAdmin 등 플랫폼 서비스가 모든 DB에 접근

기본 명령어

# 시작
make up NAME=myproject

# 중지
make down NAME=myproject

# 재시작
make restart NAME=myproject

# 상태 확인
make status NAME=myproject

# 로그 확인
make logs NAME=myproject

# 컨테이너 쉘 접속
make shell NAME=myproject # 앱
make shell-db NAME=myproject # PostgreSQL

컨테이너 명명 규칙

{PROJECT_NAME}-{service}

예시:

  • myproject-nginx
  • myproject-web
  • myproject-postgres
  • myproject-redis

환경별 차이

항목개발운영
소스 경로workspace/releases/ (via live/)
코드 반영즉시make live
APP_DEBUGtruefalse
로그 레벨debugerror
dev/prod 파일 분리 없음

환경은 서버 분리로 구분합니다. docker-compose 파일은 동일합니다.

관련 문서