Docker란 무엇인가요?

이 콘텐츠는 eBook, 컨테이너화된 .NET 애플리케이션을 위한 .NET 마이크로 서비스 아키텍처에서 발췌한 것이며, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Docker는 클라우드 또는 온-프레미스로 실행될 수 있는 이식 가능하고 문제를 스스로 해결할 수 있는 컨테이너로서 애플리케이션 배포를 자동화하기 위한 오픈 소스 프로젝트입니다. Docker는 Microsoft를 비롯한 클라우드, Linux 및 Windows 공급 업체와 협업하여 이 기술을 장려하고 발전시키는 회사이기도 합니다.

Diagram showing the places Docker containers can run.

그림 2-2. Docker는 하이브리드 클라우드의 모든 레이어에서 컨테이너를 배포합니다.

Docker 컨테이너는 고객 데이터 센터의 온-프레미스, 외부 서비스 공급자 또는 Azure의 클라우드에서, 어디서나 실행할 수 있습니다. Docker 이미지 컨테이너는 Linux 및 Windows에서 기본적으로 실행할 수 있습니다. 그러나 Windows 이미지는 Windows 호스트에서만 실행할 수 있고 Linux 이미지는 Linux 호스트 및 Windows 호스트(지금까지 Hyper-V Linux VM 사용)에서 실행할 수 있습니다. 여기서 호스트는 서버 또는 VM을 의미합니다.

개발자는 Windows, Linux 또는 macOS에서 개발 환경을 사용할 수 있습니다. 개발자는 개발 컴퓨터에서 앱 및 해당 종속성을 비롯하여 Docker 이미지가 배포된 Docker 호스트를 실행합니다. Linux 또는 macOS에서 작업하는 개발자는 Linux 기반의 Docker 호스트를 사용하고 Linux 컨테이너용 이미지만 만들 수 있습니다. (macOS에서 작업하는 개발자는 macOS에서 코드를 편집하거나 Docker CLI를 실행할 수 있지만, 이 문서 작성 당시 컨테이너가 macOS에서 직접 실행되지 않습니다.) Windows에서 작업하는 개발자는 Linux 또는 Windows 컨테이너용 이미지를 만들 수 있습니다.

개발 환경에서 컨테이너를 호스트하고 추가 개발자 도구를 제공하기 위해 Docker는 Windows 또는 macOS용 Docker Desktop을 제공합니다. 이러한 제품은 컨테이너를 호스트하는 데 필요한 VM(Docker 호스트)을 설치합니다.

Windows 컨테이너를 실행하기 위해 다음 두 가지 유형의 런타임이 있습니다.

  • Windows Server 컨테이너는 프로세스 및 네임 스페이스 격리 기술을 통해 애플리케이션 격리를 제공합니다. Windows Server 컨테이너는 컨테이너 호스트와 호스트에서 실행 중인 모든 컨테이너와 커널을 공유합니다.

  • Hyper-v 컨테이너는 고도로 최적화된 가상 머신에서 각 컨테이너를 실행하여 Windows Server 컨테이너에서 제공하는 격리를 확장합니다. 이 구성에서 컨테이너 호스트의 커널은 Hyper-V 컨테이너와 공유되지 않으므로 격리 기능이 향상됩니다.

이러한 컨테이너의 이미지는 동일한 방식으로 생성되어 작동합니다. 차이점은 이미지에서 컨테이너가 생성되는 방식에 있으며, Hyper-V 컨테이너를 실행하려면 추가 매개 변수가 필요합니다. 자세한 내용은 Hyper-V 컨테이너를 참조하세요.

Docker 컨테이너와 가상 머신 비교

그림 2-3은 VM과 Docker 컨테이너 비교를 보여 줍니다.

Virtual Machines Docker 컨테이너
Diagram showing the hardware/software stack of a traditional VM. Diagram showing the hardware/software stack for Docker containers.
가상 머신에는 애플리케이션, 필수 라이브러리 또는 바이너리 및 전체 게스트 운영 체제가 포함됩니다. 전체 가상화를 위해서는 컨테이너화보다 더 많은 리소스가 필요합니다. 컨테이너에는 애플리케이션과 모든 종속성이 포함됩니다. 그러나 컨테이너는 호스트 운영 체제의 사용자 공간에 있는 격리 프로세스로 실행 중인 다른 컨테이너와 OS 커널을 공유합니다. 단, 각 컨테이너가 컨테이너별로 특수 가상 머신 내부에서 실행되는 Hyper-V 컨테이너는 예외입니다.

그림 2-3. 기존의 가상 머신과 Docker 컨테이너 비교

VM의 경우 기본적으로 호스트 서버에 세 가지 기본 계층인 인프라, 호스트 운영 체제 및 하이퍼바이저가 있고, 이들 계층 위에서 각 VM에는 고유한 OS 및 모든 필요한 라이브러리가 포함됩니다. Docker의 경우 호스트 서버에는 인프라와 OS만 있고, 그 위에는 컨테이너를 격리 상태로 유지하지만 기본 OS 서비스를 공유하는 컨테이너 엔진이 있습니다.

컨테이너는 훨씬 적은 리소스를 필요로 하므로(예: 전체 OS가 필요하지 않음) 보다 쉽고 빠르게 배포할 수 있습니다. 따라서 밀도가 높아지고, 이는 동일한 하드웨어 장치에서 더 많은 서비스를 실행할 수 있어 비용을 절감할 수 있음을 의미합니다.

동일한 커널에서 실행되는 부작용으로 VM보다 격리성은 떨어집니다.

이미지의 주요 목표는 서로 다른 배포에서 환경(종속성)을 동일하게 만드는 것입니다. 즉, 컴퓨터에서 이를 디버그한 다음, 동일한 환경의 다른 컴퓨터에 배포할 수 있습니다.

컨테이너 이미지는 앱 또는 서비스를 패키지로 만들고 이를 안정적이고 재현 가능한 방식으로 배포하는 방법입니다. Docker는 기술일 뿐만 아니라 철학이면서 프로세스이기도 합니다.

Docker를 사용하는 개발자가 "내 컴퓨터에서는 작동하지만 프로덕션 환경에서는 작동하지 않는 이유는 무엇인가요?"라는 말을 할 일은 없습니다. 패키지된 Docker 애플리케이션은 지원되는 모든 Docker 환경에서 실행할 수 있고 모든 배포 대상(예: Dev, QA, 스테이징 및 프로덕션)에서 의도한 대로 실행되기 때문에 그들은 단순히 "Docker에서 실행됩니다"라고 말하면 됩니다.

간단한 비유

간단한 비유는 Docker의 핵심 개념을 이해하는 데 도움이 될 수 있습니다.

잠시 시간을 1950년대로 되돌려 보겠습니다. 워드 프로세서가 없었고 모든 곳에서 일종의 복사기가 사용되었습니다.

각 고객의 주소에 물리적으로 배달되도록 실제 종이와 봉투를 사용하여 고객에게 편지를 우편으로 보내기 위해 필요에 따라 여러 묶음의 편지를 신속하게 발송하는 일을 담당한다고 가정해 보겠습니다(그 당시에는 전자 메일이 없었음).

문득, 편지는 편지의 목적에 맞게 필요에 따라 선택 및 정렬된 많은 단락 집합으로 구성될 뿐이라는 사실을 인식하고, 두둑한 월급 인상을 기대하며 편지를 신속하게 발송하는 시스템을 고안합니다.

시스템은 간단합니다.

  1. 각각 하나의 단락을 포함하는 한 데크의 투명 시트로 시작합니다.

  2. 편지 집합을 발송하려면 필요한 단락이 포함된 시트를 선택한 후 잘 보고 읽을 수 있도록 시트를 쌓고 정렬합니다.

  3. 마지막으로 해당 집합을 복사기에 놓고 시작을 눌러 필요한 만큼 편지를 생성합니다.

이것은 Docker의 핵심 아이디어를 단순화한 것입니다.

Docker에서 각 계층은 프로그램 설치 등의 명령을 실행한 후 파일 시스템에 발생하는 변경 내용의 결과 집합입니다.

따라서 계층이 복사된 후 파일 시스템을 “표시”하면 프로그램 설치 시 계층에 포함된 모든 파일이 표시됩니다.

이미지는 운영 체제가 이미 설치된 “컴퓨터”에 설치할 준비가 된 보조 읽기 전용 하드 디스크라고 생각할 수 있습니다.

마찬가지로 컨테이너는 이미지 하드 디스크가 설치된 “컴퓨터”로 생각할 수 있습니다. 컴퓨터처럼 컨테이너의 전원을 켜거나 끌 수 있습니다.