13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 컨테이너 관리

  • [Nas] TrueNAS SCALE: Docker 및 Kubernetes 앱 배포 및 관리 완벽 가이드

    [Nas] TrueNAS SCALE: Docker 및 Kubernetes 앱 배포 및 관리 완벽 가이드

    TrueNAS SCALE: Docker 및 Kubernetes 앱 배포 및 관리 완벽 가이드

    안녕하세요, 13년차의 서버실 주인장입니다. 홈랩(HomeLab)을 운영하다 보면 NAS에 이것저것 서비스를 올려보고 싶은 욕구가 스멀스멀 올라오잖아요? 저도 처음엔 단순히 파일 저장용으로 시작했는데, Plex(미디어 서버), Nextcloud(개인 클라우드), Home Assistant(스마트 홈 허브) 같은 다양한 앱들을 돌리고 싶어서 고민이 많았습니다.

    예전에는 일일이 가상머신(Virtual Machine)을 만들어서 설치하곤 했는데, 관리도 어렵고 자원도 많이 먹더라고요. 그러다 컨테이너(Container) 기술인 Docker(도커)와 Kubernetes(쿠버네티스)를 접하게 됐고, NAS에서 이걸 더 쉽게 쓸 방법이 뭘까 고민하던 차에 TrueNAS SCALE을 만나게 됐습니다. TrueNAS SCALE은 리눅스 기반이라 Docker와 Kubernetes를 네이티브(Native)하게 지원하거든요. 특히 TrueNAS SCALE Docker 환경에서 앱을 배포하고 관리하는 경험은 정말 신세계더라고요.

    오늘은 제가 직접 TrueNAS SCALE을 활용해서 Docker와 Kubernetes 앱을 배포하고 관리하면서 겪었던 삽질 경험과 해결 과정, 그리고 효율적인 관리 팁까지 완벽하게 풀어드리려고 합니다. 홈랩에 컨테이너 기반 앱을 올려보고 싶었던 분들이라면 이 글이 큰 도움이 될 거예요!

    TrueNAS SCALE 환경에서 Docker 및 Kubernetes 앱 배포의 전체적인 아키텍처를 보여주는 다이어그램입니다.

    TrueNAS SCALE, Docker, Kubernetes 핵심 개념 이해하기

    본격적인 실전에 들어가기 전에, 우리가 다룰 핵심 기술들이 무엇인지 쉽고 간단하게 짚고 넘어갈 수 있도록, 제가 처음 공부할 때 “이게 뭔 소리야?” 했던 개념들을 멘토처럼 알려드릴게요!

    TrueNAS SCALE: 리눅스 기반의 강력한 NAS 운영체제

    • TrueNAS SCALE은 오픈소스(Open Source) NAS 운영체제인 TrueNAS의 한 버전입니다. 기존 FreeBSD 기반의 TrueNAS CORE와는 다르게 Debian Linux(데비안 리눅스)를 기반으로 하고 있어요.
    • 이 덕분에 컨테이너(Container) 기술인 Docker와 오케스트레이션(Orchestration) 도구인 Kubernetes를 기본적으로 지원하고, 훨씬 더 넓은 범위의 앱 생태계를 활용할 수 있게 됐죠.
    • 강력한 파일 시스템인 ZFS(Z File System)를 기반으로 데이터 무결성(Data Integrity)과 유연한 스토리지 관리를 제공하는 건 기본입니다.

    Docker (도커): 앱을 컨테이너에 담아 쉽게 배포!

    • Docker(도커)는 애플리케이션(Application)과 그 실행에 필요한 모든 요소를 컨테이너라는 독립적인 환경에 패키징(Packaging)하여 배포하고 실행하는 기술입니다. 쉽게 말해, 앱을 하나의 깔끔한 상자에 담아 어디서든 똑같이 실행될 수 있도록 만들어주는 거죠.
    • 장점:
      • 이식성(Portability): 어떤 환경에서든 동일하게 작동합니다. “제 컴퓨터에선 되는데?” 하는 말을 들을 일이 줄어들어요.
      • 격리성(Isolation): 각 앱이 서로 영향을 주지 않고 독립적으로 실행됩니다.
      • 효율성(Efficiency): 가상머신보다 가볍고 빠릅니다.

    Kubernetes (쿠버네티스): 컨테이너 오케스트레이션의 지휘자

    • Kubernetes(쿠버네티스, 줄여서 K8s)는 컨테이너화된 워크로드(Workload)와 서비스를 자동으로 배포하고, 스케일링(Scaling)하며, 관리해주는 오픈소스 시스템입니다. Docker 컨테이너가 많아지면 이걸 효율적으로 관리하는 게 정말 어려워지거든요. 이때 K8s가 마치 지휘자처럼 여러 컨테이너를 조율해줍니다.
    • TrueNAS SCALE Kubernetes 환경에서는 TrueNAS의 ‘Apps’ 기능을 통해 Helm Chart(헬름 차트) 기반의 Kubernetes 앱을 쉽게 배포할 수 있어요.
    • NAS 앱 배포를 자동화하고 안정성을 높이는 데 아주 효과적이죠.

    Dockge (닥지): Docker Compose를 위한 웹 UI

    • TrueNAS SCALE의 내장 Apps 기능도 훌륭하지만, Docker Compose(도커 컴포즈) 파일을 직접 관리하는 데 익숙한 분들에게는 조금 답답할 수 있어요. 이때 Dockge(닥지)가 구원투수로 등장합니다!
    • Dockge는 Docker Compose 파일을 웹 UI(User Interface)를 통해 생성, 편집, 배포, 모니터링할 수 있게 해주는 경량 도구입니다. 제가 직접 써보니 Docker Compose를 활용한 컨테이너 관리가 훨씬 편하더라고요.

    TrueNAS SCALE에서 Docker 및 Kubernetes 앱 실전 배포

    자, 이제 이론은 충분히 봤으니 직접 한번 해봐야죠! 제가 실제로 홈랩에서 앱을 배포하는 과정을 보여드릴게요. TrueNAS SCALE의 ‘Apps’ 기능을 이용하는 방법과 Dockge를 활용하는 두 가지 방법을 모두 알려드리겠습니다.

    1. TrueNAS SCALE 내장 ‘Apps’ 기능 활용하기 (Kubernetes 기반)

    TrueNAS SCALE은 자체적으로 Kubernetes 클러스터를 내장하고 있어서 ‘Apps’ 메뉴를 통해 다양한 앱을 손쉽게 배포할 수 있어요. 주로 Helm Chart(헬름 차트) 기반의 앱들이 제공됩니다.

    1. Apps 기능 활성화 및 스토리지 풀 선택:
      • TrueNAS SCALE 웹 UI에 접속합니다.
      • 좌측 메뉴에서 ‘Apps’를 클릭합니다.
      • ‘Settings’ 탭으로 이동하여 ‘Choose Pool’에서 앱 데이터를 저장할 ZFS 스토리지 풀(Storage Pool)을 선택합니다. 저는 보통 ‘ix-applications’라는 데이터셋(Dataset)이 자동으로 생성되도록 합니다.
      • ‘Save’를 눌러 설정을 저장합니다.
    2. 앱 검색 및 설치:
      • ‘Available Applications’ 탭으로 돌아와 원하는 앱을 검색해요. 예를 들어 ‘Plex’를 검색해 볼까요?
      • Plex 앱을 선택하고 ‘Install’을 클릭합니다.
      • 설치 마법사(Wizard)가 나타나는데, 여기서 앱 이름, Persistent Volume(영구 볼륨), 네트워크 설정, 환경 변수(Environment Variables) 등을 설정할 수 있어요. 특히 볼륨 설정은 앱 데이터가 저장될 위치를 지정하는 중요한 부분이니 신중하게 설정해야 합니다.
      • 필요한 설정을 마친 후 ‘Install’을 클릭하면 앱 배포가 시작됩니다.
    3. 배포된 앱 확인:
      • ‘Installed Applications’ 탭에서 배포된 앱의 상태를 확인할 수 있어요. ‘Deploying’에서 ‘Active’로 바뀌면 정상적으로 실행 중인 것입니다.
      • 앱 옆의 ‘Web UI’ 버튼을 클릭하여 해당 앱의 웹 인터페이스에 접속할 수 있습니다.

    2. Dockge를 활용하여 Docker Compose 앱 배포하기

    TrueNAS SCALE의 Apps 기능도 좋지만, 저는 Docker Compose 파일로 직접 컨테이너 설정을 제어하는 걸 더 선호하는 편입니다. 이때 Dockge TrueNAS 설치가 정말 유용하더라고요. Dockge는 Docker Compose 파일을 웹 UI에서 쉽게 관리할 수 있게 해줍니다. 먼저 Dockge부터 설치해봅시다!

    2.1. Dockge 설치

    Dockge는 Docker 컨테이너로 실행되는데, TrueNAS SCALE의 Shell(쉘)을 통해 Docker 명령어를 직접 입력하여 설치할 수 있어요.

    1. TrueNAS SCALE Shell 접속:
      • TrueNAS SCALE 웹 UI에서 ‘System Settings’ > ‘Shell’로 이동합니다.
    2. Dockge 설치 스크립트 실행:

      다음 명령어를 입력하여 Dockge를 설치합니다. 이 명령어는 Docker Compose를 이용해 Dockge 컨테이너를 실행하고, 필요한 볼륨과 네트워크를 설정해줍니다. 저는 주로 /mnt/pool_name/appdata/dockge 경로에 데이터를 저장합니다.

      mkdir -p /mnt/pool_name/appdata/dockge
      cd /mnt/pool_name/appdata/dockge
      
      curl -L https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml -o compose.yaml
      
      docker compose up -d
      

      여기서 pool_name은 여러분의 ZFS 스토리지 풀 이름으로 바꿔주세요. 예를 들어 /mnt/tank/appdata/dockge 처럼요.

    3. Dockge 웹 UI 접속:

      설치가 완료되면 웹 브라우저에서 http://[TrueNAS_IP]:5001 (기본 포트)로 접속하여 Dockge 웹 UI를 확인할 수 있어요. 처음 접속 시 관리자 계정을 설정하게 됩니다.

    2.2. Dockge를 이용한 Docker Compose 앱 배포

    Dockge에 접속했다면 이제 원하는 Docker Compose 앱을 배포해봅시다. 저는 간단한 Nginx 웹 서버를 예시로 들어볼게요.

    1. 새로운 스택(Stack) 생성:
      • Dockge UI에서 ‘Stacks’ > ‘New Stack’을 클릭합니다.
      • 스택 이름을 입력하고, Docker Compose YAML 파일을 붙여넣어요.
    2. Docker Compose YAML 작성 예시 (Nginx):
      version: '3.8'
      services:
        nginx:
          image: nginx:latest
          container_name: my-nginx
          restart: unless-stopped
          ports:
            - "80:80"
          volumes:
            - /mnt/pool_name/appdata/nginx/html:/usr/share/nginx/html
            - /mnt/pool_name/appdata/nginx/conf:/etc/nginx/conf.d
      

      위 YAML 파일은 Nginx 컨테이너를 실행하고, 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하며, 데이터를 저장할 볼륨을 설정합니다. 역시 pool_name은 여러분의 스토리지 풀 이름으로 바꿔주세요.

    3. 스택 배포:
      • YAML 파일을 붙여넣고 ‘Deploy’ 버튼을 클릭하면 Dockge가 Docker Compose 명령어를 실행하여 컨테이너를 배포해요.
      • 배포 상태와 로그를 실시간으로 확인할 수 있어서 문제 발생 시 디버깅(Debugging)하기 정말 편하더라고요.

    Dockge 웹 UI에서 Docker Compose 스택을 생성하고 설정하는 화면입니다. YAML 파일 편집과 배포가 한눈에 들어와서 편리하죠.

    ⚠️ 삽질 경험 & 트러블슈팅 가이드

    13년차 엔지니어 생활에서 느낀 건, 새로운 기술을 도입할 때 삽질은 숙명이라는 거예요. TrueNAS SCALE에서 컨테이너 앱을 배포하면서 저도 몇 번이나 “아, 이거 왜 안 되지?” 하면서 머리를 쥐어뜯었거든요. 그 경험을 바탕으로 여러분이 겪을 만한 문제와 해결책을 공유합니다.

    1. 스토리지 권한 문제 (Permissions Issue)

    이거 진짜 제일 많이 겪는 문제예요. 특히 Docker 컨테이너가 TrueNAS의 ZFS 데이터셋에 접근할 때 권한이 없어서 파일을 생성하거나 읽지 못하는 경우가 허다하거든요. 컨테이너 내부의 프로세스는 특정 사용자(User)와 그룹(Group)으로 실행되는데, 이 사용자에게 ZFS 데이터셋에 대한 쓰기 권한이 없어서 생기는 문제예요.

    • 해결책:
      1. ACL(Access Control List) 설정: TrueNAS 웹 UI에서 해당 데이터셋의 ‘Edit ACL’을 통해 ‘Default ACL’을 설정해주는 게 가장 깔끔합니다. ‘OPEN’ 프리셋을 적용하고, ‘Apply permissions recursively’를 체크하여 하위 폴더까지 적용해줘요.
      2. Shell에서 권한 변경: 급하게 테스트할 때는 Shell에서 chmod와 chown 명령어를 사용하기도 합니다.
        # 소유자를 root:wheel로 변경 (컨테이너가 보통 root로 실행될 때)
        sudo chown -R root:wheel /mnt/pool_name/appdata/your_app
        
        # 모든 사용자에게 읽기/쓰기/실행 권한 부여 (주의: 보안에 취약할 수 있음)
        sudo chmod -R 777 /mnt/pool_name/appdata/your_app
        

        하지만 chmod 777은 보안상 좋지 않으니, 컨테이너가 필요로 하는 최소한의 권한을 부여하는 것을 권장합니다. 보통 PUID/PGID(Process User ID/Group ID) 환경 변수를 통해 컨테이너 내부 사용자 ID를 지정하는 방식으로 해결하더라고요.

    2. 네트워크 설정 및 포트 충돌

    컨테이너 앱이 외부와 통신하려면 네트워크 설정이 중요한데, 특히 포트(Port) 충돌이 자주 발생해요.

    • 문제: 이미 TrueNAS 자체 서비스(예: SMB, SSH)나 다른 컨테이너가 사용 중인 포트를 앱이 사용하려고 할 때 생깁니다.
    • 해결책:
      • 사용 가능한 포트 확인: netstat -tulnp 명령어를 Shell에서 실행하여 현재 사용 중인 포트를 확인해요.
      • 포트 변경: 앱 설정이나 Docker Compose YAML 파일에서 호스트 포트를 다른 사용 가능한 포트로 변경합니다. 예를 들어 Nginx의 80번 포트가 충돌한다면 "8080:80"처럼 변경할 수 있어요.
      • Host Network 사용 시 주의: TrueNAS SCALE의 Apps에서는 ‘Host Network’ 옵션을 제공하는데, 이는 컨테이너가 호스트의 네트워크 스택을 직접 사용하게 하여 성능상 이점이 있지만, 포트 충돌 가능성이 더 높아집니다. 신중하게 사용해야 해요.

    3. 앱 업데이트 후 데이터 유실/오류

    컨테이너 앱을 업데이트하다가 데이터가 날아가거나 앱이 실행되지 않는 경험, 해보셨나요? 😭 저도 예전에 한번 겪고 식겁한 적이 있습니다.

    • 해결책:
      • 백업(Backup) 필수: 업데이트 전에는 항상 중요한 데이터를 백업해둬야 해요. ZFS 스냅샷(Snapshot) 기능을 활용하면 매우 편리하거든요.
      • 볼륨(Volume) 분리: 컨테이너 이미지와 데이터를 저장하는 볼륨을 분리하여 사용하면, 앱을 업데이트하거나 다시 배포해도 데이터는 안전하게 유지됩니다. Dockge의 Docker Compose YAML 예시에서도 볼륨을 명시적으로 분리했죠.
      • 업데이트 전 로그 확인: 새로운 버전의 변경 사항(Changelog)을 미리 확인하여 호환성 문제를 예측하고 대비해요.

    ✅ 배포된 앱 검증 및 결과 확인

    수많은 삽질 끝에 드디어 앱 배포에 성공했어요! 이제 앱이 제대로 작동하는지 확인해봐야죠. 저는 주로 다음 세 가지를 확인합니다.

    1. 웹 UI 접속 확인: 배포한 앱의 웹 인터페이스에 접속하여 정상적으로 화면이 뜨고 로그인, 기능 사용이 가능한지 확인해요. 예를 들어 Nginx라면 웹 브라우저에서 TrueNAS IP로 접속했을 때 기본 페이지가 보여야 하죠.
    2. 로그 확인: 앱이 제대로 작동하지 않을 때는 로그를 확인하는 게 가장 중요합니다.
      • TrueNAS SCALE Apps의 경우: ‘Installed Applications’에서 해당 앱을 선택하고 ‘Logs’ 탭을 확인해요.
      • Dockge를 통해 배포한 Docker Compose 앱의 경우: Dockge UI에서 해당 스택을 선택하면 실시간 로그를 확인할 수 있어요. 또는 TrueNAS Shell에서 docker logs [컨테이너_이름] 명령어를 사용합니다.
    3. 리소스 모니터링: TrueNAS SCALE 대시보드에서 CPU, RAM, 네트워크 사용량 등을 확인하여 앱이 과도하게 리소스를 소모하고 있지 않은지 점검해요. 특히 RAM 사용량은 컨테이너 앱이 많아질수록 중요해지거든요.

    성공적으로 배포된 Plex 미디어 서버의 대시보드 화면입니다. TrueNAS SCALE 위에서 컨테이너 앱들이 안정적으로 작동하는 것을 확인할 수 있습니다.

    🎉 마무리: TrueNAS SCALE로 홈랩을 더욱 강력하게!

    오늘은 TrueNAS SCALE에서 Docker와 Kubernetes 앱을 배포하고 관리하는 완벽 가이드를 함께 살펴봤습니다. 처음엔 좀 복잡하게 느껴질 수도 있지만, 한번 제대로 세팅해두면 정말 편리하고 강력한 홈랩 환경을 구축할 수 있어요.

    TrueNAS SCALE의 내장 ‘Apps’ 기능으로 Kubernetes 기반의 안정적인 앱 배포를 경험하고, Dockge TrueNAS 설치를 통해 Docker Compose 파일을 직접 제어하며 유연하게 컨테이너 관리를 하는 두 가지 방법을 모두 알려드렸는데요. 저는 개인적으로 Dockge를 통한 Docker Compose 관리가 훨씬 손에 익고, 제어권이 많아서 좋더라고요. 하지만 초보자분들이나 복잡한 설정 없이 바로 사용하고 싶다면 TrueNAS Apps도 훌륭한 선택지입니다.

    이런 삽질과 학습 과정을 통해 저의 NAS 앱 배포 경험치도 한 단계 올라간 것 같아요. 여러분도 저처럼 TrueNAS SCALE을 활용해서 나만의 강력한 서버실을 만들어보세요. 다음번에는 Ingress(인그레스, 외부 트래픽 진입점) 설정이나 Persistent Volume(영구 볼륨)의 고급 활용법에 대해 다뤄보면 어떨까 싶네요!

    TrueNAS SCALE에서 앱을 배포하는 두 가지 주요 방법, 내장 Apps와 Dockge를 통한 Docker Compose 활용법을 비교한 요약입니다.

  • [Nas] Synology NAS Docker 활용: 앱 설치 및 관리 완벽 가이드

    [Nas] Synology NAS Docker 활용: 앱 설치 및 관리 완벽 가이드

    안녕하세요, 13년차의 서버실 주인장입니다. 오늘은 많은 분들이 홈랩(Homelab)에서 필수적으로 활용하고 계시는 Synology NAS의 Docker 활용법에 대해 이야기해보려고 해요.

    솔직히 처음엔 저도 NAS에 Docker를 왜 써야 하나 싶었습니다. 그냥 패키지 센터에서 앱 깔면 되지 않나? 하는 생각이었죠. 그런데 막상 제가 직접 몇 가지 서비스를 올려보고 관리해보니, Docker(도커)만큼 편하고 강력한 도구가 없더라고요. 특히 Synology NAS는 훌륭한 하드웨어와 DSM(DiskStation Manager)이라는 직관적인 운영체제를 제공해서, 여기에 Docker를 얹으면 그 시너지가 정말 대단합니다. 제가 홈랩에서 이것저것 실험하면서 겪었던 삽질 경험과 해결 과정을 솔직하게 공유해볼게요. 이 글을 통해 여러분도 Synology NAS의 잠재력을 100% 끌어내셨으면 좋겠어요! 🎉

    Synology NAS가 홈 네트워크의 여러 Docker 서비스를 구동하는 모습을 시각화한 다이어그램입니다.

    Docker, 컨테이너가 뭐길래 그렇게 좋다고 할까요?

    본격적인 실전 가이드에 앞서, Docker(도커)와 컨테이너(Container) 개념을 잠깐 짚고 넘어가야겠죠? 쉽게 말해, Docker는 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 시스템 도구, 라이브러리 등)을 컨테이너(Container)라는 독립적인 패키지로 묶어주는 기술입니다. 이 컨테이너는 어떤 환경에서든 동일하게 작동하도록 보장해주죠.

    기존에는 하나의 서버에 여러 앱을 설치하면, 서로 다른 앱 버전이나 라이브러리 충돌 때문에 골치 아픈 경우가 많았어요. 윈도우에서 프로그램 깔다가 “어? 이 버전은 안 맞는데?” 하는 경험 다들 있으실 겁니다. 😅 가상 머신(VM)도 좋은 대안이지만, OS를 통째로 가상화하다 보니 무겁고 자원 소모가 컸거든요.

    근데 Docker 컨테이너는 호스트 OS의 커널을 공유하면서도, 각각의 앱이 마치 독립적인 OS에서 실행되는 것처럼 격리된 환경을 제공합니다. 💡 그래서 가상 머신보다 훨씬 가볍고(Lightweight) 빠르며(Fast), 효율적(Efficient)이더라고요. Synology NAS 같은 한정된 자원의 장비에서 여러 서비스를 안정적으로 운영하고 싶다면, Docker는 거의 필수라고 할 수 있습니다.

    Synology NAS에 Docker 설치하기: 시작이 반이죠!

    Synology NAS에 Docker를 설치하는 건 정말 간단합니다. DSM(DiskStation Manager)의 패키지 센터(Package Center)를 이용하면 되거든요. 제가 처음 Synology NAS를 접했을 때, 이 패키지 센터의 편리함에 정말 놀랐던 기억이 나네요.

    1. DSM에 관리자 계정으로 로그인합니다.
    2. 패키지 센터를 엽니다.
    3. 검색창에 “Docker”를 입력하거나, “유틸리티” 카테고리에서 Docker 패키지를 찾습니다.
    4. 설치 버튼을 클릭합니다.
    5. 설치 과정이 완료되면, 메인 메뉴에 Docker(컨테이너 관리자) 아이콘이 생성된 것을 확인할 수 있습니다.

    참 쉽죠? 이렇게 설치를 마치면, 이제 웹 UI를 통해 Docker 컨테이너를 관리할 준비가 된 겁니다. Synology는 이 Docker 관리 UI를 컨테이너 관리자(Container Manager)라고 부르더라고요. 처음엔 좀 헷갈렸는데, 그냥 Docker GUI라고 생각하시면 편해요.

    Synology DSM의 컨테이너 관리자 화면입니다. 실행 중인 컨테이너들의 상태를 한눈에 볼 수 있습니다.

    실전! Docker 컨테이너 배포 및 관리 노하우

    이제 본격적으로 Docker 컨테이너를 배포하고 관리하는 방법을 알아볼까요? 저는 주로 두 가지 방법으로 컨테이너를 관리하는데요, 하나는 Synology의 컨테이너 관리자(Container Manager) UI를 이용하는 것이고, 다른 하나는 Docker Compose(도커 컴포즈)를 활용하는 방법입니다. 제가 직접 써보니, 간단한 앱은 UI로, 여러 앱을 묶어서 관리할 때는 Compose가 훨씬 편하더라고요.

    1. 컨테이너 관리자 UI로 Synology Docker 앱 설치하기 (Nginx 예시)

    Synology의 컨테이너 관리자는 마치 앱스토어처럼 이미지를 검색하고 컨테이너를 생성할 수 있게 해줍니다. Nginx(엔진엑스) 웹 서버를 예시로 들어볼게요.

    1. 컨테이너 관리자를 실행합니다.
    2. 왼쪽 메뉴에서 레지스트리(Registry)를 클릭합니다.
    3. 검색창에 “nginx”를 입력하고 검색합니다. 공식 Nginx 이미지를 선택하고 다운로드(Download) 버튼을 클릭합니다. 태그(Tag)는 latest를 선택하면 돼요.
    4. 이미지 다운로드가 완료되면, 왼쪽 메뉴의 이미지(Image) 탭으로 이동합니다. 방금 다운로드한 nginx:latest 이미지를 선택하고 실행(Run) 버튼을 클릭합니다.
    5. 컨테이너 생성 마법사가 나타납니다.
      • 일반 설정(General Settings): 컨테이너 이름(예: my-nginx)을 입력하고, 자동으로 다시 시작(Enable auto-restart)을 체크해두는 게 좋습니다.
      • 포트 설정(Port Settings): Nginx는 기본적으로 80번 포트를 사용합니다. 호스트 포트(Local Port)를 비워두면 자동으로 할당되지만, 특정 포트(예: 8080)로 지정해서 사용하고 싶으면 입력하면 돼요. 저는 보통 8080으로 매핑해서 사용합니다.
      • 볼륨 설정(Volume Settings): Nginx 설정 파일이나 웹 페이지 파일을 외부 폴더와 연결(마운트)할 수 있습니다. 예를 들어, Synology NAS의 /docker/nginx/html 폴더를 컨테이너 내부의 /usr/share/nginx/html 경로에 마운트하면, NAS 폴더에 웹 페이지를 넣으면 바로 Nginx를 통해 서비스할 수 있어요. 💡 주의! NAS 폴더에 권한이 없으면 Nginx가 시작되지 않거나 파일을 읽지 못할 수 있으니, 읽기/쓰기(Read/Write) 권한을 꼭 확인해주세요.
    6. 설정 완료 후 적용(Apply) 버튼을 누르면 컨테이너가 생성되고 바로 실행돼요.

    이제 웹 브라우저에서 http://[NAS_IP_주소]:8080으로 접속해보세요. Nginx 기본 페이지가 보인다면 성공입니다! ✅

    2. Docker Compose로 여러 서비스 한 번에 관리하기 (Watchtower 예시)

    하나의 컨테이너는 UI로 관리하기 편하지만, 여러 컨테이너가 서로 연동되거나 복잡한 설정을 해야 할 때는 Docker Compose(도커 컴포즈)가 빛을 발합니다. YAML(야믈) 파일 하나로 여러 컨테이너의 설정과 관계를 정의할 수 있거든요. 저는 주로 Watchtower(왓치타워) 같은 유틸리티 컨테이너를 Docker Compose로 배포해서 사용합니다. Watchtower는 실행 중인 Docker 컨테이너의 새 이미지가 있는지 주기적으로 확인하고 자동으로 업데이트해주는 고마운 녀석이더라고요. 매번 수동으로 업데이트하는 삽질을 줄여줍니다!

    Synology NAS에서 Docker Compose를 사용하려면 SSH로 NAS에 접속해야 합니다. SSH 접속 방법은 제 이전 글에서 다루었으니 참고해주세요! (나중에 링크 추가 예정) ➡️

    1. SSH로 NAS에 로그인합니다.
    2. 컨테이너 설정을 저장할 폴더를 만듭니다. (예: /volume1/docker/watchtower)
    3. 해당 폴더로 이동하여 docker-compose.yml 파일을 생성하고 아래 내용을 입력합니다.
    version: '3.8'
    services:
      watchtower:
        image: containrrr/watchtower
        container_name: watchtower
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          - TZ=Asia/Seoul # 시간대 설정 (선택 사항)
          - WATCHTOWER_CLEANUP=true # 이전 이미지 삭제
          - WATCHTOWER_SCHEDULE=0 4 * * * # 매일 새벽 4시에 실행 (Cron 표현식)
        restart: unless-stopped
    

    위 YAML 파일은 containrrr/watchtower 이미지를 사용하고, Docker 데몬과 통신하기 위해 /var/run/docker.sock을 마운트합니다. 또한, 매일 새벽 4시에 컨테이너를 업데이트하고 이전 이미지를 정리하도록 설정했어요. 환경 변수(Environment Variables)를 통해 다양한 옵션을 줄 수 있으니, Watchtower 공식 문서를 참고하시면 더 많은 기능을 활용할 수 있습니다.

    1. docker-compose.yml 파일이 있는 디렉토리에서 다음 명령어를 실행하여 컨테이너를 배포합니다.
    sudo docker compose up -d
    

    -d 옵션은 컨테이너를 백그라운드에서 실행하라는 뜻입니다. 명령어를 실행하면 Watchtower 컨테이너가 생성되고 바로 작업을 시작할 거예요. 나중에 컨테이너를 중지하고 싶다면 sudo docker compose down 명령어를 사용하면 됩니다.

    ⚠️ 삽질 경험 & 트러블슈팅: 이것만 알면 고생 끝!

    제가 Docker를 처음 다룰 때 가장 많이 겪었던 문제들은 바로 권한과 포트 충돌이었습니다. 독자분들은 저처럼 삽질하지 마시라고 몇 가지 팁을 드릴게요.

    • 볼륨 마운트(Volume Mount) 권한 문제: 컨테이너가 호스트(NAS)의 특정 폴더에 접근해야 할 때, 해당 폴더에 컨테이너가 접근할 수 있는 권한이 없으면 에러가 발생합니다. 예를 들어, Nginx가 웹 페이지를 읽지 못하거나, Plex가 미디어 파일을 스캔하지 못하는 경우가 대표적이죠.

      해결책: Synology DSM의 제어판 > 공유 폴더에서 해당 폴더의 권한 설정을 확인하고, everyone 그룹 또는 Docker 컨테이너가 사용하는 사용자(대부분 root 또는 특정 UID/GID)에게 읽기/쓰기 권한을 부여해야 합니다. 저는 보통 777 권한을 주기도 하는데, 보안상 좋지 않으니 필요한 최소한의 권한만 부여하는 게 좋아요.
    • 포트 충돌(Port Conflict): 이미 NAS에서 사용 중인 포트(예: DSM 웹 UI의 5000/5001번)를 Docker 컨테이너가 사용하려고 하면 충돌이 발생합니다.

      해결책: 컨테이너 생성 시 호스트 포트(Local Port)를 비어있는 다른 포트(예: 80 -> 8080, 443 -> 8443)로 변경하여 매핑해주면 됩니다. netstat -tulnp 명령어로 현재 사용 중인 포트를 확인할 수 있더라고요.
    • 이미지 다운로드 실패: 인터넷 연결 문제나 Docker Hub(도커 허브) 서버 문제로 이미지를 다운로드하지 못하는 경우가 있습니다.

      해결책: 인터넷 연결 상태를 확인하고, 잠시 기다렸다가 다시 시도하거나, 다른 미러 서버를 사용하는 방법을 찾아볼 수도 있습니다.

    이런 문제들을 겪으면서 “아, 진짜 왜 안 되는 거야!” 하고 답답했던 순간들이 많았는데, 결국은 대부분 설정 문제더라고요. 꼼꼼하게 확인하는 습관이 중요합니다. 💡

    ✅ 결과 확인 및 컨테이너 관리

    컨테이너가 제대로 실행되고 있는지 확인하는 것은 매우 중요합니다. Synology의 컨테이너 관리자 UI나 SSH 터미널에서 쉽게 확인할 수 있어요.

    1. 컨테이너 관리자 UI에서 확인: 왼쪽 메뉴의 컨테이너(Container) 탭을 클릭하면 현재 실행 중인 모든 컨테이너 목록과 상태를 한눈에 볼 수 있습니다. 각 컨테이너를 클릭하면 CPU, 메모리 사용량 등 자세한 정보를 확인할 수 있어요.
    2. SSH 터미널에서 확인: sudo docker ps 명령어를 사용하면 현재 실행 중인 컨테이너 목록을 확인할 수 있습니다. 모든 컨테이너(종료된 컨테이너 포함)를 보려면 sudo docker ps -a를 사용합니다. 특정 컨테이너의 로그를 확인하고 싶다면 sudo docker logs [컨테이너_이름_또는_ID] 명령어를 사용하면 되더라고요.

    이런 식으로 주기적으로 컨테이너 상태를 점검하고, 문제가 발생하면 로그를 확인하여 빠르게 대처하는 것이 중요합니다. 멘토인 제가 늘 강조하는 부분이죠! 😉

    Portainer 웹 UI 대시보드에서 Docker 컨테이너 및 스택 개요를 보여주는 스크린샷입니다.

    마무리하며: Synology NAS와 Docker, 무한한 가능성!

    오늘은 Synology NAS에 Docker를 설치하고 컨테이너를 배포, 관리하는 방법에 대해 자세히 알아봤습니다. 제가 직접 홈랩에서 13년 동안 다양한 장비를 만져보면서 느낀 건, Synology NAS와 Docker의 조합은 정말 강력하다는 겁니다. 여러분의 NAS를 단순한 파일 서버를 넘어, Plex 미디어 서버, Home Assistant 스마트 홈 허브, Nextcloud 개인 클라우드 등 무궁무진한 서비스의 허브로 탈바꿈시킬 수 있어요.

    물론 처음에는 생소하고 어려운 부분도 있을 겁니다. 저도 그랬거든요! 하지만 한 번 익숙해지면 이 편리함에서 헤어나오기 어렵습니다. 삽질은 성장의 어머니라고 하잖아요? 😅 여러분의 삽질을 줄여드리고자 이 글을 썼으니, 부디 도움이 되셨기를 바랍니다.

    다음 글에서는 Synology NAS에서 Reverse Proxy(리버스 프록시)와 Let’s Encrypt(렛츠 인크립트)를 활용하여 Docker 컨테이너에 외부에서 안전하게 접근하는 방법에 대해 다뤄볼 예정입니다. 기대해주세요! 그럼 다음 글에서 또 만나요! 👋

  • [Nas] Docker Compose로 NAS에 앱 배포 및 관리하기: Synology, TrueNAS SCALE 가이드

    [Nas] Docker Compose로 NAS에 앱 배포 및 관리하기: Synology, TrueNAS SCALE 가이드

    13년차 서버실: Docker Compose로 NAS 앱 배포 및 관리 – Synology, TrueNAS SCALE 실전 가이드

    안녕하세요! 13년차 인프라 엔지니어입니다. 오늘은 많은 분들이 궁금해하실 주제를 다뤄볼게요. 바로 Docker Compose를 활용해서 NAS(Network Attached Storage)에 다양한 애플리케이션을 배포하고 관리하는 방법인데요. Synology와 TrueNAS SCALE 환경에서 직접 경험했던 내용을 바탕으로 실전 팁을 공유해드리겠습니다. 혹시 NAS를 파일 저장소로만 쓰고 계신가요? Docker Compose와 함께라면 여러분의 NAS가 훨씬 더 똑똑한 홈랩 서버로 변신합니다! 😉

    NAS 환경에서 Docker Compose를 활용한 애플리케이션 배포 및 관리 아키텍처 개요

    왜 NAS에 Docker Compose를 써야 할까요?

    NAS를 운영하다 보면 언젠가는 ‘파일 저장소 말고 다른 기능도 쓰고 싶은데…’ 하는 생각이 들게 돼요. 개인 블로그를 운영하고 싶거나, 영화·음악 스트리밍 서버를 구축하고 싶을 때 말이죠. 예전 같으면 복잡한 설치 과정과 설정 때문에 망설였겠지만, Docker와 Docker Compose를 알게 된 후로는 정말 달라졌어요.

    Docker는 애플리케이션을 컨테이너라는 격리된 환경에 담아 실행하는 기술입니다. 덕분에 운영체제나 다른 프로그램과의 충돌 걱정 없이 원하는 앱을 쉽게 설치하고 실행할 수 있죠. 다만 여러 개의 컨테이너를 묶어서 관리하려면 일일이 명령어를 입력해야 해서 번거로울 때가 많아요. 이때 등장하는 것이 바로 Docker Compose입니다!

    쉽게 말해, Docker Compose는 YAML이라는 설정 파일을 사용해서 여러 컨테이너로 구성된 애플리케이션을 한 번에 정의하고 실행할 수 있게 해주는 도구예요. 마치 오케스트라의 지휘자처럼 여러 악기(컨테이너)들이 조화롭게 연주(실행)되도록 지휘하는 역할을 하는 거죠.

    Docker Compose를 NAS에서 사용하면 좋은 점은 다음과 같아요:

    • ✅ 간편한 배포: 복잡한 설정 과정을 YAML 파일 하나로 정의하고, 단 한 번의 명령어로 여러 컨테이너를 한 번에 띄울 수 있어요.
    • ✅ 쉬운 관리: 컨테이너의 시작, 중지, 재시작, 삭제 등을 Compose 명령어로 간단하게 관리할 수 있습니다.
    • ✅ 재현성: 동일한 YAML 설정 파일만 있으면 언제 어디서든 똑같은 환경을 구축할 수 있어요. 개발, 테스트, 운영 환경 간의 차이로 인한 문제를 줄여주거든요.
    • ✅ 포트 충돌 방지: 각 컨테이너가 사용할 포트(Port)를 명확하게 지정하여 충돌을 피할 수 있습니다.
    • ✅ 확장성: 필요에 따라 컨테이너 수를 늘리거나 줄이기가 정말 쉬워요.

    Synology와 TrueNAS SCALE, Docker Compose 활용법

    Synology DSM과 TrueNAS SCALE은 각기 다른 방식으로 Docker 환경을 제공하지만, Docker Compose를 활용하는 기본 원리는 동일합니다. 핵심은 docker-compose.yml 파일을 작성하고 실행하는 거죠.

    1. Synology NAS에서 Docker Compose 사용하기

    Synology NAS에서는 ‘Docker’ 패키지를 설치하면 Docker Compose 기능을 사용할 수 있어요. DSM의 ‘패키지 센터’에서 Docker를 검색하여 설치해주세요. 저는 보통 SSH로 NAS에 접속해서 작업하는 것을 선호하지만, DSM의 ‘텍스트 편집기’나 ‘File Station’을 이용해 YAML 파일을 작성하고 관리할 수도 있습니다.

    실행 단계:

    1. SSH 접속: Putty(Windows) 또는 터미널(macOS/Linux)을 이용해 NAS에 SSH로 접속합니다.
    2. 작업 디렉토리 생성: 원하는 위치에 애플리케이션을 위한 디렉토리를 만들어요. 예: mkdir /volume1/docker/my-app && cd /volume1/docker/my-app
    3. docker-compose.yml 파일 작성: 텍스트 편집기(vi, nano 등)를 이용해 docker-compose.yml 파일을 생성하고 내용을 작성합니다.
    4. Docker Compose 실행: docker-compose up -d 명령어를 실행하면 설정된 컨테이너들이 백그라운드(-d)에서 실행돼요.

    예시: Nginx 웹 서버와 Portainer (컨테이너 관리 도구) 배포

    Portainer는 Docker 환경을 웹 UI로 쉽게 관리할 수 있게 해주는 정말 유용한 도구예요. NAS에 Portainer를 설치해두면 컨테이너 관리가 훨씬 편해진답니다.

    
    version: '3.8'
    
    services:
      portainer:
        image: portainer/portainer-ce:latest
        container_name: portainer
        restart: unless-stopped
        security_opt:
          - no-new-privileges:true
        ports:
          - "8000:8000"
          - "9443:9443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - portainer_data:/data
        networks:
          - portainer_net
    
      nginx:
        image: nginx:latest
        container_name: my-nginx
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf:ro
          - ./html:/usr/share/nginx/html:ro
        depends_on:
          - portainer
        networks:
          - portainer_net
    
    volumes:
      portainer_data:
    
    networks:
      portainer_net:
        driver: bridge
    

    이 파일을 /volume1/docker/portainer-nginx/docker-compose.yml에 저장하고, 해당 디렉토리에서 docker-compose up -d를 실행하면 Portainer와 Nginx 웹 서버가 동시에 실행돼요. Portainer는 http://NAS_IP:9443 (SSL), Nginx는 http://NAS_IP로 접속할 수 있습니다.

    Synology DSM에서 Docker 패키지를 설치하는 과정

    2. TrueNAS SCALE에서 Docker Compose 사용하기 (TrueNAS SCALE Apps)

    TrueNAS SCALE은 Kubernetes 기반으로 앱을 관리하는 ‘Apps’ 기능을 제공해요. Docker Compose 파일을 직접 사용하는 방식과는 조금 다르지만, Apps 기능을 통해 원하는 애플리케이션을 쉽게 설치하고 관리할 수 있다는 점은 같습니다. TrueNAS SCALE의 Apps는 Helm chart라는 것을 사용하는데, 많은 경우 Docker Compose 파일과 유사한 구조를 가져요.

    실행 단계:

    1. Apps 메뉴 접근: TrueNAS SCALE 웹 UI에서 ‘Apps’ 메뉴로 이동합니다.
    2. Catalogs 설정: 원하는 애플리케이션을 설치하기 위해 Catalog(앱 스토어 같은 개념)를 추가해야 해요. 커뮤니티에서 제공하는 다양한 Catalog들이 있습니다.
    3. 애플리케이션 설치: Catalog에서 원하는 앱을 선택하고 설치를 진행하면 돼요. 커스텀 앱을 직접 등록하여 Docker Compose 파일처럼 관리할 수도 있습니다.

    주의사항: TrueNAS SCALE의 Apps는 Kubernetes 기반이므로, Docker Compose의 docker-compose.yml 파일을 직접 실행하는 방식과는 다릅니다. 하지만 많은 커뮤니티 앱들이 Docker Compose 구조를 따르고 있어서, YAML 파일의 내용을 이해하고 있다면 앱 설정 시 도움이 돼요. 직접 Docker Compose 파일을 적용하려면 TrueNAS CORE의 ‘iocage’ 플러그인이나 TrueNAS SCALE에서 별도의 VM을 구성해야 할 수도 있습니다. 다만 대부분의 일반 사용자는 Apps 기능으로 충분히 원하는 앱을 설치하고 관리할 수 있어요.

    TrueNAS SCALE의 Apps 메뉴에서 다양한 애플리케이션을 탐색하고 설치하는 과정

    실전 팁 & 트러블슈팅 ⚠️

    13년간 Docker를 다루면서 겪었던 문제와 팁을 공유해 드릴게요. 처음엔 이것 때문에 밤새 고생했던 기억이 있어요. ㅎㅎ

    • 포트 충돌 (Port Conflict): 가장 흔한 문제예요. docker-compose.yml 파일에서 ports 섹션에 이미 사용 중인 호스트 포트를 지정하면 컨테이너가 실행되지 않습니다. Synology NAS의 경우, DSM 자체적으로 사용하는 포트와 충돌하지 않도록 주의해야 해요. 예를 들어 80번 포트는 DSM의 웹 스테이션 등이 사용할 수 있으니, 다른 포트(예: 8080)로 변경하는 것이 훨씬 안전합니다.
    • 볼륨 마운트 경로: 컨테이너 내의 데이터가 호스트 NAS의 특정 경로에 저장되도록 volumes 설정을 잘 해야 합니다. Synology에서는 /volume1/docker/app-name 같은 경로를 주로 사용하고, TrueNAS SCALE에서는 /mnt/poolname/dataset/app-name 같은 경로를 써요. 경로가 잘못되면 데이터가 사라지거나 컨테이너가 제대로 동작하지 않을 수 있으니 주의하세요. 경로 지정 시에는 항상 절대 경로(Absolute Path)를 사용하는 게 정답이에요.
    • 권한 문제 (Permission Issues): 컨테이너가 호스트 파일 시스템에 접근할 때 권한 문제가 발생할 수 있습니다. Docker Compose 파일의 user 옵션을 설정하거나, 호스트 볼륨의 권한을 컨테이너 사용자의 권한에 맞게 조정해야 할 수 있어요.
    • Docker Compose 버전 호환성: version 필드에 명시된 Compose 파일 형식 버전과 실제 사용 중인 Docker Compose 엔진 버전 간의 호환성을 확인하세요. 최신 버전에서는 지원되지 않는 기능이 이전 버전에 있을 수 있습니다.
    • 네트워크 설정: 여러 컨테이너가 서로 통신해야 하는 경우, networks 설정을 올바르게 해야 합니다. 기본적으로는 bridge 네트워크가 사용되지만, 복잡한 구성에서는 custom network을 사용해야 할 때도 있어요.

    💡 팁: 문제가 발생했을 때, docker-compose logs 명령어로 해당 서비스의 로그를 확인하세요. 정말 많은 힌트를 얻을 수 있거든요! 저도 이 명령어로 대부분의 문제를 해결했어요.

    결과 확인 및 관리

    Docker Compose 명령어를 통해 컨테이너를 실행한 후에는 상태를 확인하는 것이 중요합니다.

    • docker-compose ps: 현재 실행 중인 컨테이너 목록과 상태를 보여줘요.
    • docker-compose logs -f : 특정 컨테이너의 실시간 로그를 확인할 수 있습니다. (Ctrl+C로 종료)
    • docker-compose down: 실행 중인 컨테이너들을 중지하고 관련된 네트워크, 볼륨 등을 삭제해요. (데이터 보존 여부는 볼륨 설정에 따라 다름)
    • docker-compose pull: Docker 이미지의 최신 버전을 다운로드합니다.
    • docker-compose up -d --build: 설정 파일을 새로 빌드하고 컨테이너를 실행해요.

    Portainer 대시보드를 통해 Synology 또는 TrueNAS SCALE에서 실행 중인 Docker 컨테이너들을 한눈에 관리하는 모습

    마무리하며

    지금까지 Docker Compose를 활용하여 Synology와 TrueNAS SCALE NAS 환경에서 애플리케이션을 배포하고 관리하는 방법에 대해 알아봤습니다. 처음에는 조금 복잡해 보일 수 있지만, 한 번 익혀두면 NAS의 활용도를 정말 무궁무진하게 높일 수 있는 강력한 도구예요.

    저도 처음엔 간단한 웹 서버 하나 띄우는 것도 버거웠는데, 지금은 여러 컨테이너를 엮어 복잡한 서비스를 구축할 수 있게 됐네요. 여러분도 오늘 알려드린 내용을 바탕으로 차근차근 시도해보신다면, 분명 여러분만의 멋진 홈랩 환경을 구축하실 수 있을 겁니다.

    다음 글에서는 Docker Compose를 활용한 Home Assistant 설치 및 연동에 대한 실전 가이드를 다룰 예정이니 많은 기대 부탁드립니다! 혹시 오늘 내용 중에 궁금한 점이 있다면 언제든지 댓글로 남겨주세요. 함께 해결해나가겠습니다. 😉