Docker는 애플리케이션을 컨테이너라는 단위로 패키징하여 어떤 환경에서도 동일하게 실행할 수 있게 해주는 플랫폼입니다. "내 컴퓨터에서는 됐는데 서버에서 안 된다"는 환경 불일치 문제를 해결하는 것이 Docker의 핵심 가치입니다.
컨테이너와 VM은 모두 애플리케이션을 격리된 환경에서 실행하지만, 격리 방식이 근본적으로 다릅니다.
VM 구조 Container 구조
+----------+ +----------+ +------+ +------+ +------+
| App A | | App B | | App A| | App B| | App C|
+----------+ +----------+ +------+ +------+ +------+
| Guest | | Guest | |Container Runtime (Docker)|
| OS | | OS | +--------------------------+
+----------+ +----------+ | Host OS Kernel |
| Hypervisor | +--------------------------+
+-------------------------+ | Hardware |
| Hardware | +--------------------------+
+-------------------------+
각 VM: 수 GB, 부팅 수분 각 컨테이너: 수 MB, 수초 이내 시작
VM은 하이퍼바이저 위에 완전한 게스트 OS를 올려 강한 격리를 제공합니다. 반면 컨테이너는 호스트 OS 커널을 공유하면서 프로세스 수준에서 격리합니다. 이 덕분에 컨테이너는 VM보다 훨씬 가볍고 빠릅니다.
| 비교 항목 | VM | 컨테이너 |
|---|---|---|
| OS | 각자 Guest OS 포함 | Host OS 커널 공유 |
| 이미지 크기 | 수 GB | 수 MB ~ 수백 MB |
| 시작 시간 | 수 분 | 수 초 이내 |
| 격리 수준 | 강함 (OS 수준) | 보통 (프로세스 수준) |
| 이식성 | 제한적 | 높음 |
Docker Image는 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 라이브러리, 설정 파일)이 담긴 읽기 전용 템플릿으로, 레이어(Layer) 구조로 구성되어 중복을 최소화합니다.
이미지는 레이어 구조로 쌓입니다. 예를 들어 Ubuntu → Python 설치 → 애플리케이션 코드 순서로 레이어가 쌓이며, 하위 레이어가 같은 이미지들은 해당 레이어를 공유하여 저장 공간을 절약합니다.
Dockerfile은 Docker 이미지를 어떻게 빌드할지 정의하는 텍스트 파일입니다. 각 명령어가 이미지의 한 레이어가 됩니다.
# 베이스 이미지 지정
FROM node:18-alpine
# 작업 디렉토리 설정
WORKDIR /app
# 의존성 파일 복사 및 설치
COPY package*.json ./
RUN npm install
# 소스 코드 복사
COPY . .
# 포트 노출
EXPOSE 3000
# 컨테이너 시작 시 실행할 명령
CMD ["node", "server.js"]
주요 Dockerfile 명령어는 다음과 같습니다.
FROM: 베이스 이미지 지정 (모든 Dockerfile의 시작점)WORKDIR: 이후 명령이 실행될 작업 디렉토리COPY: 호스트 파일을 이미지 안으로 복사RUN: 이미지 빌드 시 실행할 명령 (레이어 생성)EXPOSE: 컨테이너가 사용할 포트 문서화CMD: 컨테이너 시작 시 기본으로 실행할 명령Dockerfile
|
| docker build
v
Docker Image (로컬 또는 레지스트리)
|
| docker run
v
Container (실행 중인 인스턴스)
이미지 하나에서 여러 컨테이너를 동시에 실행할 수 있습니다. 이미지는 불변이고, 컨테이너는 이미지 위에 읽기/쓰기 레이어를 추가한 실행 환경입니다.
AWS에서는 Docker를 다음과 같이 활용합니다.
개발자 로컬
|
| docker build & docker push
v
ECR (이미지 저장)
|
| 이미지 pull
v
ECS / Fargate (컨테이너 실행)
Docker를 사용하면 개발, 테스트, 운영 환경을 동일한 이미지로 통일할 수 있어 "환경 차이로 인한 버그"를 원천적으로 줄일 수 있습니다.