도커 (소프트웨어)

섬네일|이전 로고

**도커**(Docker)는 운영체제 수준 가상화를 사용하여 컨테이너라고 불리는 패키지로 소프트웨어를 전달하는 일련의 서비스형 제품군이다. 도커는 경량 컨테이너 내에서 애플리케이션의 배포를 자동화하여, 서로 다른 컴퓨팅 환경에서도 일관되게 실행될 수 있도록 지원한다.

이러한 컨테이너를 실행하고 관리하는 핵심 소프트웨어를 **도커 엔진**(Docker Engine)이라고 한다. 도커는 2013년에 처음 출시되었으며 도커사(Docker, Inc.)에 의해 지속적으로 개발되고 있다. 이 플랫폼은 무료 및 유료 계층을 모두 포함한다.

## 역사

솔로몬 하익스(Solomon Hykes)는 서비스형 플랫폼 회사인 dotCloud 내의 내부 프로젝트로서 프랑스에서 도커 프로젝트를 시작했다.

dotCloud Inc.는 카멜 포나디(Kamel Founadi), 하익스, 세바스찬 팔(Sebastien Pahl)에 의해 설립되었으며, 2010년 여름 와이 콤비네이터 스타트업 인큐베이터 그룹에 참여하여 2011년에 출시되었고, 2013년에 Docker Inc로 사명을 변경했다.

도커는 2013년 샌타클래라에서 열린 PyCon에서 대중에게 처음 공개되었다. 2013년 3월에 오픈 소스로 출시되었다. 당시에는 기본 실행 환경으로 LXC를 사용했다. 1년 후 0.9 버전 출시와 함께 도커는 LXC를 Go 프로그래밍 언어로 작성된 자체 구성 요소인 libcontainer로 교체했다.

2017년, 도커는 개방형 연구 및 개발을 위해 모비 프로젝트(Moby project)를 창설했다.

### 도입

* 2013년 9월 19일: 레드햇과 도커는 페도라, 레드햇 엔터프라이즈 리눅스(RHEL) 및 오픈시프트를 중심으로 한 협업을 발표했다.
* 2014년 10월 15일: 마이크로소프트는 윈도우 서버에 도커 엔진을 통합하고 윈도우에서 도커 클라이언트 역할을 기본적으로 지원한다고 발표했다.
* 2014년 11월: 아마존 일래스틱 컴퓨트 클라우드(EC2)를 위한 도커 컨테이너 서비스가 발표되었다.
* 2014년 11월 10일: 도커는 Stratoscale과의 파트너십을 발표했다.
* 2014년 12월 4일: IBM은 도커가 IBM 클라우드와 더 밀접하게 통합될 수 있도록 하는 전략적 파트너십을 발표했다.
* 2015년 6월 22일: 도커와 여러 기업들은 소프트웨어 컨테이너를 위한 새로운 벤더 및 운영체제 독립적 표준을 작업 중이라고 발표했다.
* 2015년 12월: 오라클 클라우드는 도커 컨테이너 스타트업인 StackEngine을 인수한 후 도커 컨테이너 지원을 추가했다.
* 2016년 4월: 독립 소프트웨어 개발 판매 회사인 Windocks는 도커 오픈 소스 프로젝트의 윈도우 포트 버전을 출시하여 윈도우 서버 2012 R2 및 서버 2016, 그리고 SQL 서버 2008 이후의 모든 에디션을 지원했다.
* 2016년 5월: 분석에 따르면 도커의 주요 기여자 조직은 도커 팀, 시스코, 구글, 화웨이, IBM, 마이크로소프트, 레드햇으로 나타났다.
* 2016년 6월 8일: 마이크로소프트는 이제 윈도우 10에서 도커를 기본적으로 사용할 수 있다고 발표했다.
* 2017년 1월: 링크드인 프로필 언급 분석 결과, 2016년에 도커의 존재감이 160% 성장한 것으로 나타났다.
* 2019년 5월 6일: 마이크로소프트는 리눅스용 윈도우 하위 시스템(WSL)의 두 번째 버전을 발표했다. Docker, Inc.는 WSL 2에서 실행되는 윈도우용 도커 버전 작업을 시작했다고 발표했다. 특히 이는 도커가 (하이퍼-V를 사용했기 때문에 이전에 윈도우 프로 및 엔터프라이즈로 제한되었던 것과 달리) 윈도우 10 홈 에디션에서도 실행될 수 있음을 의미했다.
* 2020년 8월: 마이크로소프트는 윈도우 10 버전 1903 및 1909에 대한 WSL2 백포트를 발표했으며(이전에는 버전 2004에서만 가능했음), 도커 개발자들은 이 플랫폼들을 위한 도커의 가용성을 발표했다.
* 2021년 8월: 윈도우 및 MacOS용 도커 데스크톱(Docker Desktop)이 기업 사용자에게 더 이상 무료로 제공되지 않게 되었다. 도커는 대규모 기업 고객에 대한 무료 도커 데스크톱 사용을 종료하고 무료 플랜을 퍼스널 플랜으로 교체했다. 리눅스 배포판의 도커 엔진은 영향을 받지 않았다.
* 2023년 12월: 도커는 테스트 역량을 확장하기 위해 AtomicJar를 인수했다.

## 설계
섬네일|도커는 리눅스 커널의 가상화 기능에 접근하기 위해 다양한 인터페이스를 사용할 수 있다.

컨테이너는 서로 격리되어 있으며 자체 소프트웨어, 라이브러리 및 설정 파일을 번들로 포함한다. 이들은 잘 정의된 채널을 통해 서로 통신할 수 있다. 모든 컨테이너가 단일 운영체제 커널의 서비스를 공유하기 때문에 가상 머신보다 적은 리소스를 사용한다.

도커는 애플리케이션과 그 종속성을 가상 컨테이너에 패키징할 수 있으며, 이는 원칙적으로 모든 리눅스, 윈도우 또는 MacOS 컴퓨터에서 실행될 수 있다. 이를 통해 애플리케이션은 온프레미스, 퍼블릭 클라우드(분산 컴퓨팅 등 참조) 또는 프라이빗 클라우드와 같은 다양한 위치에서 실행될 수 있다. 리눅스에서 실행될 때 도커는 리눅스 커널의 리소스 격리 기능(Cgroups 및 커널 네임스페이스)과 유니온 마운트 기능이 있는 파일 시스템(OverlayFS 등)을 사용하여 단일 리눅스 인스턴스 내에서 컨테이너가 실행되도록 함으로써 가상 머신을 시작하고 유지 관리하는 오버헤드를 방지한다. MacOS의 도커는 리눅스 가상 머신을 사용하여 컨테이너를 실행한다.

도커 컨테이너는 가볍기 때문에 단일 서버나 가상 머신에서 여러 컨테이너를 동시에 실행할 수 있다. 2018년 분석에 따르면 일반적인 도커 사용 사례는 호스트당 8개의 컨테이너를 실행하며, 분석된 조직의 4분의 1은 호스트당 18개 이상을 실행하는 것으로 나타났다. 또한 라즈베리 파이와 같은 싱글 보드 컴퓨터에도 설치할 수 있다.

리눅스 커널의 네임스페이스 지원은 프로세스 트리, 네트워크, 사용자 ID 및 마운트된 파일 시스템을 포함한 애플리케이션의 운영 환경 보기를 대부분 격리하며, 커널의 cgroups는 메모리 및 CPU에 대한 리소스 제한을 제공한다. 0.9 버전부터 도커는 libvirt, LXC 및 systemd-nspawn을 통한 추상화된 가상화 인터페이스 사용 외에도 리눅스 커널이 직접 제공하는 가상화 기능을 사용하기 위해 자체 구성 요소(라고 함)를 포함한다.

도커는 프로세스를 격리하여 실행하는 경량 컨테이너를 제공하기 위해 고수준 API를 구현한다.

## 구성 요소

서비스형 소프트웨어로 제공되는 도커 제품은 세 가지 구성 요소로 이루어진다.

; 소프트웨어: `dockerd`라고 불리는 도커 데몬은 도커 컨테이너를 관리하고 컨테이너 객체를 처리하는 상주 프로세스이다. 데몬은 도커 엔진 API를 통해 전송되는 요청을 수신한다. `docker`라고 불리는 도커 클라이언트 프로그램은 사용자가 도커 데몬과 상호 작용할 수 있도록 하는 명령줄 인터페이스(CLI)를 제공한다.
; 객체(Objects): 도커 객체는 도커에서 애플리케이션을 조립하는 데 사용되는 다양한 엔티티이다. 도커 객체의 주요 클래스는 이미지, 컨테이너, 서비스이다.
** 도커 컨테이너는 애플리케이션이 실행되는 표준화되고 캡슐화된 환경이다. 컨테이너는 도커 API 또는 CLI를 사용하여 관리된다.
** 도커 이미지는 컨테이너를 빌드하는 데 사용되는 읽기 전용 템플릿이다. 이미지는 애플리케이션을 저장하고 전달하는 데 사용된다.
** 도커 서비스는 여러 도커 데몬에 걸쳐 컨테이너를 확장할 수 있게 해준다. 그 결과는 스웜(swarm)이라 불리며, 도커 API를 통해 통신하는 협력하는 데몬들의 집합이다.
; 레지스트리(Registries): 도커 레지스트리는 도커 이미지의 저장소이다. 도커 클라이언트는 레지스트리에 연결하여 사용할 이미지를 다운로드("pull")하거나 빌드한 이미지를 업로드("push")한다. 레지스트리는 공개 또는 비공개일 수 있다. 주요 공개 레지스트리는 도커 허브(Docker Hub)이다. 도커 허브는 도커가 이미지를 찾는 기본 레지스트리이다. 도커 레지스트리는 이벤트를 기반으로 한 알림 생성 기능도 제공한다.

Dockerfile은 도커 컨테이너의 여러 측면(예: 리눅스 배포판, 프로그래밍 언어 런타임 환경의 설치 명령, 애플리케이션 소스 코드 등)을 지정하는 텍스트 파일이다.

Dockerfile의 예시:
```dockerfile
ARG CODE_VERSION=latest
FROM ubuntu:${CODE_VERSION}
COPY ./examplefile.txt /examplefile.txt
ENV MY_ENV_VARIABLE="example_value"
RUN apt-get update

# 도커 볼륨으로부터 디렉터리 마운트
# 참고: 이는 보통 'docker run' 명령에서 지정됨.
VOLUME ["/myvolume"]

# 포트 노출 (SSH의 경우 22)
EXPOSE 22
```


도커 컴포즈(Docker Compose)는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구이다. YAML 파일을 사용하여 애플리케이션의 서비스를 구성하며, 단일 명령으로 모든 컨테이너의 생성 및 시작 프로세스를 수행한다. `docker compose` CLI 유틸리티를 통해 사용자는 이미지 빌드, 컨테이너 확장, 정지된 컨테이너 실행 등 여러 컨테이너에 대해 동시에 명령을 실행할 수 있다. 이미지 조작이나 사용자 대화형 옵션과 관련된 명령은 단일 컨테이너를 다루기 때문에 도커 컴포즈에서는 관련이 없다. `docker-compose.yml` 파일은 애플리케이션의 서비스를 정의하는 데 사용되며 다양한 구성 옵션을 포함한다. 예를 들어, `build` 옵션은 Dockerfile 경로와 같은 구성 옵션을 정의하며, `command` 옵션은 기본 도커 명령을 재정의할 수 있게 해준다. 도커 컴포즈의 첫 번째 공개 베타 버전(0.0.1)은 2013년 12월 21일에 출시되었다. 첫 번째 프로덕션 지원 버전(1.0)은 2014년 10월 16일에 공개되었다.

도커 스웜(Docker Swarm)은 도커 컨테이너를 위한 네이티브 클러스터링 기능을 제공하여, 도커 엔진 그룹을 하나의 가상 도커 엔진으로 변환한다. 도커 1.12 이상에서는 스웜 모드가 도커 엔진에 통합되어 있다. `docker swarm` CLI 유틸리티를 통해 사용자는 스웜 컨테이너 실행, 검색 토큰 생성, 클러스터 노드 목록 표시 등을 수행할 수 있다. `docker node` CLI 유틸리티를 사용하면 스웜 내의 노드 목록 표시, 노드 업데이트, 스웜에서 노드 제거 등 노드 관리를 위한 다양한 명령을 실행할 수 있다. 도커는 합의 알고리즘인 Raft를 사용하여 스웜을 관리한다. Raft에 따르면 업데이트가 수행되려면 스웜 노드의 과반수가 업데이트에 동의해야 한다. `docker swarm` CLI 외에도 `docker stack`은 더 큰 유연성을 가지고 스웜 서비스를 관리하기 위해 설계된 도구이다. 이는 `docker-compose.yml`과 매우 유사한 설정 파일을 사용할 수 있다. `docker compose` 대신 `docker stack`을 사용하면 여러 머신에 걸쳐 스웜 클러스터를 관리하거나, 원격 호스트에서 도커 명령을 실행하여 원격 컨테이너 관리를 가능하게 하는 `docker context`와 결합된 `docker secret`을 사용하는 등의 이점이 있다.

도커 볼륨(Docker Volume)은 데이터의 독립적인 영속성을 용이하게 하여 컨테이너가 삭제되거나 다시 생성된 후에도 데이터가 유지될 수 있도록 한다.

## 라이선스 모델

* 도커 엔진은 아파치 라이선스 2.0에 따라 라이선스가 부여된다. 도커 데스크톱은 GNU 일반 공중 사용 허가서에 따라 라이선스가 부여된 일부 구성 요소를 배포한다. 도커 데스크톱은 대기업에게는 무료가 아니다.
* Dockerfile 파일 자체는 오픈 소스 라이선스에 따라 라이선스가 부여될 수 있다. 이러한 라이선스 선언의 범위는 Dockerfile에만 해당하며 컨테이너 이미지에는 해당하지 않는다.

## 같이 보기
* 데브옵스
* 마이크로서비스
* 서비스 컴포넌트 아키텍처

## 각주
; 내용주

; 참조주

## 외부 링크
* 
* 

분류:자유 소프트웨어
분류:운영체제 보안
분류:컨테이너화 소프트웨어
분류:운영체제 기술
분류:자유 가상화 소프트웨어
분류:Go로 작성된 자유 소프트웨어
분류:아파치 라이선스 소프트웨어