VPS로 Docker 셀프 호스팅 시작하기 2026: docker-compose + Caddy로 SaaS 대체 앱 운영까지

이 글에는 제휴 링크(affiliate link)가 포함되어 있습니다. Vultr·DigitalOcean 가입 링크를 사용하시면 추가 크레딧 혜택이 제공되며, 블로그 운영에 도움이 됩니다. Docker 자체는 모든 VPS 공급자에서 동일하게 동작합니다.

2026년, VPS 한 대만 있으면 유료 SaaS를 대체하는 셀프 호스팅(self-hosted) 앱을 무제한으로 운영할 수 있습니다. 북마크 관리(Linkding), 비밀번호 관리자(Vaultwarden), 메모(Trilium), 미디어 갤러리(Immich), 마크다운 노트(Joplin)까지 — 매월 내던 구독료를 VPS 한 대 비용으로 통합하는 셈입니다. 그 핵심에 Docker가 있습니다. 이 가이드에서는 VPS에 Docker를 설치하고, docker-compose로 앱을 올리며, 도메인+SSL까지 연결하는 한국 실전 셀프 호스팅 입문 과정을 정리합니다.

이 글은 VPS 실전 가이드 시리즈 #7입니다. 서버가 아직 없다면 VPS 3대 비교 2026에서, 배포 기초는 Vultr 워드프레스 배포 튜토리얼에서 확인하세요. 서버 보안은 VPS 보안 완벽 가이드가 선행되어야 합니다.

왜 Docker로 셀프 호스팅인가

과거엔 서버에 앱 하나를 올릴 때마다 의존성 충돌, 버전 관리, 설정 파일 분산에 시달렸습니다. Docker는 이 문제를 “앱과 모든 설정을 하나의 격리된 컨테이너로 포장”해 해결합니다. 셀프 호스팅 입문자가 Docker를 선택하는 이유는 다음과 같습니다.

  • 재현성: 동일한 컨테이너는 어떤 VPS에서도 똑같이 동작한다
  • 격리: 여러 앱이 서로 충돌하지 않고 한 서버에 공존한다
  • 복구: 설정을 코드(compose 파일)로 관리해 서버 이전이 5분이면 끝난다
  • 생태계: 수만 개의 사전 패키지 이미지를 그대로 가져다 쓴다

특히 docker-compose를 쓰면 “명령어 한 줄로 전체 서비스 구성을 올리고 내리는” 것이 가능합니다. 이것이 셀프 호스팅을 대중화한 핵심 도구입니다.

1단계: VPS에 Docker + Compose 설치

Ubuntu/Debian 기준으로 공식 저장소에서 Docker와 docker compose 플러그인을 설치합니다. 서버는 보안 가이드를 따라 기본 세팅(방화벽, sudo 사용자)이 끝난 상태라고 가정합니다.

# 패키지 최신화
sudo apt update && sudo apt upgrade -y

# Docker 공식 설치 스크립트
curl -fsSL https://get.docker.com | sudo sh

# 현재 사용자를 docker 그룹에 추가 (sudo 없이 실행)
sudo usermod -aG docker $USER
newgrp docker

# 설치 확인
docker --version
docker compose version

docker 그룹에 사용자를 추가하면 매번 sudo를 치지 않아도 됩니다. (보안상 root 권한과 동일하므로 신뢰할 수 있는 사용자에게만 부여하세요.)

실전 팁: 설치 직후 docker run hello-world로 정상 작동을 확인하세요. “Hello from Docker!” 메시지가 나오면 설치가 완료된 것입니다.

2단계: docker-compose로 첫 앱 올리기 (Linkding)

실습용으로 가벼운 북마크 관리자 Linkding을 올려봅니다. 디렉토리를 만들고 docker-compose.yml을 작성합니다.

mkdir -p ~/docker/linkding && cd ~/docker/linkding
nano docker-compose.yml

아래 내용을 붙여넣습니다.

services:
  linkding:
    container_name: linkding
    image: sissbruecker/linkding:latest
    ports:
      - "9090:9090"
    volumes:
      - ./data:/etc/linkding/data
    restart: unless-stopped

이제 서비스를 백그라운드로 시작합니다.

docker compose up -d
docker compose ps          # 실행 상태 확인
docker compose logs -f     # 로그 실시간 확인 (Ctrl+C로 종료)

브라우저에서 http://서버IP:9090을 열면 Linkding 로그인 화면이 나옵니다. 단, 9090 포트를 그대로 외부에 노출하면 위험합니다. 다음 단계에서 리버스 프록시로 안전하게 노출합니다.

3단계: 리버스 프록시 + SSL로 도메인 연결 (Caddy)

여러 컨테이너를 각각 다른 포트로 열어두면 관리가 어렵고 보안도 취약합니다. 리버스 프록시로 80/443 포트 하나에서 모든 앱을 도메인별로 라우팅하는 것이 정석입니다. 여기서는 자동 SSL이 내장된 Caddy를 사용합니다 (Nginx + Certbot 조합보다 설정이 훨씬 단순합니다).

mkdir -p ~/docker/caddy && cd ~/docker/caddy
nano docker-compose.yml
services:
  caddy:
    container_name: caddy
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    network_mode: host

volumes:
  caddy_data:
  caddy_config:

같은 디렉토리에 Caddyfile을 만듭니다 (bookmarks.도메인.com는 실제 도메인으로 교체).

bookmarks.example.com {
    reverse_proxy localhost:9090
}

이제 Caddy를 띄웁니다.

docker compose up -d
docker compose logs -f caddy    # SSL 발급 로그 확인

Caddy는 시작하면서 Let’s Encrypt 인증서를 자동으로 발급하고, 90일마다 자동 갱신합니다. DNS가 전파된 상태라면 1분 내로 https://bookmarks.example.com으로 Linkding에 안전하게 접속할 수 있습니다. 방화벽(UFW)에서는 80·443만 열어두고 9090은 외부에 노출하지 않습니다.

추천 셀프 호스팅 앱 — SaaS 대체 매트릭스

한 대의 VPS에 올려두면 유용한 인기 셀프 호스팅 앱을 정리합니다. 모두 Docker로 배포 가능합니다.

대체하는 SaaS 용도 난이도
Vaultwarden 1Password / Bitwarden 유료 비밀번호 관리자 ★★☆
Immich Google Photos / iCloud 사진 자동 백업·갤러리 ★★☆
Joplin Server Evernote / Notion 마크다운 노트 동기화 ★☆☆
Linkding Pocket / Raindrop 북마크 관리 ★☆☆
Nextcloud Google Drive / Dropbox 클라우드 스토리지 ★★★
Paperless-ngx 문서 관리 SaaS 영수증·문서 OCR 보관 ★★☆
AdGuard Home 광고 차단 유료 DNS 네트워크 광고 차단 ★☆☆

이 앱들을 합치면 월 수만 원의 구독료를 절감할 수 있습니다. 단, 셀프 호스팅은 ‘백업 책임’이 사용자에게 있으므로 반드시 정기 백업을 구성하세요. 백업 전략은 VPS 백업 완벽 가이드에서 다룹니다.

4단계: 업데이트·백업·운영 수칙

Docker 셀프 호스팅을 장기 운영하려면 몇 가지 습관이 필요합니다.

이미지 업데이트 — 정기적으로 최신 이미지로 갱신합니다.

cd ~/docker/linkding
docker compose pull            # 최신 이미지 받기
docker compose up -d           # 컨테이너 재생성
docker image prune -f          # 오래된 이미지 정리

데이터 백업 — 앱 데이터는 ./data 같은 볼륨 디렉토리에 있으므로, 이 디렉토리만 백업하면 전체 상태가 보존됩니다. compose 파일과 데이터 디렉토리를 함께 보관하면 서버 이전 시 그대로 복원됩니다.

리소스 관리docker stats로 각 컨테이너의 CPU/메모리 사용량을 모니터링하세요. 1GB RAM 서버에 무거운 앱(Nextcloud 등)을 여러 개 올리면 메모리 부족이 발생합니다. 이럴 때는 2GB 이상 플랜으로 업그레이드하거나 Swap을 추가합니다.

비용 비교: 셀프 호스팅 vs SaaS 구독

구성 월 비용
VPS $5 플랜 + Docker (앱 5~7개) $5~6
1Password 가족 + Google Photos 200GB + Notion 등 ₩30,000~50,000 (≈$25~40)
절감 효과 월 $20~35 / 연 $240~420

공급자를 아직 고르지 않았다면, 한국 접속 속도가 빠른 Vultr(서울 리전, $100 크레딧) 또는 DigitalOcean($200 크레딧)을 추천합니다. 가성비가 최우선이라면 Hetzner로 시작하세요.

자주 묻는 질문 (FAQ)

Docker 없이 셀프 호스팅이 불가능한가요?
가능하지만 권장하지 않습니다. 의존성 충돌과 제거 문제가 끊임없이 발생합니다. Docker의 격리와 재현성이 셀프 호스팅의 복잡도를 극적으로 낮춰줍니다. 초보자일수록 Docker를 먼저 배우는 것이 장기적으로 더 빠릅니다.

1GB RAM VPS에 앱을 몇 개까지 올릴 수 있나요?
가벼운 앱(Linkding, AdGuard, Joplin 등)이라면 5~7개까지 충분합니다. Nextcloud나 Immich처럼 무거운 앱은 메모리를 많이 쓰므로 2~4개 수준에서 2GB 플랜으로 업그레이드를 고려하세요. docker stats로 실제 사용량을 보고 판단합니다.

각 앱에 SSL을 따로 발급해야 하나요?
아닙니다. Caddy나 Nginx Proxy Manager 같은 리버스 프록시가 도메인별로 인증서를 자동 발급·갱신합니다. 앱 컨테이너 자체는 내부망(HTTP)으로 두고, 프록시가 HTTPS를 종료하는 구조가 정석입니다.

컨테이너 데이터는 어디에 저장되나요?
compose 파일의 volumes에 지정한 호스트 디렉토리(예: ./data)에 저장됩니다. 이 디렉토리를 백업하면 컨테이너를 삭제·재생성해도 데이터가 보존됩니다. 절대 컨테이너 내부에만 두지 마세요.

셀프 호스팅 서버 보안은 어떻게?
Docker를 쓰더라도 서버 자체의 UFW 방화벽, SSH hardening, fail2ban은 필수입니다. 또한 9090 같은 앱 포트를 외부에 직접 노출하지 말고 리버스 프록시 뒤에 두어야 합니다. 보안 기본은 VPS 보안 완벽 가이드를 참고하세요.

마무리: VPS 한 대로 끝없는 자유

Docker와 docker-compose, 리버스 프록시(Caddy) 세 가지만 익히면 VPS 한 대가 곧 나만의 개인 클라우드가 됩니다. 유료 SaaS 구독을 하나둘 대체하면 초기 학습 시간을 금방 회수할 수 있고, 데이터 주권까지 확보할 수 있습니다. 핵심은 compose 파일로 설정을 코드화해두는 것 — 서버가 바뀌어도 5분이면 전체 환경이 재현됩니다.

시작은 가벼운 앱 하나(Linkding 등)로 해보세요. 익숙해지면 Vaultwarden, Immich 순으로 영역을 넓히면 됩니다. 그리고 잊지 말 것 — 백업은 셀프 호스팅의 생명줄입니다. VPS 백업 완벽 가이드로 자동 백업까지 세팅하면 비로소 안심하고 운영할 수 있습니다.

관련 글