나만의 학습 기록

최종 목적은 기술 블로그💩

백엔드 공부

컨테이너화 VS 가상화 - Docker란 무엇인가

밈밍민믹 2026. 5. 28. 16:01

안녕하세요. 오늘은 병원가서 깁스 풀고 재활 치료 받느라서 블로그 작성이 늦어졌네요. 정말이지 병원에 갔다오면 오전이 순식간에 지나가는 것 같네요. 그럼 컨테이너화와 가상화에 대한 학습 시작해보도록 하겠습니다.


가상화

가상화는 하나의 물리 서버 위에서 여러 개의 독립된 가상 환경을 실행하는 기술입니다.

일반적으로 하이퍼바이저라는 소프트웨어가 물리 서버의 CPU, 메모리, 디스크 같은 자원을 나누어 여러 가상 머신을 실행합니다. 각 가상 머신은 자신만의 운영체제를 가지고 있으며, 실제 서버처럼 독립적으로 동작합니다.

예를 들어 하나의 물리 서버 위에 Linux 가상 머신, Windows 가상 머신을 각각 실행할 수 있습니다. 각 VM은 독립된 운영체제를 가지기 때문에 격리 수준이 높다는 장점이 있습니다. 하지만 VM마다 운영체제를 포함해야 하므로 상대적으로 무겁고, 실행 속도나 자원 사용량 측면에서 부담이 커질 수 있습니다.

 

컨테이너화

컨테이너화는 애플리케이션과 실행에 필요한 의존성, 설정 파일 등을 하나의 실행 단위로 묶어 격리된 환경에서 실행하는 방식입니다. 가상 머신처럼 운영체제 전체를 각각 포함하는 것이 아니라, 호스트 운영체제의 커널을 공유하면서 애플리케이션 실행에 필요한 부분만 독립적으로 구성합니다.

컨테이너는 VM보다 가볍고 빠르게 실행될 수 있습니다. 운영체제 전체를 새로 띄우는 것이 아니라, 애플리케이션 실행에 필요한 환경만 묶어 실행하기 때문입니다. 따라서 같은 서버에서 더 많은 애플리케이션을 효율적으로 실행할 수 있고, 개발 환경과 배포 환경의 차이도 줄일 수 있습니다.

 

가상화와 컨테이너화의 차이

가상화는 운영체제까지 포함한 독립된 서버 환경을 만드는 방식에 가깝고, 컨테이너화는 애플리케이션 실행 환경을 가볍게 격리하는 방식에 가깝습니다. 따라서 완전히 독립된 운영체제 환경이 필요하다면 가상화가 적합할 수 있고, 애플리케이션을 빠르고 일관되게 배포하고 싶다면 컨테이너화가 유리할 수 있습니다.

구분 가상화 컨테이너화
실행 단위 가상 머신 컨테이너
운영체제 VM마다 Guest OS 포함 Host OS 커널 공유
무게 상대적으로 무거움 상대적으로 가벼움
실행 속도 비교적 느림 비교적 빠름
격리 수준 높음 프로세스 단위 격리
자원 사용량 많음 적음
대표 기술 VMware, VirtualBox, Hyper-V Docker, containerd

 

Docker

Docker는 컨테이너 기반으로 애플리케이션을 실행하고 배포할 수 있도록 도와주는 플랫폼입니다.

Docker를 사용하면 애플리케이션 코드뿐 아니라 실행에 필요한 라이브러리, 설정, 런타임 환경을 이미지로 묶을 수 있습니다. 그리고 이 이미지를 기반으로 컨테이너를 싱행하면 어느 환경에서든 비교적 일관된 방식으로 애플리케이션을 실행할 수 있습니다.

 

Docker 기반 컨테이너 실행 구조

해당 그림은 Docker 기반으로 컨테이너화된 애플리케이션이 실행되는 구조를 보여줍니다.

출처 : https://www.docker.com/resources/what-container/

가장 아래에는 실제 서버나 클라우드 환경에 해당하는 Infrastructure가 있고, 그 위에 Host Operating System이 실행됩니다. Docker는 Host OS 위에서 동작하며, 여러 개의 컨테이너를 실행하고 관리합니다.

각 컨테이너 안에는 App A, App B 처럼 서로 다른 애플리케이션이 실행될 수 있습니다. 이때 컨테이너는 가상 머신처럼 운영체제 전체를 각각 포함하지 않고, Host OS의 커널을 공유하면서 애플리케이션 실행에 필요한 환경만 격리합니다.

따라서 컨테이너는 가상 머신보다 상대적으로 가볍고 빠르게 실행될 수 있으며, 하나의 서버 위에서 여러 애플리케이션을 효율적으로 운영할 수 있습니다.

 

Docker Engine의 구성

Docker Engine은 Docker에서 컨테이너를 생성하고 실행하며 관리하는 핵심 실행 환경입니다.

사용자는 Docker CLI를 통해 명령어를 입력하고, Docker API를 통해 Docker Engine과 통신할 수 있습니다. Docker Engine은 이미지를 빌드하고, 컨테이너를 실행하며, 네트워크와 볼륨 같은 실행 환경을 관리합니다.

출처 : https://www.docker.com/products/container-runtime/

 

구성 요소 설명
Docker CLI 사용자가 Docker 명령어를 입력하는 도구
Docker API Docker CLI나 외부 도구가 Docker Engine과 통신하는 인터페이스
Docker Engine 컨테이너 생성, 실행, 이미지 관리 등을 담당하는 핵심 실행 환경
Containerd 컨테이너 실행을 관리하는 런타임 계층
Docker Build Dockerfile을 기반으로 이미지를 빌드하는 기능
Networking 컨테이너 간 통신과 외부 연결을 관리
Volumes 컨테이너 데이터 저장 공간을 관리
Distribution 이미지를 저장소에 push/pull하는 기능

즉, Docker Engine은 단순히 컨테이너를 실행하는 것만 담당하는 것이 아니라, 이미지 빌드, 컨테이너 실행, 네트워크 연결, 데이터 저장 공간, 이미지 배포까지 컨테이너 운영에 필요한 여러 기능을 관리합니다.

 

Docker를 사용하는 이유

1. 실행 환경 일관성

Docker를 사용하면 애플리케이션 실행 환경을 이미지로 묶을 수 있습니다. 따라서 개발 환경, 테스트 환경, 배포 환경에서 동일한 이미지를 사용해 실행할 수 있습니다. 이럴 경우 "내 컴퓨터에서는 됏는데 서버에서는 안된다"와 같은 환경 차이 문제를 줄일 수 있습니다.

 

2. 배포 편의성

Docker 이미지를 만들어두면 서버에서는 해당 이미지를 받아 컨테이너로 실행하면 됩니다. 기존 방식처럼 서버에 Java, Node.js, 라이브러리, 설정 파일을 하나씩 설치하고 맞추는 과정이 줄어들기 때문에 배포 과정이 단순해질 수 있습니다.

 

3. 격리된 실행 환경

 컨테이너는 서로 독립된 환경에서 실행됩니다. 하나의 서버에서 여러 애플리케이션을 실행하더라도 각 애플리케이션의 실행 환경을 분리할 수 있습니다.  

예를 들어 서로 다른 Java 버전이나 라이브러리 구성이 필요한 애플리케이션도 컨테이너를 통해 분리해서 실행할 수 있습니다.

 

4. 확장과 운영에 유리

Docker는 컨테이너 단위로 애플리케이션을 실행하기 때문에 인스턴스를 추가하거나 교체하는 방식이 비교적 단순합니다. 또한 Kubernetes 같은 컨테이너 오케스트레이션 도구와 함께 사용하면 여러 서버에 걸쳐 컨테이너를 배포하고 관리할 수 있습니다. 


Docker를 처음에는 단순히 애플리케이션을 컨테이너화하는 도구로만 생각했습니다. 하지만 이번에 컨테이너화와 Docker의 구조를 정리하면서 Docker가 단순한 실행 도구를 넘어 배포 환경을 일관되게 도움을 주는 기술이라는 점을 알 수 있었습니다.

특히 여러 프로젝트를 각각 컨테이너로 분리해 현재 사용 중인 Ubuntu 서버에서 독립적으로 실행할 수 있다는 점이 흥미로웠습니다. 하나의 서버 안에서도 프로젝트별 실행 환경을 분리하고, 포트와 Nginx 설정을 통해 여러 서비스를 함께 운영할 수 있다는 점에서 Docker의 활용 가능성을 더 구체적으로 이해하게 되었습니다. 다음 시간에는 GraphQL에 대해 알아보겠습니다. 감사합니다.