저는 오래된 노트북으로 홈 서버를 운영하고 있는데, 다양한 셀프 호스팅 앱을 돌리기에 아주 완벽합니다. 2026년을 보내며 서버가 어떻게 작동하는지 알아가고, 그 결과 제 삶이 더 편리하고 원활하며 사생활 보호가 잘 되도록 만드는 과정에서 큰 즐거움을 느끼고 있습니다.
하지만 제가 자주 받는 질문 중 하나는 "Docker가 무엇인가?" 그리고 "이미 서버가 준비되어 있는데 왜 굳이 Docker를 사용하는가?"입니다.
분명 그럴 만한 이유가 있으며, 이를 이해하고 나면 소프트웨어를 운영하는 방식에 대한 생각이 완전히 바뀌는 셀프 호스팅의 묘미를 깨닫게 될 것입니다.
OS Linux, Windows, macOS
개인 가격 무료 (개인용)
주요 특징 OS 수준 가상화, 불변 인프라, 빠른 배포, 컨테이너 격리
플랫폼 Docker Desktop, Docker Engine, Docker Swarm
개발자 Docker, Inc.
Docker는 소프트웨어를 ‘컨테이너’라고 불리는 가볍고 격리된 단위로 패키징하는 플랫폼입니다. 애플리케이션 코드, 라이브러리, 종속성을 하나로 묶어 어떤 기기에서든 소프트웨어가 동일하게 실행되도록 보장합니다. 호스트 운영 체제를 공유함으로써 Docker는 기존 가상 머신(VM) 대비 호환성 문제를 제거하고 배포 시간을 단축하며 서버 효율성을 극대화합니다.
Docker의 실체
가상 머신이 아니라는 점이 중요합니다
Docker를 이해하는 가장 쉬운 방법은 가상 머신(VM)과 비교하는 것입니다. VM은 컴퓨터 안에서 실행되는 완전한 컴퓨터로, 자체 운영 체제, 커널, 할당된 하드웨어를 가지며 존재 자체만으로도 상당한 양의 RAM과 CPU를 소모합니다.
Docker 컨테이너도 비슷하지만, 차별화되는 몇 가지 고유한 특성이 있습니다.
컨테이너는 자체 커널을 실행하는 대신 호스트 운영 체제의 커널을 공유합니다. 즉, 리소스 측면에서 훨씬 가볍기 때문에 구형 하드웨어에서도 사용하기 쉽고, 최신 기기에서는 매우 빠르게 실행할 수 있습니다.
| Docker 컨테이너 | 가상 머신 | |
|---|---|---|
| 시작 시간 | 초 단위 | 분 단위 |
| 메모리 사용량 | 수십 MB | 수백 MB ~ GB 단위 |
| OS | 호스트 커널 공유 | VM당 전체 OS |
| 격리 | 프로세스 수준 | 하드웨어 수준 |
| 이식성 | 단일 compose 파일 | 대용량 VM 이미지 |
| 최적 용도 | 서비스 실행 | 서로 다른 OS 실행 |
Docker 컨테이너를 설명할 때 가장 흔히 쓰이는 비유는 ‘선박용 컨테이너’인데, 이 비유는 정말 딱 들어맞습니다. 표준화된 컨테이너가 존재하기 전에는 화물을 일일이 수작업으로 싣고 내려야 했고, 배나 트럭이 바뀔 때마다 다시 포장해야 했습니다.
선박용 컨테이너는 내용물과 상관없이 어디서든 사용할 수 있는 표준 상자를 만들어 이 문제를 해결했습니다. Docker는 기본적으로 소프트웨어 패키지에 대해 동일한 역할을 수행하여, 수많은 기기에서 간단하게 실행할 수 있도록 프로세스를 표준화합니다.
관련 글
이미지, 컨테이너, 볼륨
셀프 호스팅 Docker 앱을 실행하려면 이 모든 것이 필요합니다
Docker에는 처음에는 혼동하기 쉬운 두 가지 개념인 이미지와 컨테이너가 있습니다.
이미지는 설계도입니다. 소프트웨어, 종속성, 실행 방법 등을 정의하는 읽기 전용 템플릿과 같습니다.
컨테이너는 이미지의 실행 인스턴스입니다. 동일한 이미지로 여러 컨테이너를 실행할 수 있고, 데이터를 잃지 않고 중지하거나 시작할 수 있으며, 이미지 자체를 건드리지 않고 컨테이너를 완전히 삭제할 수도 있습니다. 무언가 고장 났을 때(분명히 고장 날 겁니다), 서버가 아닌 컨테이너를 삭제하면 됩니다. 이미지는 그대로 남아 있어 언제든 새로운 인스턴스를 실행할 준비가 되어 있습니다.
그다음에는 Docker 컨테이너의 영구 저장소인 볼륨이 있습니다. Docker가 유용한 이유는 각 인스턴스가 이미지와 작업에 필요한 데이터를 저장하기 위해 영구 저장소를 사용할 수 있기 때문입니다.
하지만 기본적으로 컨테이너 내부에서 작성된 모든 내용은 컨테이너가 제거되면 사라집니다. 볼륨은 컨테이너 내부의 위치를 호스트 머신의 위치에 매핑하여 컨테이너에 무슨 일이 생기든 데이터가 유지되도록 함으로써 이 문제를 해결합니다.
예를 들어, Mealie 셀프 호스팅 Docker 인스턴스를 설정할 때 구성의 일부로 볼륨을 생성합니다. 구성 파일에 다음과 같은 줄을 입력합니다.
volumes:
mealie-data:/app/data그러면 Mealie가 컨테이너 내부의 /app/data에 기록하는 모든 내용이 실제로는 호스트의 Docker 관리 볼륨에 저장됩니다. 즉, 컨테이너를 삭제하고 다시 생성하더라도 레시피는 그대로 남아 있습니다.
왜 Docker가 셀프 호스팅 서버에 좋은가
격리, 이식성, 그리고 모든 것을 망가뜨리지 않는 업데이트
Docker가 유용한 이유에 대한 배경지식은 여기까지입니다. 이와 더불어, 거의 모든 최고의 셀프 호스팅 앱과 도구가 Docker에서 실행되므로 모든 작업에 있어 필수적인 도구가 되었습니다. 셀프 호스팅 Docker 컨테이너를 실행하기 시작하면 비싼 구독 서비스를 하나씩 해지할 수도 있습니다.
하지만 그 이상의 장점이 있습니다. Docker 이전에는 앱을 셀프 호스팅하는 과정이 훨씬 복잡했습니다. 앱에 따라 Python, Node, PostgreSQL, Redis 등 다양한 종속성을 수동으로 설치해야 했고, 설치한 다른 프로그램과 충돌하지 않기를 바라야 했습니다.
업데이트를 할 때도 버튼을 누르는 것이 두려웠습니다. 잘못된 업데이트 한 번으로 여러 서비스가 동시에 중단될 수 있었고, 무엇이 충돌했고 무엇이 고장 났는지 알아내기 위해 몇 시간씩 디버깅을 해야 했습니다.
Docker가 훌륭한 이유 중 하나는 이러한 번거로움을 근본적으로 피할 수 있다는 점입니다. 제 서버에는 현재 레시피와 식단 관리를 위한 Mealie, 셀프 호스팅 이미지 백업을 위한 Immich, DNS를 위한 AdGuard가 호스팅되어 있습니다.
각 Docker 컨테이너는 자체 종속성을 가지고 있기 때문에 서로 간섭할 걱정이 없습니다. Mealie 컨테이너에 문제가 생겨도 Immich는 계속 실행됩니다. 새로운 셀프 호스팅 프로젝트를 시도하고 싶다면 컨테이너를 실행해보고, 마음에 들지 않으면 삭제하면 그만입니다. 머신은 이전과 똑같은 상태로 유지됩니다.
관련 글
Google Drive를 셀프 호스팅 클라우드로 대체했는데, 그 자유로움은 가치가 있습니다
셀프 호스팅 클라우드는 매우 해방감을 주며, 생각보다 설정이 어렵지 않습니다.
Docker는 셀프 호스팅을 놀라울 정도로 단순하게 만듭니다
이러한 격리 기능 덕분에 Proxmox에서 LXC 컨테이너 내부의 Docker를 실행하는 것이 합리적입니다. 추가적인 분리 계층을 확보하고, Proxmox 웹 인터페이스를 통해 깔끔하게 관리하며, 변경 사항을 적용하기 전에 전체 컨테이너 상태를 스냅샷으로 찍거나 백업할 수 있기 때문입니다.
이것이 바로 더 많은 사람들이 셀프 호스팅에 참여하는 이유이기도 합니다. 설치를 마치고 기본적인 내용을 익히면 방대한 카탈로그를 통해 셀프 호스팅 앱 배열을 빠르게 구축할 수 있으며, 새로운 것을 시도하는 데 따르는 장벽이 거의 제로에 가까워집니다.