본문 바로가기

Computer/Docker

Docker의 기능

반응형

Docker는 크게 1) 이미지를 만드는 build, 2) 이미지를 공유하는 ship, 3) 컨테이너를 작동시키는 run 의 세 가지 기능이 있습니다.

Docker build

Docker에서 build란 애플리케이션 실행에 필요한 프로그램 코드, 라이브러리, 미들웨어, 컴파일된 실행 파일 등을 묶어 이미지로 만드는 작업을 말합니다. 즉, 특정 프로세스 (애플리케이션)을 실행시키기 위한 모든 파일과 환경을 지닌 것으로 예를 들어 Ubuntu docker 이미지는 Ubuntu에 실행에 필요한 모든 파일을 가지고 있습니다. 이러한 도커 이미지로부터 컨테이너를 실행시키게 됩니다.

도커 이미지의 크기는 보통 작게는 수십 MB부터 수 GB가 넘지만 이는 VM에 비하면 굉장히 가볍습니다. 이미지는 상태값을 가지지 않고 변하지 않으며 하나의 이미지로부터 여러 개의 컨테이너를 생성할 수 있고 컨테이너가 삭제되더라도 이미지는 삭제되지 않습니다. 또한, docker 이미지는 tar 압축 파일로 출력할 수 있으며 소스와 함께 의존성 패키지 등 버젼 관리하기 쉽도록 명시된 Dockerfile이라는 도커 전용 설정파일을 통해 생성됩니다.

이미지와 레이어

Docker 이미지는 겹쳐서 사용 가능

도커 이미지는 겹쳐서 사용할 수 있습니다. 예를 들어 위의 그림처럼 OS용 이미지에 웹 애플리케이션용 이미지를 겹쳐 사용할 수 있는데 이를 레이어라 합니다. 도커에서는 이미지 구성에 변경이 있었던 부분을 레이어를 통해서 관리하는데, 이미지는 여러 개의 레이어로 구성되고 새로운 설정이 추가될 시 새로운 레이어가 생성됩니다. 

 

Docker hub

도커 이미지는 도커 레지스트리에서 공유할 수 있습니다. 도커의 공식 레지스트리인 Docker hub에서는 Ubuntu나 CentOS와 같은 리눅스 배포판의 기본 기능을 제공하는 베이스 이미지를 배포하고 있으며 Dockerfile 에서 이러한 베이스 이미지에 미들웨어나 라이브러리 등을 겹쳐 독자적인 도커 이미지를 만들게 됩니다. 특히, docker hub를 통해서 각자가 만든 도커 이미지를 공유할 수 있습니다.

또한, docker hub는 github이나 bitbucket과 연계할 수 있습니다. 예를 들어 github 상에서 Dockerfile을 관리하고 거기서에서부터 도커 이미지를 자동으로 생성하는 automated build를 지원합니다.

 

컨테이너 실행

도커는 리눅스 상에서 도커 이미지를 바탕으로 컨테이너 단위로 프로세스를 실행시킵니다. 도커 이미지만 있으면 도커가 설치된 환경 어디에서든지 컨테이너를 작동시킬 수 있으며 여러 개의 컨테이너를 가동시킬 수 있습니다. 특히, VM과 같은 경우에는 OS의 실행부터 시작하기 때문에 시간이 오래 걸리지만 도커의 경우는 이미 가동되고 있는 호스트 OS 상에서 프로세스를 실행시키는 것이므로 빨리 실행할 수 있습니다.

컨테이너는 이미지 레이어에서 읽기/쓰기 레이어가 추가되는 것으로 실행되므로 여러 개의 컨테이너가 실행되더라도 최소한의 용량만 사용됩니다. 또한, 컨테이너가 종료되었다고 해서 명시적으로 삭제하지 않는 이상 컨테이너가 메모리 상에 남아있어 언제든지 다시 시작할 수 있습니다. 단, 컨테이너를 도커 명령어로 명시적으로 삭제했을 때, 컨테이너 안에서 생성한 파일은 영구적으로 사라집니다. 

도커는 하나의 리눅스 커널을 여러 개의 컨테이너에서 공유하고 있습니다. 컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고, 그룹마다 각각 파일 시스템, 호스트명, 네트워크 등을 할당하여 서로 다른 그룹끼리 독립적으로 동작합니다. 

제품 환경에서는 모든 컨테이너를 한 대의 물리 머신에서 작동시키는 일은 드물며, 시스템의 트래픽, 신뢰도 요건 등에 의해 여러 대의 머신으로 된 분산 환경을 구축하게 되며 분산 호나경에 대한 오케스트레이션 툴 (Kubernetes) 를 이용하는 것이 일반적입니다. 

반응형

'Computer > Docker' 카테고리의 다른 글

Docker 이미지 커맨드  (0) 2021.04.03
Docker의 작동 구조  (0) 2021.03.27
컨테이너 - Docker  (0) 2021.03.26
리눅스  (0) 2021.03.22
하드웨어와 네트워크  (0) 2021.03.22