들어가며
도커가 2013년에 출시된 이후로 여러 카테고리에서 많은 변화가 있었습니다. 컨테이너의 대중화를 이끌며, 이로부터 파생된 다양한 기술과 산업군이 생겨났습니다. 소프트웨어 개발 방식과 배포 방식 또한 변화하였습니다.
이러한 변화들을 차치하더라도, 일관된 환경과 다양한 종속성에 대해 가볍게 실행할 수 있는 방식은 빠르게 개발하고 테스트해야 하는 개발자들에게 최고의 환경이라고 할 수 없습니다.
이처럼 뛰어난 이점을 누리기 위해 도커에 대해 처음부터 알아보고자 합니다. 이 글은 도커에 대해 들어본 적은 있지만 어떤 기술인지 잘 모르는 분들을 위해 작성하였으며, 저 자신이 참고하여 도움을 받을 수 있도록 기술해 둔 글입니다.
소프트웨어 실행 및 배포 측면에서 컨테이너만큼 가볍고 간편한 기술은 드물다고 생각합니다. 만들고 배포할 때 빠르게 테스트할 수 있으며, 호스트 머신의 의존성 없이 애플리케이션을 실행할 수 있습니다.
Docker의 배경
모든 기술은 기존의 문제를 해결하기 위해 발전합니다. 어떤 문제점이 있었고, 그것을 해결하기 위해 어떤 노력이 있었으며, 그 노력을 통해 어떻게 진화하였는지를 이해하는 것은 기술을 단편적으로 습득하는 것보다 더 많은 것을 배울 수 있습니다. 이렇게 기억하면 외우지 않아도 전체적인 흐름이 친근하게 다가오고 쉽게 납득하며 이해할 수 있습니다.
전통적인 서버 운영 방식
하나의 서버에서 애플리케이션을 실행하는 방식이 일반적인 서버 운영 방식이었습니다. 이 방식은 다음과 같은 문제점을 야기합니다.
- 동일한 호스트에서 실행되는 애플리케이션 간에 충분한 격리가 이루어지지 않아, 하나의 애플리케이션에서 장애가 발생하면 서버 전체에 영향을 미칠 수 있습니다.
- 자원(cpu, 메모리, 네트워크, 디스크 I/O 등)을 효율적으로 분배할 수 없어 자원의 낭비 혹은 부족이 발생할 수 있습니다.
- 환경 구성이 복잡하여, 서로 다른 환경에서 애플리케이션을 운영하기 어렵습니다.
- 사용량 예측을 통해 물리 서버의 사양을 결정해야 하므로, 비용 낭비가 발생하며 즉각적인 확장 및 축소가 어렵습니다.
이러한 문제를 해결하기 위해 가상화 기술이 등장하였습니다.
가상화
가상화 기술의 발전으로 하나의 물리 서버에서 여러 개의 가상 머신을 격리된 환경에서 실행할 수 있게 되었습니다.
💡 가상화는 하이퍼바이저와 같은 소프트웨어를 사용하여 프로세서, 메모리, 스토리지 등 단일한 물리 서버의 자원을 다수의 가상 머신으로 분할하여 사용할 수 있는 하드웨어의 추상화 계층을 구축하고 독립적인 가상의 운영체제를 실행할 수 있도록 하는 것이다. 추상화 계층이란 하나뿐인 자원의 일부만 사용하는 사용자가 독립적인 자원을 사용하는 것처럼 작동하게 하는 계층이다.
가상화 기술이 발전하면서 여러 가상 머신을 단일한 호스트 위에서 실행할 수 있게 되었습니다.
각각의 가상 머신은 격리되어 있기 때문에 서로 다른 가상 머신 간 영향도가 최소가 됩니다.
원하는 수의 가상 머신을 실행하고, 실행된 가상 머신에서 애플리케이션을 구동하면 하나의 애플리케이션에서 장애가 발생하더라도 다른 가상 머신의 애플리케이션에는 영향을 미치지 않게 됩니다.
사용 가능한 하드웨어 자원을 가상화하여 사용량에 따른 설정을 통해 자원 분배가 효율적으로 이루어집니다.
예를 들어, CPU 연산이 많은 애플리케이션을 실행하려는 경우에는 CPU 자원을 높게 설정한 가상 머신을 실행하고, 해당 가상 머신에서 해당 애플리케이션을 구동하는 방식으로 운영합니다.
가상 머신 간에 필요한 자원을 효율적으로 분배할 수 있기 때문에 결과적으로 비용적인 이점을 얻을 수 있습니다.
각각의 머신은 격리되어 있기 때문에 환경 또한 서로 완전히 분리되어 있습니다.
필요한 라이브러리나 바이너리에 대한 의존성을 애플리케이션이 필요로 하는 환경에 맞춰 구성할 수 있습니다.
과거 하나의 서버에서 실행할 때 필요했던 복잡한 의존성 관리가 훨씬 쉬워지게 됩니다.
이러한 이점들은 하나의 서버에 애플리케이션을 직접 실행하는 방식에서 발생하던 문제점들을 대부분 해결합니다.
가상 머신은 머신 레벨에서 필요한 추상화를 충분히 제공합니다. 하지만 구조적 문제점과 애플리케이션 관점에서의 문제점도 존재합니다.
- 하이퍼바이저와 같은 소프트웨어가 필요하기 때문에 애플리케이션을 호스트에서 직접 실행하는 것보다 성능과 자원 면에서 오버헤드가 발생합니다.
- 가상 머신 내에 게스트 운영체제가 중복해서 필요하기 때문에 자원 낭비가 발생합니다.
- 가상 머신을 재부팅하거나 확장하는 경우, 게스트 OS의 부팅 시간 등으로 인해 애플리케이션 실행 준비 시간이 길어져 민첩성이 떨어집니다.
- 개발, 테스트, 운영 환경에 대한 설정을 일치시키는 것이 어렵습니다. 이는 가상 머신의 환경 설정뿐 아니라 라이브러리, 바이너리의 의존성 버전, 커널 버전까지 동일하게 맞추는 것이 쉽지 않기 때문입니다.
가상화가 풀지 못한 문제점을 컨테이너 기술로 해결이 가능하게됩니다.
컨테이너 기술
컨테이너 기술은 프로세스에 대한 가상화로 하나의 운영체제 내에서 여러 개의 격리된 사용자 공간을 생성하여 애플리케이션을 격리된 사용자 공간에 배치 및 실행하는 기술입니다.
호스트 운영체제 커널을 공유하면서 각각의 컨테이너는 독립된 파일 시스템, 라이브러리, 실행 환경을 가질 수 있습니다. (이는 위에서 본 추상화 계층과 가상화와 완전하게 동일한 맥락으로 설명됩니다.)
컨테이너 환경은 가상 머신보다 자원 낭비가 적고 애플리케이션의 실행을 빠른 속도로 할 수 있습니다.
또한 라이브러리, 설정 파일, 환경 정보 등이 포함되어 관리되기 때문에 애플리케이션 실행에 일관된 상태를 유지하기 쉽게 만들어 애플리케이션 실행에 있어 가지고 있던 가상머신의 문제점을 해결했습니다.
컨테이너 기술은 주로 리눅스 운영체제의 cgroup, namespace, chroot 등 기술을 기반으로 사용합니다. 해당 기술은 리소스 할당, 사용자 권한 제어, 권한에 따른 자원 격리 등에 관련된 기술이며, 리눅스와 호환되는 운영체제에서 작동합니다.
2013년 도커가 공식 릴리스하기 이전에도 컨테이너 기술은 존재했습니다.
하지만 기능이나 사용자의 사용성 면에서 불편함이 많아 상용화되지 못했었습니다. 그리고 도커가 릴리즈 되면서 컨테이너 기술이 대중적으로 많이 사용됩니다.
가상머신과 컨테이너 - 비교 보단 화합
가상 머신과 컨테이너의 특징
항목 | 가상 머신 (Virtual Machine) | 컨테이너 (Container) |
부팅 시간 | 수 분 | 수 초 |
운영체제 | 각 가상 머신마다 게스트 OS가 필요 | 호스트 OS 커널을 공유 |
자원 효율성 | 중간 계층 (하이퍼바이저)로 인해 자원 사용 비효율적 | 비교적 경량화된 자원 사용 |
성능 | 하이퍼바이저로 인한 오버헤드 발생 가능 | 거의 네이티브 성능 |
배포 및 이동성 | 전체 VM 이미지를 복제하여 배포, 이미지가 커서 이동이 어려움 | 컨테이너 이미지로 경량화, 빠른 배포 및 이동성 제공 |
환경 일관성 | 개발, 테스트, 운영 환경 간의 차이 존재 | 모든 환경에서 일관된 실행 환경 제공 |
관리 복잡성 | 비교적 복잡 | 상대적으로 단순 |
운영체제 호환성 | 다양한 운영체제 지원 가능 | 주로 리눅스 기반, Windows 컨테이너도 지원 |
보안 | 각 VM은 독립된 OS로 보안성이 높음 | 컨테이너 간 커널 공유로 보안 측면에서 추가적인 고려 필요 |
가상 머신과 컨테이너는 단순히 서로를 대체하는 개념이 아닙니다.
각각의 기술은 고유한 장점과 단점을 가지고 있으며, 특정 상황과 요구 사항에 맞춰 적절히 선택되고 사용될 수 있습니다.
가상 머신은 높은 격리와 다양한 운영체제 지원이 필요한 환경에서 유리하며, 컨테이너는 빠른 배포와 자원 효율성이 중요한 환경에서 사용성이 높습니다.
현대의 IT에서는 이 두 기술이 상호 보완적으로 혼합되어 사용됩니다. 예를 들어, 클라우드는 가상화와 컨테이너 기술의 혼합으로 높은 사용성을 가진 산업으로 발전했습니다. 가상 머신 위에서 컨테이너를 실행함으로써 두 기술의 장점을 모두 활용할 수 있게 됩니다.
높은 격리 수준과 함께 컨테이너의 빠른 배포와 경량화의 이점을 취할 수 있기 때문에 가상 머신과 컨테이너는 각각의 강점을 살려 최적의 IT 환경을 구성하는 데 중요한 역할을 수행하게 됩니다.
도커란 무엇인가?
리눅스 커널에 있는 격리된 환경과 사용자 권한 부여 등과 관련된 기술들을 활용해 컨테이너 기술이 발전했습니다. 다양한 컨테이너 환경을 만드는 기술이 나왔지만 사용자가 사용하기 쉬운 방식이 아니었습니다. 예를 들면 특정 운영체제 버전에 종속적이거나, 초기 설정이 너무 복잡하거나, 보안적으로 이슈가 있는 등이었습니다. (관련 키워드 - LXC, OpenVZ, Linux-VServer 등)
Docker는 이런 기술들이 가지고 있는 단점을 보완하고 장점을 취하여 만들어진 컨테이너 환경 관리 플랫폼 기술입니다.
- 컨테이너 생성, 애플리케이션 배포, 컨테이너 관리에 대해 직관적이고 쉬운 방식
- 쉬운 이미지 구축 방식 및 DockerHub를 통해서 이미지를 쉽게 공유
- Docker compose를 통해 복합 애플리케이션 관리
- 광범위한 커뮤니티 지원
애플리케이션 실행에 필요한 애플리케이션 소스, 라이브러리 의존성, 실행에 필요한 런타임(python, java), 운영체제를 하나의 이미지로 만들고, 이미지를 통해서 컨테이너를 실행시킵니다.
격리된 공간에 가상의 프로세스를 만들어 실행함으로써 사용자는 완전히 격리된 환경의 작은 서버로 동작하는 것과 같이 느낄 수 있습니다.
도커는 위와 같은 특징을 바탕으로 손쉽게 컨테이너 환경을 구축할 수 있도록 하여, 컨테이너화의 대중성에 큰 기여를 하게 됩니다.
도커가 이끈 컨테이너화의 대중적인 흐름과 함께 CI/CD, DevOps, container orchestration 등 다양한 개념들이 컨테이너와 함께 진화하고 발전했습니다.
'관심 기술 > container' 카테고리의 다른 글
도커 네트워크: 드라이버 종류와 활용법 (0) | 2025.04.08 |
---|---|
도커 컨테이너에서도 데이터 유지하는 방법: Volume 사용법 (0) | 2025.04.07 |
도커 컨테이너 이해: 개념부터 실행까지 (0) | 2025.04.07 |
명령어에서 선언으로: Docker Compose로 더 나은 컨테이너 관리하기 (0) | 2025.04.06 |
도커 이미지 개념부터 실습까지: 내 앱을 어디서든 실행하는 법 (0) | 2025.04.05 |