도커란?
- 1.1 가상 머신과 도커 컨테이너
- 1.2 도커를 시작해야 하는 이유
- 1.3 도커 엔진 설치
VM을 쓰던 시절, 서버 하나 격리하려면 게스트 OS를 통째로 올려야 했어. 도커는 이 문제를 완전히 뒤집었지.
기존 방식인 가상 머신은 하이퍼바이저(VirtualBox, VMware 같은 것) 위에 게스트 OS를 올리는 구조였거든. 문제는 무겁다는 거야 — 게스트 OS 하나가 수 GB를 먹고, 부팅에 수십 초가 걸리고, 호스트 OS와 별도의 커널을 돌려야 하니까 자원 오버헤드가 상당하지. 도커 컨테이너는 완전히 다른 접근이야. 호스트 OS의 커널을 공유하면서 프로세스만 격리하는 방식이거든. 게스트 OS가 없으니 이미지 크기가 수십 MB 수준으로 줄어들고, 실행도 수 초 안에 돼. 핵심 차이를 정리하면 VM은 하이퍼바이저 + 게스트 OS + 앱으로 완전한 격리지만 무겁고, 컨테이너는 호스트 OS 커널 공유 + 프로세스 격리로 가볍고 빠르지만 커널 수준의 격리는 VM보다 약해. 이 격리가 어떻게 구현되냐면, 리눅스 커널의 네임스페이스와 cgroups라는 기술이야. 네임스페이스는 프로세스, 네트워크, 파일시스템 등을 격리하고, cgroups는 CPU, 메모리 같은 자원 사용량을 제한하지. 즉, 컨테이너는 새로운 기술이 아니라 리눅스 커널에 이미 있던 기능들을 잘 조합한 거야. 도커는 이걸 사용하기 쉽게 포장한 도구라고 보면 돼.
그래서 도커가 왜 인프라 세계를 바꿨냐면, 일단 내 컴에서는 되는데 문제가 사라져. 컨테이너 안에 모든 의존성을 넣어서 배포하니까 개발 환경과 프로덕션 환경이 동일해지는 거지. 각 컨테이너는 독립된 환경이니까 한 컨테이너에서 문제가 생겨도 다른 컨테이너에 영향을 주지 않아. 마이크로서비스 아키텍처랑 궁합이 좋은 이유이기도 하고. 이미지는 레이어 구조로 되어 있어서 변경 사항만 추가되고, Docker Hub 같은 레지스트리에 올려두면 어디서든 동일한 이미지를 받아서 실행할 수 있어. git처럼 이미지를 태그로 버전 관리할 수 있지. 그리고 VM은 게스트 OS를 포함하니 GB 단위지만, 도커 이미지는 필요한 라이브러리와 앱만 포함하니 훨씬 가벼워. 같은 하드웨어에서 더 많은 서비스를 돌릴 수 있어.
도커는 리눅스, macOS, Windows에서 모두 설치할 수 있는데, 한 가지 알아둘 게 있어. 도커의 핵심이 리눅스 컨테이너 기술이기 때문에, macOS와 Windows에서는 내부적으로 리눅스 VM을 돌려서 그 위에서 도커가 동작해. 리눅스라면 아래 두 줄이면 끝이야:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
설치 후 sudo usermod -aG docker $USER로 현재 사용자를 docker 그룹에 추가하면 sudo 없이 도커 명령어를 쓸 수 있어. macOS나 Windows에서는 Docker Desktop을 설치하면 되고, macOS는 HyperKit(또는 Apple Virtualization), Windows는 WSL 2 또는 Hyper-V를 백엔드로 사용하지. 설치 확인은 간단해:
docker run hello-world
이 명령어가 "Hello from Docker!" 메시지를 출력하면 정상이야. 이 한 줄이 내부적으로 하는 일은 — Docker Hub에서 hello-world 이미지를 받아와서, 컨테이너를 생성하고, 실행한 뒤, 결과를 출력하는 거야. 도커의 전체 워크플로우가 이 한 줄에 담겨 있지.
정리
1장 읽고 기억할 거 세 가지:
- VM은 게스트 OS를 통째로 올리고, 컨테이너는 호스트 커널을 공유한다. 그래서 컨테이너가 훨씬 가볍고 빠르다.
- 도커는 환경 일관성과 이식성을 보장한다. "내 컴에서는 되는데" 문제를 해결하는 핵심 도구.
- 도커는 리눅스 커널 기능(네임스페이스, cgroups)을 포장한 것이다. macOS/Windows에서는 내부적으로 리눅스 VM 위에서 돌아간다.