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) │ │ (캐시/세션/큐) │ │
│ └────────────────────┘ └─────────────────────┘ │
└───────────────── ────────────────────────────────────────────┘
서비스 구성
| 서비스 | 이미지 | 역할 | 포트 |
|---|---|---|---|
| nginx | nginx:alpine | 웹서버, 리버스 프록시 | APP_PORT:80 |
| web | Custom PHP 8.4 | Laravel 애플리케이션 | 9000 (내부) |
| postgres | postgres:18 | 데이터베이스 | DB_PORT:5432 |
| redis | redis: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-nginxmyproject-webmyproject-postgresmyproject-redis
환경별 차이
| 항목 | 개발 | 운영 |
|---|---|---|
| 소스 경로 | workspace/ | releases/ (via live/) |
| 코드 반영 | 즉시 | make live 후 |
| APP_DEBUG | true | false |
| 로그 레벨 | debug | error |
dev/prod 파일 분리 없음
환경은 서버 분리로 구분합니다. docker-compose 파일은 동일합니다.
관련 문서
- 2파일 체계 - amd64/arm64 상세
- Docker 설정 - 서비스별 설정
- 네트워킹 - 네트워크 구조
- Makefile 명령어 - 명령어 상세