
Docker는 2013년, dotCloud의 Solomon Hykes와 그의 팀에 의해 처음 데모되었습니다. 이 데모는 2013년 PyCon에서 공개되었으며, "The future of Linux Containers"라는 주제로 소개되었습니다. 당시 팀은 오클랜드 항구에 들어오는 모든 컨테이너 선박을 보며,
“한 서버에서 다른 서버로 애플리케이션을 옮기는 것보다, 지구 반대편에서 자동차를 배송하는 것이 더 쉽다”
라는 사실을 인식하게 되었습니다. 이 경험은 그들에게 해결해야 할 문제처럼 다가왔습니다.
기존 시스템에서는 여러 애플리케이션을 구동하기 위해 다양한 패키지, 환경설정을 통일해야 했고, 이런 과정 속에서 패키지 끼리의 충돌이나 환경변수 충돌과 같은 문제가 많이 발생되어 시스템을 운영하기가 힘이 들었습니다.
이러한 문제점을 해결하기 위해 애플리케이션별로 환경변수와 패키지를 분리해 가상화시켜 구동하는 VM(Virtual Machine)이 나왔지만, VM은 Hypervisor를 이용해 Guest OS를 생성하기 때문에 환경 자체가 상당히 무거운 단점이 존재했습니다.
이러한 단점을 보완하기 위해 나온 것이 운영체제 단에서 가상화를 실행하는 container이며, container 기술을 편리하게 사용할 수 있도록 개발된 것이 Docker입니다.

Docker는 기존의 가상화 기술과 비교했을 때 몇 가지 큰 차이점과 장점을 가지고 있습니다. 이를 통해 서버 자원을 더 효율적으로 사용할 수 있고, 대규모 시스템을 보다 쉽게 관리할 수 있게 되었습니다.

기존의 가상화 기술인 가상머신은 하이퍼바이저(Hypervisor)를 이용해 하나의 호스트에서 여러 운영체제를 생성하여 사용하는 방식입니다. 각 운영체제는 가상 머신(Virtual Machine)이라는 독립적인 단위로 구분되며, 운영체제는 게스트 운영체제(Guest OS)라고 불립니다. 예를 들어, 우분투나 CentOS와 같은 운영체제가 게스트 운영체제로 사용됩니다.
하이퍼바이저는 각 운영체제를 생성하고 관리하는 역할을 하며, 각 게스트 운영체제는 다른 게스트 운영체제와 완전히 독립된 공간과 시스템 자원을 할당받습니다.
하지만 이러한 가상화 과정에서 성능 손실이 발생합니다. 가상머신은 운영체제뿐만 아니라 라이브러리, 커널 등 여러 시스템 요소를 모두 포함하기 때문에, 이미지 크기가 커집니다. 이로 인해 가상 머신 이미지는 수 기가바이트에 달할 수 있으며, 애플리케이션 배포 시 이 크기는 큰 부담이 될 수 있습니다.
- 하이퍼바이저를 통해 여러 개의 운영체제(게스트 OS)를 생성하고 관리합니다.
- 시스템 자원을 가상화하고 독립된 공간을 생성하는 과정에서 성능 손실이 발생합니다.
- 게스트 OS를 사용하기 위한 라이브러리, 커널 등을 포함하므로 배포 시 용량이 큽니다.

하이퍼바이저와 달리 컨테이너는 가상의 OS를 만드는 것은 아닙니다. 리눅스의 기본 기능인 chroot, 네임스페이스, cgroup을 활용하여 프로세스 단위로 격리된 환경을 생성합니다. 이 격리된 환경 덕분에 컨테이너는 독립적인 실행 공간을 제공하면서도 성능 손실이 거의 없습니다.
이러한 기술을 통해 도커는 하이퍼바이저 기반의 가상화 방식과 달리 커널을 공유하며, 전체 운영 체제를 가상화하지 않기 때문에 성능 손실이 매우 적습니다.
도커 컨테이너는 애플리케이션 실행에 필요한 라이브러리와 실행 파일만 포함합니다. 반면, 가상 머신은 전체 운영 체제와 필요한 모든 구성 요소를 포함하기 때문에 이미지 크기가 훨씬 더 큽니다. 그 결과 도커 이미지는 배포 시간이 빠르고, 이미지 용량도 대폭 줄어듭니다. 이는 애플리케이션 배포 및 업데이트를 더욱 신속하고 효율적으로 할 수 있게 합니다.
- 성능 손실 없음: 도커는 프로세스 단위로 격리되며 커널을 공유하여 성능 손실이 거의 없습니다.
- 작은 이미지 크기: 도커 이미지는 애플리케이션과 필수 라이브러리만 포함하므로 가상 머신보다 용량이 작습니다.
- 빠른 배포 속도: 도커 이미지는 크기가 작고, 배포 시간이 빨라 애플리케이션 배포가 더 효율적입니다.
도커(Docker)는 애플리케이션을 컨테이너(Container)라는 단위로 패키징하고 배포하며 실행할 수 있도록 도와주는 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것을 포함하는 가벼운, 독립적인 실행 환경을 제공합니다.

도커는 여러 구성 요소를 통해 컨테이너 환경을 제공하고 관리합니다. 각각의 구성 요소는 도커의 주요 기능을 구현하며, 아래와 같은 역할을 합니다.
역할: 도커 명령어를 실행하는 클라이언트입니다.
설명: 사용자가 터미널에서 입력하는 docker build, docker pull, docker run 등의 명령어를 처리하며, 이를 도커 데몬(Docker Daemon)에 전달합니다.
주요 특징:
역할: 도커가 실행되고 있는 서버를 의미합니다.
설명: 클라이언트와 데몬이 연결되어 있는 위치로, 컨테이너와 이미지를 생성 및 관리합니다.
주요 특징:
DOCKER_HOST를 통해 도커 데몬과 통신합니다.역할: 도커의 핵심 엔진입니다.
설명: 도커 명령어를 실제로 실행하며, 컨테이너 생성, 관리, 실행, 종료 등을 처리합니다. 도커 클라이언트와 통신하며, 컨테이너와 이미지의 생명 주기를 관리합니다.
주요 특징:
역할: 도커 이미지를 저장하고 관리하는 저장소입니다.
설명: 사용자는 이미지를 pull(가져오기) 하여 로컬에 다운로드하거나, 자신이 만든 이미지를 push(올리기) 하여 공유할 수 있습니다.
종류:
Public Registry:
Docker Hub: 가장 널리 사용되는 도커의 기본 공개 저장소.Private Registry:
1:N 관계:
운영체제와 프로세스의 관계:
컨테이너를 생성할 때 필요한 요소를 포함한 파일로, 가상 머신에서 사용하는 ISO 파일과 유사한 개념입니다. 여러 계층(Layer)으로 이루어진 읽기 전용 파일입니다.
컨테이너를 실행할 때 읽기 전용으로 사용됩니다. 레이어 구조를 통해 변경 사항이 생기면 해당 레이어만 추가하면 되기 때문에 이미지를 업데이트하거나 배포할 때 효율적입니다.
[저장소 이름]/[이미지 이름]:[태그] 형식으로 구성됩니다.
Docker File → Docker Image
docker build 명령어를 사용하면 Docker File을 기반으로 도커 이미지를 생성할 수 있습니다.Docker Image → Docker Container
docker run 명령어를 통해 이미지를 실행하면, 독립적인 환경을 가진 Docker Container가 생성됩니다.도커 컨테이너는 도커 이미지로부터 생성됩니다. 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일과 설정이 포함된 독립된 공간(프로세스)이 생성되며, 이 공간은 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있습니다.
대부분 도커 컨테이너는 생성 시 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 포함하여 사용됩니다.
컨테이너는 이미지로부터 생성되며, 이미지를 읽기 전용으로 사용합니다. 이미지 변경 사항은 컨테이너에 영향을 주지 않으며, 컨테이너에서 이루어진 작업은 원래 이미지에 반영되지 않습니다.
각 컨테이너는 독립된 파일 시스템을 가지며, 호스트와 격리되어 있습니다. 특정 컨테이너에서 소프트웨어를 설치하거나 삭제해도 다른 컨테이너 및 호스트에는 영향을 미치지 않습니다.
예를 들어보면 같은 도커 이미지 A로 컨테이너 A, B를 생성했다고 가정합니다. 컨테이너 A를 수정해도 컨테이너 B에는 영향을 주지 않습니다. 컨테이너는 서로 독립적으로 동작하며, 서로의 변경 사항을 공유하지 않습니다.