도커 개요

도커 문서의 일부를 번역/정리합니다. 원문

도커의 기본적인 소개, 기반 기술에 대해 간단히 알아봅니다.

도커 개요

도커는 애플리케이션을 개발, 배포, 실행하기 위한 오픈 플랫폼입니다. 도커는 애플리케이션을 인프라와 분리함으로써 소프트웨어를 빠르게 배포할 수 있도록 합니다. 도커를 활용하여 애플리케이션을 관리하는 것과 같은 방법으로 인프라를 관리할 수 있습니다. 코드를 빠르게 전달, 테스트, 배포하기 위한 도커의 방법론의 이점을 이용하면, 코드를 작성하고 이를 프로덕션에서 실행하는 데 걸리는 시간을 크게 줄일 수 있습니다.

도커 플랫폼

도커는 컨테이너라 불리는 느슨하게 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 능력을 제공합니다. 이 격리와 보안성은 주어진 호스트에서 동시에 많은 컨테이너를 실행할 수 있게 합니다. 컨테이너는 하이퍼바이저에 의한 부하 없이 호스트 머신의 커널에서 직접 실행되기 때문에 가볍습니다. 이는 주어진 하드웨어 조합으로 가상 머신을 이용할 때보다 더 많은 컨테이너를 실행할 수 있다는 뜻입니다. 심지어 도커 컨테이너를 가상 머신 호스트에서도 실행할 수 있습니다.

도커는 컨테이너의 수명 주기를 관리하기 위한 도구와 플랫폼을 제공합니다:

  • 컨테이너를 사용하여 애플리케이션과 지원 컴포넌트를 개발하세요.
  • 컨테이너는 애플리케이션의 배포와 테스팅 단위가 됩니다.
  • 준비가 되면, 애플리케이션을 컨테이너 혹은 오케스트레이트된 서비스로 프로덕션 환경에 배포하세요. 이는 프로덕션 환경이 로컬 데이터센터든, 클라우드 제공자든, 혹은 둘은 혼합해도 동일하게 동작합니다.

도커 엔진

*도커 엔진*은 다음과 같은 주요 컴포넌트를 가진 클라이언트-서버 애플리케이션입니다:

  • 데몬 프로세스라 불리는 항상 실행중인 서버(dockerd 명령).
  • 데몬과 대화하고 명령을 내리기 위한 인터페이스를 정의하는 REST API.
  • 커맨드 라인 인터페이스(CLI) 클라이언트(docker 명령).

CLI는 도커 REST API를 사용하여 스크립트나 CLI 명령을 통해 도커 데몬을 제어하거나 상호작용합니다. 많은 다른 도커 애플리케이션들이 이 기반 API와 CLI를 사용합니다.

데몬은 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 *객체*를 만들고 관리합니다.

참고: 도커는 오픈 소스 아파치 2.0 라이센스입니다.

도커 아키텍처

도커는 클라이언트-서버 아키텍처를 사용합니다. 도커 클라이언트는 도커 컨테이너의 빌드, 실행, 배포와 같은 작업을 수행하는 도커 데몬과 대화합니다. 도커 클라이언트와 데몬은 같은 시스템에서 실행하거나, 도커 클라이언트를 원격 도커 데몬에 연결할 수 있습니다. 도커 클라이언트와 데몬은 REST API를 사용하여 UNIX 소켓 혹은 네트워크 인터페이스를 통해 통신합니다.

도커 아키텍처

도커 데몬

도커 데몬(dockerd) 도커 API 요청을 기다리고 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 객체를 관리합니다. 또한 데몬은 도커 서비스를 관리하기 위해 다른 데몬들과 통신할 수도 있습니다.

도커 클라이언트

도커 클라이언트(docker)는 많은 도커 사용자들이 도커와 상호작용하는 주된 방법입니다. docker run과 같은 명령을 사용하면, 클라이언트는 명령을 처리할 dockerd에 이러한 명령을 보냅니다. docker 명령은 도커 API를 사용합니다. 도커 클라이언트는 하나 이상의 데몬과 통신할 수 있습니다.

도커 레지스트리

도커 *레지스트리*는 도커 이미지를 저장합니다. 도커 허브(Docker Hub)는 누구나 사용할 수 있는 공개 레지스트리이며, 도커는 기본적으로 도커 허브에서 이미지를 조회하도록 설정되어 있습니다. 개인 레지스트리를 직접 운영할 수도 있습니다.

docker pull이나 docker run 명령을 사용하면, 필요한 이미지를 설정된 레지스트리에서 가져옵니다. docker push 명령을 사용하면, 이미지를 설정된 레지스트리에 푸시합니다.

도커 객체

도커를 사용할 때, 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체들을 생성하고 사용합니다. 여기서는 이러한 객체들의 개요만 살펴봅니다.

이미지

*이미지*는 도커 컨테이너를 생성하기 위한 명령어들의 읽기 전용 템플릿입니다. 보통, 이미지는 다른 이미지에 기반합니다. 예를 들어, ubuntu 이미지를 기반으로 하지만 애플리케이션을 실행하는 데 필요한 세부 설정 뿐만 아니라 아파치 웹 서버와 애플리케이션을 설치하는 이미지를 빌드할 수 있습니다.

이미지를 직접 생성하거나 다른 사람이 만들어 레지스트리에 게시한 이미지만을 사용할 수도 있습니다. 이미지를 직접 빌드하려면, 이미지를 생성하고 실행하는 데 필요한 단계들을 정의하는 간단한 구문들로 *도커파일(Dockerfile)*을 만듭니다. 도커파일의 각 명령어는 이미지에 레이어를 만듭니다. 도커파일을 변경하고 이미지를 다시 빌드하면, 변경된 레이어만 다시 빌드됩니다. 이는 이미지를 다른 가상화 기술들과 비교하여 가볍고, 작고, 빠르게 만드는 특성 중 하나입니다.

컨테이너

컨테이너는 이미지의 실행 가능한 인스턴스입니다. 도커 API 혹은 CLI를 통해 컨테이너를 생성, 시작, 정지, 이동하거나 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나, 스토리지를 붙이거나 심지어 현재 상태를 기반으로 새로운 이미지를 생성할 수도 있습니다.

기본적으로 컨테이너는 다른 컨테이너와 호스트로부터 상대적으로 잘 격리됩니다. 컨테이너의 네트워크, 스토리지 또는 다른 기반 서브시스템들이 다른 컨테이너 혹은 호스트 머신으로부터 얼마나 격리되는지를 제어할 수 있습니다.

컨테이너는 자신의 이미지 뿐만 아니라 생성하거나 시작할 때 제공하는 설정 옵션에 따라서도 정의됩니다. 컨테이너가 제거되면, 영속 스토리지에 저장되지 않은 상태 변경은 사라집니다.

서비스

서비스는 컨테이너를 여러 매니저와 워커들과 함께 *스웜(swarm)*으로서 동작하는 여러 도커 데몬 사이에서 스케일링할 수 있게 합니다. 스웜의 각 구성원은 도커 데몬이며, 데몬들은 모두 도커 API를 사용하여 통신합니다. 서비스는 어느 순간에도 사용 가능해야 하도록 서비스의 복제본(replica)의 숫자와 같이, 원하는 상태(desired state)를 정의하도록 합니다. 기본적으로 서비스는 워커 노드 사이에서 로드밸런스됩니다. 소비자에게 도커 서비스는 하나의 애플리케이션으로 보입니다. 도커 엔진은 도커 1.12 이상부터 스웜 모드를 지원합니다.

기반 기술

도커는 Go로 작성됐으며, 기능을 위해 리눅스의 일부 기능을 활용합니다.

네임스페이스(Namespaces)

도커는 *컨테이너*라 불리는 격리된 작업공간을 제공하기 위해 namespaces라고 불리는 기술을 이용합니다. 컨테이너를 실행하면, 도커는 컨테이너를 위한 네임스페이스의 집합을 만듭니다.

이러한 네임스페이스는 격리 계층을 제공합니다. 컨테이너의 각 관점(aspect)는 별개의 네임스페이스에서 실행되며 접근 또한 해당 네임스페이스로 제한됩니다.

도커 엔진은 리눅스의 다음 네임스페이스를 사용합니다:

  • pid 네임스페이스: 프로세스 격리(PID: Process id).
  • net 네임스페이스: 네트워크 인터페이스 관리(NET: Networking).
  • ipc 네임스페이스: IPC 리소스에 대한 접근 관리(IPC: InterProcess COmmunication).
  • mnt 네임스페이스: 파일시스템 마운트 지점 관리(MNT: Mount).
  • uts 네임스페이스: 커널과 버전 식별자 격리(UTS: Unix Timesharing System).

제어 그룹(Control groups)

리눅스의 도커 엔진은 또한 *제어 그룹(cgroups)*이라는 또다른 기술에도 의존합니다. cgroup은 애플리케이션을 특정 리소스 집합에 대해 제한합니다. 제어 그룹은 도커 엔진이 사용 가능한 하드웨어 리소스를 컨테이너와 공유하고 선택적으로 제한을 걸기도 합니다. 예를 들어, 특정 컨테이너가 사용 가능한 메모리를 제한할 수 있습니다.

유니언 파일 시스템(Union File Systems)

유니언 파일 시스템 또는 UnionFS는 레이어를 생성하여 매우 가볍고 빠르게 동작하는 파일 시스템입니다. 도커 엔진은 컨테이너를 위한 빌딩 블럭을 제공하는 데에 UnionFS를 사용합니다. 도커 엔진은 AUFS, btrfs, vfs 및 DeviceMapper를 포함하여 여러 종류의 UnionFS를 사용합니다.

컨테이너 포맷

도커 엔진은 네임스페이스, 제어 그룹 및 UnionFS를 컨테이너 포맷이라고 하는 래퍼(wrapper)로 조합하여 사용합니다. 기본 컨테이너 포맷은 libcontainer입니다. 앞으로 도커는 BSD Jails 혹은 Solaris Zones와 같은 기술들과 통합함으로써 다른 컨테이너 포맷들을 지원할 수도 있습니다.

목록으로