Mac
↓
Docker / OrbStack
↓
Container
├─ PostgreSQL
├─ Redis
├─ Backend
├─ Worker
└─ Nginx
docker compose up -d로 환경을 빠르게 복구할 수 있습니다.Docker 없이:
PostgreSQL 직접 설치
Redis 직접 설치
버전 충돌 가능
프로젝트마다 환경 꼬임
Docker 사용:
프로젝트별 compose 파일
컨테이너 단위 실행
버전 명시 가능
삭제/재생성 쉬움
docker, docker compose를 사용합니다.Docker:
컨테이너 실행 표준
Docker Desktop:
Mac에서 Docker를 실행하는 대표 앱
OrbStack:
Mac에서 Docker를 실행하는 가벼운 대안
OrbStack도 결국 컨테이너 실행 환경
컨테이너를 많이 켜면 RAM 사용
DB 볼륨을 지우면 데이터 삭제
프로젝트별 포트 충돌 주의
운영 서버와 완전히 같지는 않음
| 개념 | 의미 | 예시 |
|---|---|---|
| Image | 실행 템플릿 | postgres:16 |
| Container | 실제 실행 중인 인스턴스 | togethermall-postgres |
| Volume | 데이터 저장 공간 | PostgreSQL 데이터 |
| Network | 컨테이너 간 통신망 | backend ↔ postgres |
이미지:
컨테이너를 만들기 위한 원본
예:
postgres:16
redis:7
node:20-alpine
nginx:alpine
컨테이너:
이미지를 실행한 실제 프로세스
예:
postgres 이미지를 실행하면
PostgreSQL 컨테이너가 됨
볼륨:
컨테이너가 삭제되어도 데이터를 보존하는 저장소
PostgreSQL:
DB 데이터는 반드시 volume에 저장해야 함
네트워크:
컨테이너끼리 이름으로 통신할 수 있게 해주는 연결
예:
backend 컨테이너에서 postgres 컨테이너 접속
host: postgres
port: 5432
docker-compose.yml
↓
docker compose up -d
↓
PostgreSQL + Redis + Backend 실행
docker compose up -d
docker compose down
docker compose ps
docker compose logs -f
docker compose restart
docker compose pull
| 명령어 | 의미 |
|---|---|
up -d | 백그라운드 실행 |
down | 컨테이너 중지 및 제거 |
ps | 실행 상태 확인 |
logs -f | 로그 실시간 확인 |
restart | 재시작 |
pull | 이미지 최신 다운로드 |
up -d, down, logs -f, ps만 잘 써도 충분합니다.Mac에 PostgreSQL 직접 설치
↓
항상 background service로 실행
↓
모든 프로젝트가 localhost:5432 공유
↓
버전/데이터/권한 충돌 가능
프로젝트별 PostgreSQL 컨테이너
↓
프로젝트별 DB/계정/볼륨 분리
↓
필요할 때만 실행
↓
삭제/재생성 쉬움
개발 서버:
IDE에서 npm run dev로 실행
DB:
OrbStack PostgreSQL 컨테이너로 실행
Redis:
필요할 때만 컨테이너로 실행
Backend/Frontend:
초기에는 로컬 Node 실행 유지
services:
postgres:
image: postgres:16
container_name: togethermall-postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_USER: together
POSTGRES_PASSWORD: together_local_password
POSTGRES_DB: together
volumes:
- togethermall_postgres_data:/var/lib/postgresql/data
volumes:
togethermall_postgres_data:
docker compose up -d
docker compose ps
docker compose logs -f postgres
POSTGRES_PASSWORD는 로컬 개발용 값입니다.DATABASE_URL이 필요합니다.localhost:5432를 사용합니다.DATABASE_URL="postgresql://together:together_local_password@localhost:5432/together?schema=public"
Backend:
Mac에서 npm run dev
PostgreSQL:
Docker 컨테이너
접속 주소:
localhost:5432
DATABASE_URL="postgresql://together:together_local_password@postgres:5432/together?schema=public"
Backend:
Docker 컨테이너
PostgreSQL:
Docker 컨테이너
접속 주소:
postgres:5432
localhost.postgres를 사용합니다.PrismaClientInitializationError가 발생할 수 있습니다.docker compose up -d
npx prisma generate
npx prisma migrate dev
npm run seed
npm run dev
npx prisma validate
npx prisma db pull
DB 컨테이너가 꺼져 있음
DATABASE_URL 포트가 틀림
POSTGRES_USER/PASSWORD가 다름
DB 이름이 다름
shadow database 권한 없음
migration 상태가 꼬임
DATABASE_URL을 확인해야 합니다.SHADOW_DATABASE_URL="postgresql://together:together_local_password@localhost:5432/together_shadow?schema=public"
docker exec -it togethermall-postgres psql -U together -d postgres
CREATE DATABASE together_shadow;
\l
services:
postgres:
image: postgres:16
container_name: togethermall-postgres
restart: unless-stopped
ports:
- "5432:5432"
environment:
POSTGRES_USER: together
POSTGRES_PASSWORD: together_local_password
POSTGRES_DB: together
volumes:
- togethermall_postgres_data:/var/lib/postgresql/data
redis:
image: redis:7
container_name: togethermall-redis
restart: unless-stopped
ports:
- "6379:6379"
volumes:
- togethermall_redis_data:/data
volumes:
togethermall_postgres_data:
togethermall_redis_data:
REDIS_URL="redis://localhost:6379"
docker exec -it togethermall-redis redis-cli ping
정상 응답:
PONG
프로젝트 A PostgreSQL:
localhost:5432
프로젝트 B PostgreSQL:
localhost:5432
결과:
둘 중 하나만 실행 가능
ports:
- "5433:5432"
DATABASE_URL="postgresql://user:password@localhost:5433/project_b?schema=public"
메인 프로젝트:
PostgreSQL 5432
Redis 6379
서브 프로젝트:
PostgreSQL 5433, 5434
Redis 6380, 6381
docker compose down
docker compose down -v
docker volume ls
docker volume rm togethermall_postgres_data
down -v는 로컬 DB를 초기화할 때는 편하지만, 실수하면 데이터가 날아갑니다.docker compose down -v
docker compose up -d
npx prisma migrate dev
npm run seed
npx prisma migrate reset
migrate reset은 DB를 날리고 migration과 seed를 다시 실행합니다.운영 DB에서 reset 금지
스테이징에서도 신중히 사용
seed가 최신인지 확인
로컬 테스트 데이터 삭제됨
docker exec togethermall-postgres pg_dump \
-U together \
-d together \
> together_local_backup.sql
cat together_local_backup.sql | docker exec -i togethermall-postgres psql \
-U together \
-d together
운영 데이터 덤프는 개인정보 포함 가능
로컬에 실데이터 저장 주의
Git에 dump 파일 절대 커밋 금지
백업 파일 이름에 날짜 포함
docker compose logs -f postgres
docker compose logs --tail=100 postgres
docker logs togethermall-postgres
psql, Redis에서는 redis-cli를 자주 씁니다.docker exec -it togethermall-postgres psql -U together -d together
\l
\dt
docker exec -it togethermall-redis redis-cli
Backend:
Mac Node.js에서 npm run dev
DB:
Docker PostgreSQL
장점:
디버깅 쉬움
파일 변경 반영 빠름
IDE 연동 편함
메모리 사용 상대적으로 단순
Backend:
Docker 컨테이너
DB:
Docker PostgreSQL
장점:
운영 환경과 비슷함
팀원 온보딩 쉬움
Node 버전 통일 쉬움
단점:
볼륨/파일 watch 이슈
디버깅 번거로움
빌드/재시작 비용
지금 단계:
DB/Redis만 Docker
Backend/Frontend/Admin은 로컬 Node 실행
나중 단계:
배포 테스트용으로 backend Dockerfile 작성
CI/CD 또는 staging에서 container build
postgres 컨테이너 1개
├─ project_a DB
├─ project_b DB
└─ project_c DB
장점:
가벼움
관리 단순
포트 하나만 사용
단점:
프로젝트 간 완전 분리 아님
버전 다르게 쓰기 어려움
실수로 DB 선택 잘못할 수 있음
project_a-postgres:5432
project_b-postgres:5433
project_c-postgres:5434
장점:
프로젝트별 완전 분리
삭제/초기화 안전
버전 다르게 가능
단점:
컨테이너 많아짐
포트 관리 필요
메모리 사용 증가
주력 프로젝트:
별도 compose + 별도 volume
가끔 보는 토이 프로젝트:
공유 PostgreSQL 또는 필요할 때만 실행
동시에 3개 상시 실행:
비추천, 필요한 것만 켜기
togethermall/
docker-compose.yml
package.json
apps/
packages/
prisma/
docker-compose.yml:
기본 또는 로컬 개발용
docker-compose.dev.yml:
개발용
docker-compose.prod.yml:
운영 배포용
docker-compose.override.yml:
개인 로컬 override
docker compose -f docker-compose.dev.yml up -d
docker-compose.yml 하나로 시작해도 됩니다..env를 사용할 수 있습니다.services:
postgres:
image: postgres:16
ports:
- "${POSTGRES_PORT}:5432"
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_PORT=5432
POSTGRES_USER=together
POSTGRES_PASSWORD=together_local_password
POSTGRES_DB=together
로컬 compose .env는 Git 커밋 주의
.env.example 제공
운영 Secret과 동일한 값 사용 금지
비밀번호는 개발용이라도 너무 대충 공개하지 않기
.env는 커밋하면 안 됩니다..env.example로 필요한 변수만 알려주는 것이 좋습니다..env.example은 중요합니다.POSTGRES_PORT=5432
POSTGRES_USER=together
POSTGRES_PASSWORD=change_me
POSTGRES_DB=together
DATABASE_URL=postgresql://together:change_me@localhost:5432/together?schema=public
SHADOW_DATABASE_URL=postgresql://together:change_me@localhost:5432/together_shadow?schema=public
REDIS_URL=redis://localhost:6379
.env.example필요한 변수 모두 포함
실제 비밀번호 없음
로컬 실행 기준 설명
주석으로 용도 표시
최신 상태 유지
.env.example이 최신이면 새 장비에서 세팅이 훨씬 쉬워집니다.docker system df
docker system prune
docker system prune --volumes
--volumes는 DB 데이터까지 지울 수 있으므로 매우 조심해야 합니다.안 쓰는 프로젝트 컨테이너 down
필요 없는 이미지 정리
볼륨 삭제 전 이름 확인
DB 데이터 필요한지 확인
프로젝트별 volume 이름 명확히 작성
#!/bin/bash
set -e
echo "Starting local infra..."
docker compose up -d postgres redis
docker compose ps
#!/bin/bash
set -e
echo "Stopping local infra..."
docker compose stop postgres redis
docker compose ps
{
"scripts": {
"infra:up": "docker compose up -d postgres redis",
"infra:down": "docker compose down",
"infra:stop": "docker compose stop postgres redis",
"infra:logs": "docker compose logs -f"
}
}
down은 컨테이너 제거, stop은 중지입니다.stop도 좋습니다.1. OrbStack 실행 확인
2. docker compose up -d postgres redis
3. docker compose ps
4. DATABASE_URL 확인
5. npx prisma generate
6. migration 상태 확인
7. 백엔드 npm run dev
8. 프론트/어드민 npm run dev
9. 주요 API 접속 확인
1. docker compose ps
2. docker compose logs postgres
3. DATABASE_URL 확인
4. 포트 충돌 확인
5. psql 직접 접속
6. Prisma validate
7. 백엔드 재시작
DATABASE_URL이 운영 DB를 가리킴
로컬에서 migrate reset 실행
운영 DB에 seed 실행
실데이터 덤프를 Git에 커밋
실서버 데이터를 로컬 테스트처럼 수정
.env.local과 .env.production 분리
운영 DATABASE_URL 로컬 저장 최소화
터미널에 현재 AWS profile 표시
운영 명령어는 별도 확인 프롬프트 추가
Prisma reset은 로컬에서만 실행
운영 DB 접속 권한 최소화
로컬 DB:
together_local 또는 together
Shadow DB:
together_shadow
스테이징 DB:
together_staging
운영 DB:
절대 로컬 명령어에서 사용하지 않기
Mac + OrbStack 환경에서 Docker Compose로 PostgreSQL을 띄우고, NestJS + Prisma 백엔드를 로컬 Node로 실행 중이야.
상황:
1. PostgreSQL 컨테이너 이름은 togethermall-postgres
2. compose ports는 "5432:5432"
3. POSTGRES_USER=together
4. POSTGRES_DB=together
5. DATABASE_URL은 postgresql://together:****@localhost:5432/together?schema=public
6. 백엔드는 Docker가 아니라 Mac에서 npm run dev로 실행함
7. npx prisma migrate dev 실행 시 DB 연결 오류가 남
아래 정보 기준으로 원인을 좁혀줘:
- docker compose ps 결과
- docker compose logs postgres 결과
- DATABASE_URL
- Prisma 에러 메시지
답변은 확인 순서와 수정 명령어 중심으로 정리해줘.
localhost와 compose service name 차이를 설명하는가?down -v의 데이터 삭제 위험을 설명하는가?docker-compose.yml이 프로젝트 루트에 있는가?.env.example에 정리되어 있는가?docker compose up -d로 재현 가능한가?DATABASE_URL이 localhost 또는 올바른 포트를 가리키는가?migrate reset을 운영 DB에서 실행하지 않도록 방지하고 있는가?.gitignore에 포함되어 있는가?docker system df로 용량을 확인했는가?docker, docker compose를 그대로 사용합니다.localhost, 백엔드도 컨테이너 안에서 실행되면 DB host는 compose service name인 postgres를 사용합니다.docker compose down은 데이터가 유지되지만, docker compose down -v는 DB 데이터까지 삭제할 수 있어 조심해야 합니다.DATABASE_URL, SHADOW_DATABASE_URL, migration 상태, seed 최신 여부를 함께 확인해야 합니다..env.local, .env.production, AWS profile, DB 이름, reset 명령어 사용 기준을 확실히 분리해야 합니다.docker compose up -d → migrate → seed → npm run dev로 재현 가능한 안정적인 로컬 인프라 구조를 만드는 것입니다.