컨테이너와 도커(Docker) 이해하기 - VM과의 차이부터 실전 개념까지
컨테이너는 애플리케이션과 실행 환경을 하나의 패키지로 묶어 어디서든 동일하게 실행하는 기술이고, Docker는 컨테이너를 가장 쉽게 만들고 관리할 수 있는 도구다.
이 글은 배포 기술에 관심이 생긴 개발자와 DevOps 개념을 처음 접하는 취업 준비생을 대상으로 작성되었다. "내 컴퓨터에서는 잘 되는데 서버에서 안 된다"는 문제를 근본적으로 해결하는 것이 Docker와 컨테이너 기술이다.
컨테이너(Container)란 무엇인가?
컨테이너는 애플리케이션 코드와 그 코드가 실행되는 데 필요한 모든 것(라이브러리, 설정 파일, 런타임)을 하나의 격리된 패키지로 묶은 것이다.
비유하자면 컨테이너는 규격화된 화물 컨테이너와 같다. 화물선이든 트럭이든 어디에 싣더라도 같은 방식으로 처리할 수 있듯이, 컨테이너로 패키징된 애플리케이션은 개발자 노트북, 테스트 서버, 운영 서버 어디서든 동일하게 실행된다.
컨테이너 vs 가상머신(VM) 비교
컨테이너와 가상머신(VM, Virtual Machine)은 모두 애플리케이션을 격리해서 실행하는 기술이지만, 작동 방식이 근본적으로 다르다.
가상머신(VM)
- 하이퍼바이저(VMware, VirtualBox 등)가 하드웨어를 에뮬레이션
- 각 VM은 완전한 운영체제(Guest OS)를 포함
- 기동 시간: 수십 초~수 분
- 용량: 수 GB
컨테이너
- 호스트 OS의 커널을 공유, 격리된 프로세스 공간에서 실행
- 운영체제를 포함하지 않아 매우 가벼움
- 기동 시간: 수 초 이내
- 용량: 수십 MB~수백 MB
| 구분 | 가상머신(VM) | 컨테이너 |
|---|---|---|
| 격리 수준 | 완전 격리 | 프로세스 수준 격리 |
| 시작 속도 | 느림 (수십 초~) | 빠름 (수 초 이내) |
| 리소스 사용 | 많음 | 적음 |
| 이미지 크기 | 수 GB | 수십~수백 MB |
| 이식성 | 비교적 낮음 | 높음 |
| OS 포함 | 포함 | 미포함 (커널 공유) |
Docker의 핵심 개념
도커 이미지(Docker Image)
이미지는 컨테이너를 만들기 위한 읽기 전용 템플릿이다. 애플리케이션 코드, 런타임, 라이브러리, 설정 파일이 모두 포함된다.
이미지는 레이어(Layer) 구조로 이루어진다. Dockerfile의 각 명령어는 이미지에 새로운 레이어를 추가한다. 변경되지 않은 레이어는 캐시를 재사용하므로 빌드 속도가 빠르다.
도커 컨테이너(Docker Container)
컨테이너는 이미지를 실행한 인스턴스다. 하나의 이미지에서 여러 개의 컨테이너를 동시에 실행할 수 있다. 컨테이너는 쓰기 가능한 레이어를 추가로 가지며, 컨테이너가 삭제되면 이 레이어도 사라진다.
Dockerfile
Dockerfile은 도커 이미지를 만드는 방법을 정의한 텍스트 파일이다.
# Node.js 애플리케이션 Dockerfile 예시
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "server.js"]
Docker Compose
여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 도구다.
# docker-compose.yml 예시
version: '3'
services:
web:
build: .
ports:
- "3000:3000"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: myapp
docker compose up 명령어 하나로 웹 서버와 데이터베이스를 함께 실행할 수 있다.
Docker를 사용하는 이유
-
환경 일관성 개발, 테스트, 프로덕션 환경의 차이를 없앤다. "내 컴퓨터에서는 되는데 서버에서 안 된다"는 문제가 사라진다.
-
빠른 배포 컨테이너는 초 단위로 시작하고 종료된다. 새 버전 배포 시 기존 컨테이너를 내리고 새 컨테이너를 올리는 것으로 배포가 완료된다.
-
효율적인 리소스 사용 VM과 달리 커널을 공유하므로 같은 하드웨어에서 더 많은 서비스를 실행할 수 있다.
-
쿠버네티스(Kubernetes)와 연동 대규모 컨테이너 오케스트레이션에 Kubernetes를 사용하면, 수백~수천 개의 컨테이너를 자동으로 관리할 수 있다.
Docker의 현재 위상 (2025년)
JetBrains 2025 개발자 설문에 따르면, 전문 개발자의 60% 이상이 Docker를 사용한다고 응답했다. Docker Hub에는 1억 개 이상의 이미지가 공개되어 있으며, 월간 100억 건 이상의 이미지 다운로드가 이루어진다.
자주 묻는 질문 (FAQ)
Q1. Docker를 배우려면 Linux를 알아야 하나요? A. 기본적인 Linux 명령어를 알면 도움이 된다. Docker는 Linux 기반이지만, Docker Desktop을 사용하면 Windows와 macOS에서도 쉽게 사용할 수 있다.
Q2. Docker와 Kubernetes의 차이는 무엇인가요? A. Docker는 컨테이너를 만들고 실행하는 도구이고, Kubernetes(K8s)는 여러 서버에서 컨테이너를 관리하는 오케스트레이션 플랫폼이다. 단일 서버에서는 Docker Compose로 충분하지만, 여러 서버에 걸친 대규모 운영에는 Kubernetes가 필요하다.
Q3. Docker 이미지와 컨테이너의 차이는 무엇인가요? A. 이미지는 컨테이너를 만들기 위한 템플릿(읽기 전용)이고, 컨테이너는 이미지를 실행한 인스턴스다. 하나의 이미지에서 여러 개의 컨테이너를 동시에 실행할 수 있다.
Q4. 컨테이너가 삭제되면 데이터도 사라지나요? A. 기본적으로 그렇다. 이를 해결하기 위해 볼륨(Volume)을 사용한다. 볼륨은 컨테이너와 독립적으로 호스트 파일시스템에 저장되며, 컨테이너가 삭제되어도 데이터가 유지된다.
Q5. Docker는 무료인가요? A. Docker는 개인, 소규모 팀, 교육용으로 무료다. 2022년부터 Docker Desktop은 대기업(직원 250명 이상 또는 연매출 1,000만 달러 이상)에서 사용할 경우 유료 구독이 필요하다.