"내 로컬에서는 잘 되는데 서버에서 안 돼요." 개발 현장에서 가장 자주 듣는 말이다. Docker는 이 문제를 환경 자체를 패키징해서 해결한다. 코드뿐 아니라 런타임, 라이브러리, 설정까지 하나의 단위로 묶어 어디서든 동일하게 실행되도록 보장한다.
Docker는 애플리케이션을 Container 단위로 격리해 실행하는 오픈소스 플랫폼이다. 2013년 Docker Inc.가 공개했으며, 현재 사실상의 컨테이너 표준으로 자리잡았다.
Container: 호스트 OS의 커널을 공유하면서 프로세스·파일시스템·네트워크를 격리한 실행 단위.
전통적인 Virtual Machine(VM)은 하이퍼바이저 위에 Guest OS 전체를 올린다. 반면 Container는 Host OS 커널을 공유하고 사용자 공간만 격리한다.
VM Container
┌─────────────────────┐ ┌─────────────────────┐
│ App A │ App B │ │ App A │ App B │
├──────────┼──────────┤ ├──────────┼──────────┤
│ Guest OS │ Guest OS │ │ Libs/Bin │ Libs/Bin │
├──────────┴──────────┤ ├──────────┴──────────┤
│ Hypervisor │ │ Docker Engine │
├─────────────────────┤ ├─────────────────────┤
│ Host OS │ │ Host OS │
├─────────────────────┤ ├─────────────────────┤
│ Hardware │ │ Hardware │
└─────────────────────┘ └─────────────────────┘
| 항목 | VM | Container |
|---|---|---|
| 기동 시간 | 수십 초~수 분 | 수 밀리초~수 초 |
| 이미지 크기 | 수 GB | 수십~수백 MB |
| OS 격리 | 완전 분리 | 커널 공유 |
| 성능 오버헤드 | 높음 | 낮음 |
| 보안 경계 | 강함 | 상대적으로 약함 |
Image는 컨테이너의 설계도다. 읽기 전용 레이어 스택으로 구성되며 Dockerfile로 정의한다.
Container는 Image를 실행한 인스턴스다. 같은 Image로 여러 Container를 띄울 수 있다.
Registry는 Image를 저장·배포하는 저장소다. 공개 레지스트리인 Docker Hub가 대표적이다.
Dockerfile: Image 빌드 과정을 선언적으로 기술하는 텍스트 파일.
Dockerfile
│ docker build
▼
Image ──── docker push ───▶ Registry
│ docker run │
▼ docker pull
Container ─────────┘
Dockerfile을 작성해 Image를 빌드한다.docker run 명령으로 Container 프로세스가 시작된다.Docker Desktop(macOS·Windows) 또는 Docker Engine(Linux)을 설치한다.
# Ubuntu 기준 설치
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 이미지 다운로드 후 컨테이너 실행
docker run -d -p 8080:80 --name my-nginx nginx
# 실행 중인 컨테이너 확인
docker ps
# 컨테이너 중지 및 삭제
docker stop my-nginx && docker rm my-nginx
장점
단점
Volume: 컨테이너 재시작 후에도 데이터를 유지하기 위해 Host 파일시스템에 마운트하는 저장 공간.