AI/도커(Docker)

[도커/Docker] 컨테이너(Container)와 이미지(Image)

mingchin 2024. 4. 25. 15:42
728x90
반응형

부스트 캠프 교육에서 잠깐 배웠고, 입사 후에는 도커 기반으로 빌더를 실행하고 있으나 정작 그 개념에 대해 제대로 이해하고 있지 못한 부분이 많았다. 도커는 효과적인 가상화 도구다,, 정도의 개념만 가지고 있었다. 이 참에 실무에 도움이 되는 선에서, 주요 개념과 활용 방법에 대해 하나씩 정리하고자 한다.

 

What is Docker(Container)? (vs Virtual machine)


Docker는 컨테이너 기반의 어플리케이션을 생성, 동작, 관리할 수 있게 해주는 오픈소스 프로젝트로, 이제는 일종의 플랫폼이자 컨테이너 기반 가상화 기술의 고유 명사가 되었다. Docker의 정의에 "컨테이너"를 언급해야만 하므로, 컨테이너가 무엇인지 이해하는 것이 결국 Docker 이해의 출발점이다.

 

도커의 로고가 들고 있는 저 박스, 그 컨테이너다.

 

도커 공식 문서에서 컨테이너의 정의를 살펴보면 아래와 같다.

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another. A Docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings.

 

위 정의에 모든 핵심이 담겨있는데, "어플리케이션 구동을 위한 모든 것을 들고 있는 패키지(소프트웨어)"라 요약할 수 있겠다. 더 역사가 깊은 가상화 방법인 VM(Virtual Machine)의 어떤 한계점을 극복하고자 하였는지 알면, 이후 그 효율성이나 동작 방식을 이해하는 데에 도움이 된다.

 

가상화 방법에 따른 어플리케이션 실행을 위한 구조의 차이. 왼쪽이 Docker, 오른쪽이 VM 활용의 예시.

 

오른쪽 그림에 생략되어 있지만 역시 Host Operating System이 존재할 것이므로, 핵심 차이는 각 어플이 별도의 OS를 가지는 지 여부이다. 위 정의에서처럼 docker가 "lighweight", 흔히 경량화 도구라 표현되는 이유에는 여러 가지가 있지만, 대표적으로 각 컨테이너가 독립적임에도(마치 별도의 os에서 동작하는 것처럼) 별도의 os를 가지지 않고 host의 os를 공유한다는 점이 있다. 

 

도커 컴포넌트의 구성

 

도커는 도커 엔진(docker daemon, = dockerd), API, CLI 그리고 그 외 플러그인들로 구성되어 있다. 도커 엔진은 도커 관련 작업을 위해 항시 백드라운드에서 동작하는 프로세스로, 컨테이너 생성과 실행 그리고 관리, 어플리케이션 배포, 네트워킹 등 실질적인 동작에 관여하는 컴포넌트다. 사용자는 docker 명령어를 사용해 CLI로 API를 호출, 특정 기능을 수행할 수 있다. 도커 API는 표준 http 기반 REST API라고 한다. 이러한 구성을 가진 도커는 컨테이너 기반으로 소프트웨어를 쉽게 만들고 활용할 수 있게 도와주는 일종의 "도구 집합"인 것이다.

 

Docker 이미지(Image)와 컨테이너(Container)


컨테이너를(비단 도커에서만 활용되는 것이 아니므로) 개념적으로 이해한 것이 위와 같다면, 도커 내에서 실제 활용되는 면모에 초점을 맞추어 도커 컨테이너를 정의한다면 이제 아래의 정의가 가능해진다. (나는 대뜸 이렇게 정의하고 시작하는 타 글들이 처음에 이해가 어려웠기에 구구절절 말이 길어졌다.)

 

  • 도커 컨테이너(docker container): 도커 이미지를 실행한 결과 혹은 상태. 각 컨테이너는 독립된 프로세스에 해당하며, 각자의 파일 시스템, 네트워크 등을 가진다.
  • 도커 이미지(docker image): 컨테이너 실행을 위한 템플릿. Dockerfile을 통해 생성하며, 그 안에는 각 컨테이너의 실행 환경, 동작 구성 등을 정의할 수 있다. 가장 중요한 특징인 불변성(Immutable, read-only - 그래서 "이미지"인가보다)을 가지며, 하나의 이미지로 여러 개의 컨테이너를 실행하는 것도 가능하다.

도커 이미지는 git을 통한 소스 코드 공유와 유사하게, 누구나 docker hub 혹은 타 플랫폼, 또는 온프로미스로 구축한 레지스트리를 통해 공유해 다운 받거나(pull) 배포(push)하여 사용할 수 있다. 이정도 개념을 이해한 상태에서 Dockerfile로 이미지를 빌드해보거나, 이미 만들어진 이미지를 활용해 컨테이너를 실행/중단/삭제해보면 된다. (다음 글에서..)

 

 

References


https://www.docker.com/resources/what-container/

https://www.docker.com/products/container-runtime/

https://colevelup.tistory.com/30

728x90
반응형