Docker란?
Docker는 컨테이너형 애플리케이션의 빌드, 배포 및 관리를 위한 오픈 소스 플랫폼입니다.
IBM 뉴스레터 구독
검정 및 파랑 배경
Docker란?

Docker는 개발자가 컨테이너를 빌드, 배포, 실행, 업데이트, 관리할 수 있는 오픈 소스 플랫폼입니다. 컨테이너란 표준화되고 실행 가능한 구성요소로 애플리케이션 소스 코드와 이 코드를 임의의 환경에서 실행하는 데 필요한 운영 체제(OS) 라이브러리 및 종속 항목을 조합한 것입니다.

컨테이너를 활용하면 분산형 애플리케이션을 간편하게 개발하고 제공할 수 있습니다. 기업에서 클라우드 네이티브 개발 및 하이브리드 멀티클라우드 환경으로 전환함에 따라 컨테이너가 더욱 널리 사용되고 있습니다. 개발자가 Docker 없이 컨테이너를 생성하는 것도 가능합니다. Linux 및 기타 운영 체제에서 기본 제공하는 기능을 직접 사용하면 됩니다. 하지만 Docker는 더 빠르고 편리하며 안전한 컨테이너화를 지원합니다. 이 글이 작성되는 시점 기준으로 1,300여 명의 개발자가 Docker 플랫폼을 사용하는 중입니다(ibm.com 외부 링크).

Docker가 Docker, Inc.(ibm.com 외부 링크)를 의미할 때도 있습니다. 이곳은 Docker 상업용 버전을 판매하는 회사입니다. 그리고 Docker, Inc.를 비롯하여 많은 조직과 개인이 참여하는 Docker 오픈 소스 프로젝트를 가리키기도 합니다.

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

컨테이너는 Linux 커널에서 기본 제공하는 프로세스 격리 및 가상화 기능에 의해 실현됩니다. 여러 프로세스에 리소스를 할당하는 컨트롤 그룹(Cgroups), 어떤 프로세스에서 시스템의 다른 리소스나 영역을 보거나 액세스하는 것을 제한하는 네임스페이스 등과 같은 이러한 기능 덕분에 여러 애플리케이션 구성 요소에서 호스트 운영 체제 단일 인스턴스의 리소스를 공유하는 것이 가능합니다. 이는 하이퍼바이저를 통해 여러 가상 머신(VM)이 단일 하드웨어 서버의 CPU, 메모리, 기타 리소스를 공유하는 방식과 매우 비슷합니다. 

따라서 컨테이너 기술은 VM의 모든 기능 및 이점(애플리케이션 격리, 비용 효과적인 확장성, 삭제 가능성)과 함께 다음과 같이 중요한 장점도 추가로 제공합니다.

  • 경량화: 컨테이너는 VM과 달리 OS 인스턴스 및 하이퍼바이저 전체의 페이로드를 포함하지 않습니다. 코드를 실행하는 데 필요한 OS 프로세스 및 종속 항목만 있습니다. (일부 VM은 GB 단위인 것과 달리) 컨테이너 크기는 메가바이트(MB) 단위입니다. 따라서 하드웨어 용량을 더 효과적으로 활용하고 구동 시간도 단축할 수 있습니다. 

  • 개발자 생산성 향상: 컨테이너형 애플리케이션은 한 번 만든 다음 어디서나 실행할 수 있습니다. 컨테이너는 VM보다 더 빠르고 쉽게 배포하고, 프로비저닝 및 재시작할 수 있습니다. 따라서 CI/CD(Continuous Integration and Continuous Delivery) 파이프라인에서 사용하기에 안성맞춤입니다. 그리고 애자일 및 DevOps 프랙티스를 채택하는 개발 팀에 더욱 효과적입니다.

  • 리소스 효율성 향상: 컨테이너를 사용하면 개발자가 같은 하드웨어에서 VM을 사용하면서 애플리케이션의 사본을 원하는 수만큼 여러 번 실행할 수 있습니다. 이러한 방법으로 클라우드 지출을 줄일 수 있습니다.

컨테이너를 사용하는 기업에서는 애플리케이션 품질이 향상되고 시장 변화에 더 신속한 대응이 이루어지는 등 다양한 이점을 누리고 있습니다. 아래의 대화식 툴을 사용하여 자세히 알아보세요. 

전체 보고서 다운로드: 엔터프라이즈의 컨테이너(PDF, 1.4MB)
Docker를 사용하는 이유

지금은 Docker가 널리 보급되었기 때문에 "Docker"와 "컨테이너"가 같은 의미로 쓰이곤 합니다. 하지만 최초의 컨테이너 관련 기술은 오래 전에 등장했습니다. 심지어 Docker가 2013년에 일반 출시되기 수십 년 전부터(IBM 외부 링크) 있었습니다. 

특히 주목할 점으로, 2008년에 LinuXContainers(LXC)가 Linux 커널에 구현되었는데, Linux의 단일 인스턴스에 대한 가상화를 완벽히 지원했습니다. LXC가 아직도 쓰이고 있으나, Linux 커널을 활용하는 최신 기술도 등장했습니다. 현대적인 오픈 소스 Linux 운영 체제인 Ubuntu도 이 기능을 제공합니다. 

Docker는 개발자가 간단한 명령으로 이러한 네이티브 컨테이너화 기능을 사용할 수 있도록 지원하며 간편한 애플리케이션 프로그래밍 인터페이스(API)를 통해 자동화합니다. Docker는 LXC와 비교되는 다음과 같은 특징이 있습니다.

  • 더 뛰어나고 완전한 컨테이너 이동성: LXC 컨테이너는 대개 시스템별 구성을 참조합니다. 이와 달리 Docker 컨테이너는 수정 없이 어떤 데스크탑이나 데이터 센터, 클라우드 환경에서도 실행됩니다. 
  • 경량화, 업데이트 세분화: LXC를 사용하는 경우 단일 컨테이너 내에 여러 개의 프로세스를 조합할 수 있습니다. 그러면 어떤 애플리케이션을 빌드한 다음 업데이트하거나 문제 해결을 위해 그 파트 중에 하나를 중단하더라도 애플리케이션 자체는 계속 실행할 수 있게 됩니다. 

     

  • 컨테이너 생성 자동화: Docker에서는 애플리케이션 소스 코드를 기반으로 컨테이너를 자동으로 빌드할 수 있습니다. 

     

  • 컨테이너 버전 관리: Docker에서는 컨테이너 이미지의 여러 버전을 관리하고, 이전 버전으로 롤백하고, 버전을 빌드한 사용자와 그 방법까지 추적할 수 있습니다. 기존 버전과 새 버전의 차이점만 업로드하는 것도 가능합니다. 

     

  • 컨테이너 재사용: 기존 컨테이너를 기본 이미지로, 특히 새 컨테이너를 빌드할 때 템플리트처럼 사용할 수 있습니다. 

     

  • 공유 컨테이너 라이브러리: 개발자는 사용자들이 제공한 수천 개의 컨테이너가 있는 오픈 소스 레지스트리에 액세스할 수 있습니다. 

현재 Docker 컨테이너화 기술은 Microsoft Windows 및 Apple MacOS에서도 작동합니다. 개발자는 어떤 운영 체제에서도 Docker 컨테이너를 실행할 수 있습니다. 그리고 Amazon Web Services(AWS), Microsoft Azure, IBM Cloud를 비롯한 주요 클라우드 제공업체 대부분은 개발자가 Docker 기반 컨테이너형 애플리케이션을 빌드, 배포, 실행하도록 지원하는 서비스를 제공합니다.

Docker 툴 및 용어

Docker를 사용하는 개발자는 다음과 같은 툴, 용어, 기술을 접할 수 있습니다. 

DockerFile

모든 Docker 컨테이너는 Docker 컨테이너 이미지의 빌드 방법에 관한 지시사항이 포함된 단순 텍스트 파일로 시작합니다. DockerFile 은 Docker 이미지 생성 프로세스를 자동화합니다. 실제로는 Docker 엔진에서 이미지를 조합하기 위해 실행할 명령행 인터페이스(CLI) 명령어의 목록입니다. 이 Docker 명령어 목록은 방대하지만 표준화되어 있습니다. 즉, Docker 작업은 콘텐츠, 인프라, 기타 환경 변수에 상관없이 똑같은 방식으로 이루어집니다. 

Docker 이미지

Docker 이미지에는 실행 가능한 애플리케이션 소스 코드는 물론, 이 애플리케이션 코드가 컨테이너 형태로 실행되는 데 필요한 모든 툴, 라이브러리 및 종속 항목이 포함되어 있습니다. Docker 이미지를 실행하면 이는 컨테이너의 한 인스턴스(또는 여러 인스턴스)가 됩니다. 

Docker 이미지를 완전히 새로 빌드하는 것도 가능하지만, 대부분 개발자는 공통 저장소에서 해당 이미지를 가져옵니다. 단일 기본 이미지에서 여러 개의 Docker 이미지를 생성할 수 있는데, 이들은 해당 스택의 공통 요소를 공유합니다. 

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

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

Docker 컨테이너

Docker 컨테이너는 Docker 이미지의 현재 실행 중인 라이브 인스턴스입니다. Docker 이미지는 읽기 전용 파일이지만, 컨테이너는 현재 활성 상태이고 수명이 짧은 실행 가능 콘텐츠입니다. 사용자는 대화식으로 이 컨테이너를 사용할 수 있습니다. 관리자는 Docker 명령을 사용하여 설정과 조건을 조정할 수 있습니다. 

Docker 허브

Docker 허브(ibm.com 외부 링크)는 공용 Docker 이미지 저장소이며, "세계 최대 컨테이너 이미지 라이브러리 및 커뮤니티"로 자부합니다. 상용 소프트웨어 벤더, 오픈 소스 프로젝트, 개인 개발자 등이 제공한 10만 여 개의 컨테이너 이미지를 보유하고 있습니다. 여기에는 Docker, Inc.에서 제작한 이미지, Docker Trusted Registry에 속하는 인증된 이미지, 그 밖의 수천 개의 이미지가 포함됩니다. 

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

GitHub와 같은 다른 이미지 저장소도 있습니다. GitHub는 애플리케이션 개발 툴로 유명한 저장소 호스팅 서비스이며, 협업 및 커뮤니케이션을 강화하는 플랫폼이기도 합니다. Docker Hub 사용자는 저장소(repo)를 만들어 여러 이미지를 보관할 수 있습니다. 이 저장소는 공용 또는 전용으로 지정할 수 있으며, GitHub 또는 BitBucket 계정에 연결하는 것도 가능합니다. 

Docker 데스크탑

Docker 데스크탑(ibm.com 외부 링크)은 Docker Engine, Docker CLI 클라이언트, Docker Compose, Kubernetes 등을 포함하는 Mac 또는 Windows 애플리케이션입니다. 여기에는 Docker 허브에 대한 액세스도 포함됩니다. 

Docker 디먼

Docker 디먼은 클라이언트의 명령어를 사용하여 Docker 이미지를 생성하고 관리하는 서비스입니다. 사실상 Docker 디먼은 해당 Docker 구현에 대해 관제 센터의 역할을 합니다. Docker 디먼이 실행되는 서버를 Docker 호스트라고 합니다.

Docker 레지스트리

Docker 레지스트리는 확장형 오픈 소스 Docker 이미지 저장/배포 시스템입니다. 레지스트리를 사용하면 식별을 위한 태깅을 사용하여 저장소에서 이미지 버전을 추적할 수 있습니다. 이를 위해 버전 관리 툴인 git을 사용합니다. 

Docker 배치 및 오케스트레이션

단 몇 개의 컨테이너만 실행하는 경우에는 사실상 업계 표준 런타임인 Docker 엔진 내에서 애플리케이션을 관리하면 매우 간편합니다. 하지만 수천 개의 컨테이너 및 수백 개의 서비스를 배포하는 경우에는 전용 툴의 도움 없이 이 워크플로우를 관리하는 게 사실상 불가능합니다.

Docker 플러그인

Docker 플러그인(ibm.com 외부 링크)을 사용하면 Docker의 기능을 더욱 강화할 수 있습니다.Docker 엔진 플러그인 시스템에는 수많은 Docker 플러그인이 있으며, 써드파티 플러그인을 로드할 수도 있습니다. 

Docker Compose

개발자는 Docker Compose를 사용하여 멀티컨테이너 애플리케이션을 관리할 수 있습니다. 멀티컨테이너 애플리케이션이란 모든 컨테이너가 같은 Docker 호스트에서 실행되는 경우입니다. Docker Compose는 애플리케이션에 포함될 서비스를 지정하는 YAML(.YML) 파일을 생성합니다. 그리고 하나의 명령어로 컨테이너를 배포하고 실행할 수 있습니다. YAML 구문은 언어에 구애받지 않습니다. 따라서 Java, Python, Ruby, 기타 언어로 개발된 프로그램에서 YAML 파일을 사용할 수 있습니다. 

개발자는 스토리지를 위한 영구 볼륨을 정의하고, 기본 노드를 지정하고, 서비스 종속 항목을 문서화하고 구성하는 데에도 Docker Compose를 사용할 수 있습니다. 

Kubernetes

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

Kubernetes는 Google이 내부용으로 개발한 프로젝트에서 비롯된 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. Kubernetes는 컨테이너 배포, 업데이트, 서비스 감지, 스토리지 프로비저닝, 로드 밸런싱, 상태 모니터링 등을 포함하여 컨테이너 기반 아키텍처의 관리에 필수적인 태스크를 스케줄링하고 자동화합니다. 아울러  Istio,  Knative 등과 같은 Kubernetes를 위한 오픈 소스 툴 에코시스템을 활용함으로써 생산성이 뛰어난 컨테이너형 애플리케이션 PaaS(platform-as-a-service)를 배포하고 서버리스(serverless) 컴퓨팅을 향한 여정에 박차를 가할 수 있습니다.

Kubernetes 자세히 보기

관련 솔루션
Red Hat® OpenShift on IBM Cloud

Red Hat OpenShift on IBM Cloud는 속도, 시장 반응, 확장성 및 안정성을 위해 퍼블릭 및 하이브리드 환경에서 OpenShift를 활용합니다.

Red Hat OpenShift on IBM Cloud 살펴보기
IBM Cloud Satellite®

IBM Cloud Satellite®를 사용하면 온프레미스, 에지, 퍼블릭 클라우드 환경 등 어디서든 일관성 있는 클라우드 서비스를 실행할 수 있습니다.

IBM Cloud Satellite® 살펴보기
하이브리드 클라우드 스토리지 솔루션

온프레미스, 프라이빗 및 퍼블릭 클라우드에서 IBM 하이브리드 클라우드 스토리지 솔루션을 사용하여 애플리케이션과 서비스에 가장 알맞은 위치에 데이터를 저장합니다.

하이브리드 클라우드 스토리지 솔루션 살펴보기
클라우드 서비스

관리형 클라우드 서비스 접근 방식을 통해 전통적인 IT 관리와 DevOps 문화 간에 존재하는 잠재적인 긴장을 완화하는 방법에 대해 확인해 보세요.

클라우드 서비스 살펴보기
리소스 엔터프라이즈의 컨테이너

신규 IBM 연구 보고서에서는 컨테이너와 Kubernetes 채택의 급증하는 모멘텀을 설명합니다.

독립형 컨테이너를 사용하여 Kubernetes 또는 OpenShift 기반 모델 제공

독립형 컨테이너 이미지를 빌드하여 Watson NLP 모델을 제공한 다음 Kubernetes 또는 Red Hat OpenShift 클러스터에서 실행합니다.

다음 단계

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

Red Hat® OpenShift on IBM Cloud 살펴보기