UGREEN DXP4800PLUS NAS Docker Compose 설치 및 사용 가이드

 Docker를 설치하고 나서 처음에는 컨테이너를 하나씩 docker run 명령어로 실행했다. 그런데 서비스가 늘어나면서 문제가 생겼다. 어떤 포트로 실행했는지, 어떤 볼륨을 마운트했는지, 환경변수는 뭘 넣었는지 기억하기 어려워졌다.

결국 Docker Compose로 전환했다. 지금은 docker-compose.yml 파일 하나로 모든 서비스를 관리하고 있다. NAS가 재부팅되어도 restart: unless-stopped 설정 덕분에 모든 컨테이너가 자동으로 복구된다.

이 글에서는 UGREEN DXP4800PLUS NAS에서 Docker Compose를 설치하고 실제 서비스를 운영하는 방법을 정리한다.


Docker Compose란

Docker Compose는 여러 컨테이너를 하나의 파일로 정의하고 관리하는 도구다.

예를 들어 FastAPI 서버와 PostgreSQL 데이터베이스를 함께 운영할 때, Docker Compose 없이는 이렇게 해야 한다.

bash

# Docker Compose 없이 실행
docker run -d --name postgres \
  -e POSTGRES_DB=mydb \
  -e POSTGRES_USER=myuser \
  -v /volume2/docker/myapp/data:/var/lib/postgresql/data \
  postgres:15-alpine

docker run -d --name fastapi \
  -p 8105:8105 \
  --depends-on postgres \
  myapp:latest

Docker Compose를 사용하면 이 모든 설정을 파일 하나로 관리할 수 있다.


Docker Compose 설치 확인

UGREEN DXP4800PLUS에서 Docker를 설치하면 Docker Compose도 함께 설치된다.

bash

docker compose version

버전이 출력되면 정상이다. docker-compose (하이픈)가 아닌 docker compose (스페이스)가 최신 방식이다.


실제 docker-compose.yml 예시

현재 운영 중인 유튜브 쇼츠 자동화 시스템의 구성을 단순화한 예시 파일이다.

실제 운영 환경에서는 추가 서비스와 환경변수 설정이 더 포함되어 있다.

yaml

services:
  shorts-api:
    image: python:3.11-slim
    container_name: shorts-api
    ports:
      - "8105:8105"
    volumes:
      - ./app:/app
    working_dir: /app
    env_file:
      - .env
    environment:
      - TZ=Asia/Seoul
    restart: unless-stopped
    command: >
      sh -c "pip install fastapi uvicorn sqlalchemy psycopg2-binary &&
             uvicorn main:app --host 0.0.0.0 --port 8105"
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:15-alpine
    container_name: shorts-postgres
    environment:
      POSTGRES_DB: shorts
      POSTGRES_USER: shorts
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: Asia/Seoul
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U shorts"]
      interval: 5s
      timeout: 5s
      retries: 5

주요 설정 항목 설명

restart: unless-stopped

NAS 재부팅 후 컨테이너가 자동으로 다시 시작된다. 이 옵션을 빠뜨리면 NAS 재부팅 후 서비스가 꺼진 채로 방치된다. 반드시 넣어야 한다.

depends_on

shorts-apipostgres가 정상 상태일 때만 시작된다. condition: service_healthy를 사용하면 PostgreSQL이 완전히 준비된 후에 FastAPI가 실행된다. 이걸 빠뜨리면 DB 연결 오류가 발생한다.

healthcheck

yaml

healthcheck:
  test: ["CMD-SHELL", "pg_isready -U shorts"]
  interval: 5s
  timeout: 5s
  retries: 5

5초마다 PostgreSQL 상태를 확인한다. depends_on과 함께 써야 제대로 동작한다.

env_file

민감한 정보(패스워드, API 키)는 .env 파일로 분리한다.

# .env 파일

POSTGRES_PASSWORD=mypassword
OPENROUTER_API_KEY=sk-xxxxx

.env 파일은 절대 Git에 올리지 않는다.


기본 명령어

bash
# 서비스 시작 (백그라운드)
docker compose up -d

# 서비스 중지
docker compose down

# 로그 확인
docker compose logs -f

# 특정 서비스 로그만
docker compose logs -f shorts-api

# 서비스 재시작
docker compose restart shorts-api

# 상태 확인
docker compose ps

처음에는 docker compose up (백그라운드 없이)으로 실행해서 로그를 직접 보는 것을 권장한다. 오류가 있을 때 바로 확인할 수 있다.


실제 운영 팁

폴더 구조 통일

/volume2/docker/
├── shorts-trend/
│   ├── docker-compose.yml
│   ├── .env
│   └── app/
├── n8n/
│   ├── docker-compose.yml
│   └── .env
└── kiwoom-bot/
    ├── docker-compose.yml
    └── .env


서비스별로 폴더를 분리하면 관리가 편하다. 각 폴더에서 docker compose up -d를 실행하면 된다.

업데이트 방법

bash
docker compose pull        # 최신 이미지 다운로드
docker compose up -d       # 재시작 (변경사항 적용)

컨테이너 내부 접속

bash
docker compose exec shorts-api bash
docker compose exec postgres psql -U shorts

마무리

Docker Compose를 도입한 후 NAS 운영이 훨씬 편해졌다. 새로운 서비스를 추가할 때마다 docker-compose.yml에 서비스 블록 하나를 추가하고 docker compose up -d만 실행하면 된다.

현재 UGREEN DXP4800PLUS에서 이 방식으로 20개 이상의 컨테이너를 안정적으로 운영하고 있다.

다음 글에서는 PostgreSQL 컨테이너를 활용해 유튜브 조회수 성장률을 계산하는 방법을 정리할 예정이다.


관련 글

댓글

이 블로그의 인기 게시물

UGREEN DXP4800PLUS NAS로 유튜브 쇼츠 자동화 시스템 구축기 (Docker · FastAPI · PostgreSQL · Edge-TTS)

YouTube Data API 쿼터 초과를 피하는 방법 (700개 쇼츠 수집 사례)

FastAPI app.mount 사용 후 API가 404가 되는 이유와 해결 방법