Docker

menu icon

Docker

Docker는 컨테이너형 애플리케이션의 빌드, 배치 및 관리를 위한 오픈 소스 플랫폼입니다. 컨테이너의 정의, VM과 컨테이너의 차이점, 그리고 왜 Docker가 이토록 널리 채택되고 사용되는지에 대해 알아봅니다.

Docker란?

Docker는 오픈 소스 컨테이너화 플랫폼입니다. 이를 통해 개발자는 애플리케이션을 컨테이너로 패키징할 수 있습니다. 컨테이너란 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 운영체제(OS) 라이브러리 및 종속 항목과 결합하는 실행 가능한 표준 컴포넌트를 말합니다. 컨테이너는 분산형 애플리케이션의 딜리버리를 간소화하며, 이는 기업들이 클라우드 네이티브 개발 및 하이브리드 멀티클라우드 환경으로 이전하면서 점점 더 유명세를 타고 있습니다.

개발자는 Docker를 사용하지 않고도 컨테이너를 구축할 수 있지만, Docker 플랫폼을 이용하면 보다 손쉽고 보다 간편하며 보다 안전하게 컨테이너를 빌드, 배치 및 관리할 수 있습니다. Docker는 기본적으로 개발자가 단일 API를 통한 업무 절감 자동화와 간단한 명령을 사용하여 컨테이너를 빌드, 배치, 실행, 업데이트 및 중지할 수 있도록 해주는 툴킷입니다.

Docker를 상용 Docker 버전을 판매하는 회사인 Docker, Inc.(IBM 외부 링크)라고도 합니다. 또한 Docker, Inc. 및 여러 다른 기업과 개인들이 함께 참여하는 Docker 오픈 소스 프로젝트(IBM 외부 링크)라고도 합니다.

컨테이너의 작동 방식 및 유명세를 타는 이유

컨테이너는 Linux 커널에 빌드된 가상화 기능과 프로세스 격리를 통해 가능하게 되었습니다. 여러 기능, 즉 프로세스 간의 리소스 할당을 위한 제어 그룹(Cgroups) 및 시스템의 기타 리소스나 영역에 대한 가시성이나 프로세스 액세스를 제한하기 위한 네임스페이스 등의 기능을 사용하면 다수의 애플리케이션 컴포넌트가 호스트 운영체제의 단일 인스턴스의 리소스를 공유할 수 있습니다. 이는 마치 하이퍼바이저를 통해 다수의 가상 머신(VM)이 단일 하드웨어 서버의 CPU, 메모리 및 기타 리소스를 공유하는 것과 거의 유사한 방식입니다.

결과적으로, 컨테이너 기술은 애플리케이션 격리, 비용 효율적인 확장성, 폐기 가능성을 포함하여 VM의 모든 기능과 장점을 제공합니다. 이와 더불어, 추가적인 중요 장점은 다음과 같습니다.

  • 경량의 무게: VM과는 달리, 컨테이너는 전체 OS 인스턴스와 하이퍼바이저의 페이로드를 전달하지 않습니다. 이는 오직 코드 실행에 필요한 OS 프로세스와 종속 항목만 포함합니다. 컨테이너 크기는 메가바이트(MB) 단위로 측정됩니다(반면, 일부 VM의 경우는 GB 단위임). 이는 하드웨어 용량을 보다 잘 활용하며, 구동 시간이 보다 신속합니다.
  • 리소스 효율성 향상: 컨테이너를 사용하는 경우, VM을 사용할 수 있는 동일 하드웨어에서 애플리케이션의 다수의 사본을 여러 번 실행할 수 있습니다. 이를 통해 클라우드 비용이 절감됩니다.
  • 개발자 생산성 향상: VM과 비교하여, 컨테이너는 보다 빠르며 보다 간편한 배치, 프로비저닝 및 재시작이 가능합니다. 따라서 이는 지속적 통합지속적 딜리버리(CI/CD) 파이프라인에서 사용하기에 이상적이며, 애자일 및 DevOps 사례를 채택하는 개발 팀에게 매우 적합합니다.

컨테이너를 사용하는 회사들은 앱 품질의 개선, 시장 변화에 대한 보다 신속한 대응 등을 포함한 다양한 장점들을 실감하고 있습니다. 아래의 대화식 툴을 사용하여 자세히 알아보세요.

전체 보고서 다운로드: 엔터프라이즈의 컨테이너(PDF, 1.4MB)

Docker를 사용하는 이유

오늘날 Docker가 너무나도 유명하므로, "Docker"와 "컨테이너"는 상호교환적으로 사용됩니다. 하지만 최초의 컨테이너 관련 기술은 2013년에 Docker가 일반에게 공개되기 전 몇 년 동안, 심지어 수십 년 동안(IBM 외부 링크) 사용할 수 있었습니다.

무엇보다도, 2008년에 LinuXContainers(LXC)는 Linux의 단일 인스턴스에 대한 가상화가 완벽히 가능한 Linux 커널에서 구현되었습니다. LXC가 오늘날 여전히 사용되고 있지만, Linux 커널을 사용하는 보다 새로운 기술을 사용할 수 있습니다. 최신의 오픈 소스 Linux 운영 시스템인 Ubuntu 역시 이러한 기능을 제공합니다.

Docker는 다음을 가능케 하는 기술을 사용하여 기본 Linux 컨테이너화 기능을 향상시켰습니다.

  • 개선되고 완벽한 이식성: LXC 컨테이너가 종종 시스템 특정 구성을 참조하는 반면, Docker 컨테이너는 데스크탑, 데이터 센터 및 클라우드 환경에서 수정 없이 실행됩니다.
  • 보다 경량의 중량과 보다 미세한 업데이트: LXC를 사용하면 다수의 프로세스를 단일 컨테이너 내에서 결합할 수 있습니다. Docker 컨테이너를 사용하면, 각 컨테이너에서 오직 하나의 프로세스만 실행할 수 있습니다. 이를 통해 업데이트나 수리를 위해 해당 파트 중 하나를 중지하는 동안에도 계속 실행될 수 있는 애플리케이션을 빌드할 수 있습니다.
  • 자동화된 컨테이너 작성: Docker는 애플리케이션 소스 코드를 기반으로 컨테이너를 자동으로 빌드할 수 있습니다.
  • 컨테이너 버전화: Docker는 컨테이너 이미지의 버전을 추적하고, 이전 버전으로 롤백하며, 버전을 빌드한 사용자와 빌드 방법을 추적할 수 있습니다. 심지어 이는 기존 버전과 새 버전 사이의 델타만 업로드할 수도 있습니다.
  • 컨테이너 재사용: 특히 새 컨테이너를 빌드하기 위한 템플릿처럼, 기존 컨테이너는 기본 이미지로 사용될 수 있습니다.
  • 공유 컨테이너 라이브러리: 개발자는 수천 개의 사용자가 기여한 컨테이너를 포함하는 오픈 소스 레지스트리에 액세스할 수 있습니다.

오늘날 Docker 컨테이너화는 Microsoft Windows 서버에서도 작동합니다. 그리고 대부분의 클라우드 제공자는 개발자가 Docker를 통해 컨테이너화된 애플리케이션을 빌드, 장착 및 실행할 수 있도록 지원하는 특정 서비스를 제공합니다.

이러한 이유로 인해, Docker 채택은 빠르게 확산되고 지속적으로 증가하고 있습니다. 이 글에서, Docker Inc.는 매월 1,100만명의 개발자와 130억개의 컨테이너 이미지 다운로드(IBM 외부 링크)를 보고합니다.

Docker 툴 및 용어

Docker를 사용할 때 접할 수 있는 일부 툴과 용어들은 다음과 같습니다.

DockerFile

모든 Docker 컨테이너는 Docker 컨테이너 이미지의 빌드 방법에 대한 지시사항이 포함된 단순 텍스트 파일로 시작됩니다. DockerFile은 Docker 이미지 작성 프로세스를 자동화합니다. 기본적으로, 이는 이미지를 어셈블링하기 위해 Docker 엔진이 실행할 명령행 인터페이스(CLI) 명령어의 목록입니다.

Docker 이미지

Docker 이미지에는 실행 가능한 애플리케이션 소스 코드는 물론, 애플리케이션 코드가 컨테이너로서 실행해야 하는 모든 툴, 라이브러리 및 종속 항목들이 포함되어 있습니다. Docker 이미지를 실행하는 경우, 이는 컨테이너의 하나의 인스턴스(또는 다수의 인스턴스)가 됩니다.

맨 처음부터 Docker 이미지를 빌드하는 것도 가능하지만, 대부분의 개발자는 공통 저장소에서 해당 이미지를 가져옵니다. 단일 기본 이미지에서 다수의 Docker 이미지를 작성할 수 있으며, 이는 해당 스택의 공통성을 공유합니다.

Docker 이미지는 계층들로 구성되며, 각 계층은 해당 이미지의 버전에 해당합니다. 개발자가 이미지를 변경할 때마다 새로운 최상위 계층이 작성되며, 이 최상위 계층은 이미지의 현재 버전으로서 이전의 최상위 계층을 대체합니다. 이전 계층은 롤백을 위해 또는 다른 프로젝트에서 재사용될 수 있도록 저장됩니다.

컨테이너가 Docker 이미지에서 작성될 때마다 컨테이너 계층이라고 하는 또 다른 새로운 계층이 작성됩니다. 파일의 추가 또는 삭제 등 컨테이너에 대한 변경사항은 컨테이너 계층에만 저장되며, 컨테이너가 실행되는 동안에만 존재합니다. 다수의 라이브 컨테이너 인스턴스가 단지 단일 기본 이미지에서 실행될 수 있으므로, 이러한 반복적인 이미지 생성 프로세스는 전체적인 효율성 개선을 지원합니다. 또한 이의 수행 시에는 공통 스택을 활용합니다.

Docker 컨테이너

Docker 컨테이너는 Docker 이미지의 실행 중인 라이브 인스턴스입니다. Docker 이미지는 읽기 전용 파일이지만, 컨테이너는 라이브, 임시, 실행 가능 콘텐츠입니다. 사용자는 이들과 상호 작용할 수 있으며, 관리자는 docker 명령을 사용하여 자체 설정과 조건을 알맞게 조정할 수 있습니다.

Docker 허브

Docker 허브(IBM 외부 링크)는 스스로 "컨테이너 이미지의 세계 최대 라이브러리 및 커뮤니티"라고 부르는 Docker 이미지의 공용 저장소입니다. 이는 상용 소프트웨어 공급업체, 오픈 소스 프로젝트 및 개별 개발자들로부터 제공받은 100,000개 이상의 컨테이너 이미지를 보유하고 있습니다. 여기에는 Docker, Inc.에서 생성한 이미지, Docker Trusted Registry에 속하는 공인 이미지, 그리고 수천 개의 기타 이미지들이 포함됩니다.

모든 Docker 허브 사용자는 자신의 이미지를 마음껏 공유할 수 있습니다. 또한 이들은 컨테이너화 프로젝트의 시작점으로 사용할 수 있도록 Docker 파일 시스템에서 사전 정의된 기본 이미지를 다운로드할 수도 있습니다.

Docker 디먼

Docker 디먼은 Microsoft Windows 또는 Apple MacOS 또는 iOS 등의 운영체제에서 실행되는 서비스입니다. 이러한 서비스는 Docker 구현의 제어 센터 역할을 하는 클라이언트의 명령을 사용하여 사용자 대신 Docker 이미지를 작성하고 관리합니다.

Docker 레지스트리

Docker 레지스트리는 Docker 이미지의 확장 가능한 오픈 소스 스토리지 및 분배 시스템입니다. 레지스트리를 사용하면 식별을 위한 태깅을 사용하여 저장소에서 이미지 버전을 추적할 수 있습니다. 이는 버전 제어 툴인 git를 사용하여 수행됩니다.

Docker 배치 및 오케스트레이션

단지 소수의 컨테이너만 실행하는 경우, 업계의 사실상 런타임인 Docker Engine 내에서 애플리케이션을 관리하는 것이 매우 심플합니다. 하지만 배치가 수천 개의 컨테이너와 수백 개의 서비스로 구성된 경우, 이러한 전용 툴을 사용하지 않고 해당 워크플로우를 관리한다는 것이 거의 불가능에 가깝습니다.

Docker Compose

모두가 동일한 호스트에 상주하는 다중 컨테이너의 프로세스에서 애플리케이션을 빌드하는 경우, Docker Compose를 사용하여 애플리케이션의 아키텍처를 관리할 수 있습니다. Docker Compose는 애플리케이션에 포함되는 서비스를 지정하는 YAML 파일을 작성할 수 있으며, 단일 명령으로 컨테이너를 배치하고 실행할 수 있습니다. 또한 Docker Compose를 사용하여 스토리지의 지속적 볼륨을 정의하고, 기본 노드를 지정하며, 서비스 종속 항목을 문서화하고 구성할 수도 있습니다.

Kubernetes

보다 복잡한 환경에서 컨테이너 라이프사이클을 모니터하고 관리하려면 컨테이너 오케스트레이션 툴에 의존해야 합니다. Docker에 자체 오케스트레이션 툴(Docker Swarm)이 포함되어 있지만, 대부분의 개발자는 그 대신 Kubernetes를 선택합니다.

Kubernetes는 Google에서 내부용으로 개발된 프로젝트에서 파생된 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. Kubernetes는 컨테이너 배치, 업데이트, 서비스 감지, 스토리지 프로비저닝, 로드 밸런싱, 상태 모니터링 등을 포함하여 컨테이너 기반 아키텍처의 관리에 필수적인 태스크를 스케줄링하고 자동화합니다. 또한 IstioKnative를 포함한 Kubernetes용 툴의 오픈 소스 에코시스템을 통해, 기업들은 컨테이너형 애플리케이션을 위한 높은 생산성의 PaaS(Platform-as-a-Service)서버리스 컴퓨팅을 위한 보다 빠른 진입로를 배치할 수 있습니다.

Kubernetes에 대해 자세히 알아보려면 "Kubernetes 설명" 동영상을 시청하세요.

Kubernetes 설명(10:59)

Docker 및 IBM Cloud

엔터프라이즈 컨테이너 플랫폼은 비즈니스 성능과 운영 성과의 향상을 위해 환경을 통합할 수 있도록 다수의 퍼블릭 및 프라이빗 클라우드에서 오케스트레이션을 제공합니다. 이는 오픈 하이브리드 클라우드 전략의 핵심 컴포넌트이며, 이를 통해 벤더 종속성을 피하고 일관성을 유지하면서 어디서나 워크로드를 빌드 및 실행할 수 있습니다. 또한 모든 IT를 최적화 및 현대화할 수도 있습니다.

다음 단계로 진행:

  • IBM Cloud의 엔터프라이즈 스케일과 보안을 활용하여 업데이트, 스케일링 및 프로비저닝을 자동화하는 관리형 OpenShift 서비스인 Red Hat OpenShift on IBM Cloud를 사용하여, 고가용성의 완전 관리형 Kubernetes 클러스터를 배치합니다.
  • 관리형 분산 클라우드 솔루션인 IBM Cloud Satellite를 사용하여 공급업체의 온프레미스, 에지 컴퓨팅 및 퍼블릭 클라우드 환경에서 앱을 배치하고 실행합니다.
  • IBM 하이브리드 클라우드 스토리지 솔루션을 사용하여 온프레미스와 퍼블릭 클라우드 환경에서 컨테이너 기반 엔터프라이즈 스토리지를 완벽하게 배치함으로써 자체 데이터 레이크를 간소화하고 통합합니다.
  • IBM Cloud 관리형 서비스를 사용하여 복잡한 하이브리드 IT 관리를 간소화합니다.

IBM Cloud 계정으로 지금 시작하세요.