클라우드/Docker

00. Docker의 개요 및 소개

코딩 펭귄 2022. 2. 18. 12:15

Docker의 역사

도커는 2013년 3월 산타클라라에서 열린 Pycon Conference에서 dotCloud의 창업자인 솔로만 하익스가 the future of Linux Containers라는 세션을 발표하며 오픈 소스로 출시되었습니다. 

 

Docker 소개

도커는 Go로 작성된 리눅스 기반의 Container RunTime 오픈소스입니다. 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고, 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 합니다.

 

컨테이너(Container)란 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상 머신(Virtual Machine)과 유사하기 때문에 자주 비교되는데, 가상머신보다 경량화된 형태이며 리눅스 커널이 작동하는 곳이라면 어느 곳에서든 작동합니다.

 

가상머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용합니다. 일종의 x86 하드웨어를 가상화한 것이라고 할 수 있습니다. 따라서 사용법이 간단하지만 무겁고 느린 단점이 있습니다. 가상머신의 성능상 단점을 해결하기 위해 프로세스를 격리하는 방식이 등장하였는데, 이것이 리눅스 컨테이너입니다. 프로젝트를 격리하는 방식이기 때문에 성능상 손실이 적습니다. 이러한 리눅스 컨테이너 기술을 기반으로 만들어진 것이 도커입니다.

 

VM과 Docker의 구조 (출처: http://wildpup.cafe24.com/archives/645)

 

도커는 OS 자원을 호스트와 공유하며, 프로세스처럼 작동합니다. 하드웨어를 추상화하지 않기 때문에 매우 가벼워 하나의 서버나 가상 머신이 여러 컨테이너를 동시에 구동할 수 있습니다. 

 

도커는 LXC(Linux Container)를 기반으로 시작해 0.9 버전에서는 libcontainer를 사용하였고, 1.11 버전부터는 runc를 사용합니다.

libcontainer : 리눅스 커널이 제공하는 가상화를 직접 사용할 수 있게 해 주는 컨테이너 라이브러리

runc : OCI(Open Container Initiative) 런타임 표준을 준수하는 컨테이너를 생성 및 실행하기 위한 툴

 

이미지(image)

도커에서는 개발 환경을 구축하기 위해 이미지를 사용합니다. 이미지란 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태값을 가지지 않고, 변하지 않습니다. 이미지가 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 의존성 파일을 컴파일하거나 별도의 파일을 설치하지 않아도 됩니다.

 

사용자는 각 애플리케이션의 공식 이미지인 Base Image를 사용하여 프로그램, 라이브러리, 소스를 설치한 후 Docker Image를 생성해 사용할 수 있습니다. Base Image는 DockerHub를 통해 제공되며, 사용자가 생성한 이미지도 DockerHub를 통해 버전 관리 및 배포가 가능합니다.

 

도커 이미지 (출처: https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)

 

도커 파일은 도커 이미지를 만들기 위해 사용하는 명령 파일로 패키지, 의존성, 소스코드, 스크립트 등을 기록한 하나의 파일입니다. 자체 DSL(Domain-specific language) 언어를 이용하여 이미지 생성 과정을 적는 방식으로 작성합니다. 도커 이미지는 수정이 불가능하기 때문에 도커 파일을 수정하여 새로운 이미지를 생성합니다.

 

도커 컨테이너 생성 순서 (출처: https://teki.tistory.com/10)

 

레이어(Layer)

도커 이미지는 컨테이너 실행을 위한 모든 정보를 가지고 있기 때문에 용량이 매우 큽니다. 용량이 크기 때문에 기존 이미지에 추가적인 파일이 필요할 때마다 새로 모든 파일을 다운로드받는 것은 비효율적입니다. 따라서 도커는 레이어라는 개념을 사용합니다.

 

이미지는 여러 개의 읽기 전용(read only) 레이어로 구성되고, 파일이 추가되거나 생성되는 경우 새로운 레이어가 생성됩니다. 도커는 여러 개의 레이어를 묶어 하나의 파일 시스템으로 사용할 수 있게 합니다. 따라서 이미지와 레이어는 같은 의미로도 사용됩니다.

 

도커 레이어 (출처: https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)

 

컨테이너는 이미지 레이어에 읽기/쓰기(read-write) 레이어를 추가하는 것으로 실행됩니다. 변경된 부분이 읽기/쓰기 레이어에 작성됩니다. 따라서 최소한의 용량만 사용하게 됩니다. 이미지는 url 방식으로 관리하며 태그를 붙일 수 있습니다.