Docker

Docker란 무엇이고, VM과의 차이점?

yj992233 2026. 5. 14. 12:29

⭐Docker란?

Docker는 애플리케이션을 컨테이너라는 독립된 실행 환경에서 실행할 수 있게 해주는 플랫폼이다.

 

여기서 중요한 단어는 컨테이너다.

 

컨테이너는 애플리케이션과 실행에 필요한 환경을 함께 담은 독립적인 공간이다. 예를 들어 백엔드 서버를 실행하려면 Node.js가 필요하고, 특정 패키지가 필요하고, 환경 변수가 필요할 수 있다. Docker는 이런 것들을 컨테이너 안에 넣어 실행할 수 있게 해준다.

비유하면 Docker 컨테이너는 “포장된 실행 상자”와 비슷하다.

애플리케이션
Node.js
필요한 라이브러리
실행 설정
 

이 모든 것을 하나의 상자에 넣어두면, 어떤 서버에서든 그 상자를 열어 같은 방식으로 실행할 수 있다.


Docker라는 이름처럼, 컨테이너를 실제 물류 컨테이너에 비유하면 이해하기 쉽다.

 

과거에는 물건을 운송할 때 상품마다 포장 방식이 달랐다.

쌀은 포대에 담음
자동차 부품은 박스에 담음
가구는 따로 포장함
전자제품은 별도 포장함
 

이렇게 제각각이면 배, 트럭, 기차에 싣고 내리는 과정이 복잡하다.

하지만 표준 컨테이너가 등장하면서 상황이 달라졌다.

물건 종류와 상관없이 같은 크기의 컨테이너에 담는다.
트럭도 컨테이너를 옮긴다.
배도 컨테이너를 싣는다.
기차도 컨테이너를 운반한다.
 

Docker도 비슷하다.

 

애플리케이션이 어떤 언어로 만들어졌는지, 어떤 라이브러리가 필요한지와 상관없이 컨테이너로 포장하면 비슷한 방식으로 실행하고 배포할 수 있다.

Java 애플리케이션 → Docker 컨테이너
Node.js 애플리케이션 → Docker 컨테이너
Python 애플리케이션 → Docker 컨테이너
MySQL → Docker 컨테이너
 

즉, Docker는 애플리케이션을 표준화된 방식으로 포장하고 실행하게 해주는 도구다.


⭐Docker 이미지와 컨테이너

Docker를 이해할 때 반드시 알아야 하는 개념이 두 가지 있다.

1️⃣ Docker 이미지

Docker 이미지는 컨테이너를 만들기 위한 설계도 또는 실행 템플릿이다.

 

예를 들어 Node.js 애플리케이션을 실행하기 위한 이미지에는 다음 내용이 들어갈 수 있다.

기본 운영체제 환경
Node.js 런타임
애플리케이션 코드
필요한 패키지
실행 명령어
 

이미지는 직접 실행되는 것이 아니라, 컨테이너를 만들기 위한 기준이 된다.

 

비유하면 이미지는 붕어빵 틀과 비슷하다.

붕어빵 틀이 있으면 같은 모양의 붕어빵을 여러 개 만들 수 있다.
Docker 이미지가 있으면 같은 환경의 컨테이너를 여러 개 만들 수 있다.

2️⃣ Docker 컨테이너

컨테이너는 이미지를 바탕으로 실제 실행된 인스턴스다.

 

예를 들어 node-image라는 이미지가 있다고 해보자. 이 이미지로 컨테이너를 실행하면 실제 애플리케이션이 동작한다.

Docker 이미지 → 컨테이너 실행 → 애플리케이션 동작
 

비유하면 다음과 같다.

Docker 이미지 붕어빵 틀
Docker 컨테이너 실제 만들어진 붕어빵
Dockerfile 붕어빵 틀을 만드는 레시피

⭐Dockerfile이란?

Dockerfile은 Docker 이미지를 만들기 위한 설정 파일이다.

 

예를 들어 Node.js 애플리케이션을 Docker로 실행하고 싶다면 Dockerfile에 이런 내용을 작성할 수 있다.

FROM node:20

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]
 

처음 보면 어렵게 보일 수 있지만, 의미는 단순하다.

Node.js 20 환경을 사용한다.
작업 폴더를 /app으로 정한다.
package.json 파일을 복사한다.
npm install을 실행한다.
나머지 코드를 복사한다.
3000번 포트를 사용한다.
npm start로 애플리케이션을 실행한다.
 

즉, Dockerfile은 “이 애플리케이션을 어떤 환경에서 어떻게 실행할 것인가”를 적어둔 파일이다.

 

이 파일이 있으면 다른 사람도 같은 이미지를 만들고, 같은 방식으로 컨테이너를 실행할 수 있다.


⭐VM이란?

Docker를 이해할 때 자주 비교되는 개념이 VM이다.

 

VM은 Virtual Machine, 즉 가상 머신이다.

가상 머신은 하나의 물리 서버 위에 여러 개의 가상 컴퓨터를 만들어 사용하는 기술이다.

 

예를 들어 실제 서버 한 대가 있다고 해보자.

물리 서버
 

이 서버 위에 가상 머신을 여러 개 만들 수 있다.

물리 서버
--- VM 1: Ubuntu
--- VM 2: CentOS
--- VM 3: Windows Server
 

각 VM은 독립된 컴퓨터처럼 동작한다.
각각의 VM은 운영체제를 따로 가지고 있고, CPU, 메모리, 디스크 같은 자원을 할당받아 사용한다.

 

비유하면 VM은 한 건물 안에 독립된 원룸을 여러 개 만드는 것과 비슷하다.

각 원룸은 문도 따로 있고, 전기 계량기도 따로 있고, 내부 구조도 따로 있다. 독립성이 높지만 그만큼 공간과 비용이 더 든다.


⭐VM은 어떻게 동작할까?

VM은 보통 하이퍼바이저라는 기술을 통해 동작한다.

 

하이퍼바이저는 물리 서버의 자원을 나누어 여러 가상 머신이 사용할 수 있게 해주는 역할을 한다.

 

구조를 단순화하면 다음과 같다.

물리 서버
--- Host OS
    --- Hypervisor
        --- Guest OS + App
        --- Guest OS + App
        --- Guest OS + App
 

여기서 중요한 점은 각 VM이 Guest OS를 가진다는 것이다.

 

예를 들어 물리 서버의 운영체제가 Ubuntu라고 해도, 그 위에 Windows Server VM을 만들 수 있다. 또는 여러 개의 Linux VM을 만들 수도 있다.

 

VM은 운영체제 단위로 분리되기 때문에 격리성이 강하다. 하지만 각각의 VM이 운영체제를 포함하기 때문에 무겁고 시작 시간이 오래 걸릴 수 있다.


⭐ Docker와 VM의 가장 큰 차이

Docker와 VM의 가장 큰 차이는 운영체제를 포함하는 방식이다.

 

1️⃣ VM 구조

왼쪽 VM 구조는 아래에서 위로 이렇게 쌓여 있다.

Infrastructure
→ Host Operating System
→ Hypervisor
→ Guest OS
→ Bins/Libs
→ App
 

여기서 핵심은 각 애플리케이션마다 Guest OS가 따로 존재한다는 점이다.

 

그림을 보면 App 1, App 2, App 3이 각각 따로 실행되고 있다. 그런데 각 App마다 아래에 Guest OS가 하나씩 들어 있다.

즉, VM에서는 애플리케이션 하나를 실행하기 위해 다음 구성이 함께 필요하다.

App 1 + 필요한 라이브러리 + Guest OS
App 2 + 필요한 라이브러리 + Guest OS
App 3 + 필요한 라이브러리 + Guest OS
 

비유하면 VM은 각 애플리케이션마다 독립된 컴퓨터 한 대를 새로 만드는 방식이다.

 

예를 들어 하나의 물리 서버 위에 Ubuntu VM, CentOS VM, Windows Server VM을 각각 띄울 수 있다. 각 VM은 운영체제를 따로 가지고 있기 때문에 독립성이 강하다. 하지만 운영체제를 매번 포함해야 하므로 무겁고 자원을 많이 사용한다.

2️⃣ Docker 컨테이너 구조

오른쪽 Docker 구조는 아래에서 위로 이렇게 쌓여 있다.

Infrastructure
→ Operating System
→ Docker Engine
→ Bins/Libs
→ App
 

여기서 핵심은 각 컨테이너가 Guest OS를 따로 가지지 않는다는 점이다.

 

그림을 보면 App 1, App 2, App 3은 각각 분리되어 있지만, VM처럼 각 App 아래에 Guest OS가 따로 없다. 대신 하나의 Host Operating System 위에서 Docker Engine이 컨테이너들을 실행한다.

즉, Docker에서는 각 애플리케이션이 다음처럼 실행된다.

App 1 + 필요한 라이브러리
App 2 + 필요한 라이브러리
App 3 + 필요한 라이브러리
 

운영체제 전체를 각각 들고 있는 것이 아니라, 호스트 OS의 커널을 공유하면서 애플리케이션 실행에 필요한 것만 컨테이너 안에 담는다.

 

비유하면 Docker는 각 애플리케이션을 가벼운 실행 상자에 담아 실행하는 방식이다.


이 그림에서 가장 중요한 차이는 바로 Guest OS가 있느냐 없느냐다.

구분 VM Docker 컨테이너
운영체제 각 VM마다 Guest OS 포함 Host OS 커널 공유
구조 무겁다 가볍다
실행 속도 상대적으로 느리다 빠르다
자원 사용량 많다 적다
격리 수준 OS 단위 격리 프로세스 단위 격리
예시 가상 컴퓨터 여러 대 실행 앱 실행 환경 여러 개 실행

VM은 애플리케이션마다 운영체제를 통째로 포함한다. Docker는 운영체제를 통째로 포함하지 않고, 애플리케이션과 필요한 라이브러리만 묶어서 실행한다.

 

그래서 Docker 컨테이너는 VM보다 보통 더 빠르게 실행되고, 더 적은 메모리와 디스크를 사용한다.


 Docker를 사용하면 좋은 점

1️⃣ 실행 환경을 통일할 수 있다

Docker의 가장 큰 장점은 실행 환경을 통일할 수 있다는 점이다.

개발자의 컴퓨터, 테스트 서버, 운영 서버에서 같은 Docker 이미지를 사용하면 환경 차이로 인한 문제를 줄일 수 있다.

개발 환경: Docker 컨테이너 실행
테스트 환경: 같은 Docker 컨테이너 실행
운영 환경: 같은 Docker 컨테이너 실행
 

그래서 “내 컴퓨터에서는 됐는데 서버에서는 안 된다”는 문제를 줄일 수 있다.

2️⃣ 배포가 쉬워진다

Docker 이미지를 만들어두면 서버에서는 그 이미지를 받아 실행하면 된다.

이미지 빌드
→ 이미지 저장소에 업로드
→ 서버에서 이미지 다운로드
→ 컨테이너 실행
 

이 방식은 CI/CD 파이프라인과 잘 어울린다.

 

예를 들어 GitHub에 코드를 push하면 자동으로 Docker 이미지를 만들고, 서버에 배포하는 구조를 만들 수 있다.

3️⃣ 여러 서비스를 쉽게 실행할 수 있다

현대적인 백엔드 애플리케이션은 보통 하나의 프로그램만으로 동작하지 않는다.

 

예를 들어 다음과 같은 구성일 수 있다.

백엔드 서버
MySQL
Redis
Nginx
메시지 큐
 

Docker를 사용하면 각각을 컨테이너로 분리해서 실행할 수 있다.

backend-container
mysql-container
redis-container
nginx-container
 

이렇게 하면 각 서비스의 실행 환경이 서로 섞이지 않는다.

4️⃣ 확장과 복구가 편하다

Docker 컨테이너는 이미지 기반으로 실행된다.
따라서 같은 컨테이너를 여러 개 띄우거나, 문제가 생긴 컨테이너를 삭제하고 새로 띄우기 쉽다.

 

예를 들어 트래픽이 많아졌다면 같은 웹 애플리케이션 컨테이너를 여러 개 실행할 수 있다.

web-container-1
web-container-2
web-container-3
 

컨테이너 하나에 문제가 생기면 새 컨테이너로 교체할 수 있다.

이런 특징은 Kubernetes 같은 컨테이너 오케스트레이션 도구와 함께 사용할 때 더 강력해진다.


Docker가 편리하다고 해서 모든 문제가 자동으로 해결되는 것은 아니다.

 

첫 번째로, 컨테이너는 기본적으로 휘발성이라는 점을 이해해야 한다.

 

컨테이너 안에 데이터를 저장해두고 컨테이너를 삭제하면 데이터가 사라질 수 있다. 그래서 데이터베이스처럼 데이터를 보존해야 하는 서비스는 볼륨을 사용해야 한다.

컨테이너 내부 저장소만 사용
→ 컨테이너 삭제 시 데이터 손실 가능

Docker Volume 사용
→ 컨테이너가 바뀌어도 데이터 유지 가능
 

두 번째로, 보안 설정도 중요하다.


컨테이너가 가볍다고 해서 아무 이미지나 내려받아 사용하면 위험할 수 있다. 공식 이미지나 신뢰할 수 있는 이미지를 사용하고, 불필요한 권한을 줄이는 것이 좋다.

 

세 번째로, Docker와 VM은 대체 관계만은 아니다.


실제 환경에서는 VM 위에서 Docker를 실행하는 경우도 많다.

예를 들어 클라우드에서 EC2 같은 VM을 만들고, 그 위에서 Docker 컨테이너를 실행할 수 있다.

클라우드 VM
--- Docker
    --- backend-container
    --- nginx-container
    --- redis-container
 

즉, VM과 Docker는 경쟁 관계라기보다 서로 다른 계층에서 함께 사용될 수 있다.

'Docker' 카테고리의 다른 글

Docker compose란?  (0) 2026.05.14
Dockerfile을 어떻게 작성하고, 이미지를 빌드하는 과정은?  (0) 2026.05.14