어쩌다데싸

[Docker] 도커 본문

MLOps

[Docker] 도커

엔팁 2023. 5. 19. 17:34

현재 운영하고 있는 서비스는 도커를 기반으로 돌아가고 있는데, 도커를 사용했다고 말할 때

최소한의 지식은 가지고 있어야 하기 때문에 도커를 차근차근 공부해 보고자 합니다.

 

1. 도커와 컨테이너

저는 도커를 처음 접할 때 환경에 의한 문제 없이 어디서든 프로그램을 구동할 수 있게 만들어주는 기술로써 도커를 이해했습니다. 하지만 알고 보니 이것은 도커보다는 컨테이너 기술에 대한 이해였습니다. 도커는 컨테이너 기술을 사용해서 실행환경, 프로그램 등을 추상화하고 동일한 인터페이스를 제공해서 프로그램의 배포와 관리를 쉽게 만들어주는, 컨테이너 런타임 도구 중 가장 유명한 플랫폼입니다.

 

그렇다면 컨테이너란 무엇일까요? 컨테이너는 앱이 구동되는 환경까지 함께 감싸서 실행할 수 있도록 하는 격리 기술입니다. 상품을 운송할 때 사용되는 컨테이너와 개념은 비슷합니다. 어플리케이션 뿐 아니라 앱이 구동되는 환경까지 감싸서 실행할 수 있도록 하는 격리 기술이 바로 컨테이너입니다.

 

컨테이너 기술을 설명할 때 가상머신과 비교하면 장점이 빠르게 와닿을 듯 합니다.

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

왼쪽은 도커 컨테이너를, 오른쪽은 하이퍼바이저 기반 가상머신을 단순화 한 이미지 입니다. 기존의 가상화 기술은 주로 VirtualBox나 VMWare을 통해 하나의 호스트 위해 여러 개의 GuestOS를 생성하는 방식이었습니다. 각 GuestOS는 완전히  독립된 공간과 시스템 자원을 할당 받아서 사용할 수 있지만, 가상머신에서의 작업은 반드시 하이퍼바이저를 거쳐야 하기 때문에 이 과정에서 성능 손실이 발생하게 됩니다. 또한, 각각의 GuestOS를 사용하기 위한 라이브러리, 커널 등을 모두 포함하고 있기 때문에 가상머신을 배포할 경우 이미지의 크기가 매우 크다는 단점이 존재합니다.

 

이에 비해, 도커 컨테이너는 리눅스의 자체 기능인 chroot, namespace, cgroup을 사용해 프로세스 단위의 격리 환경을 만들어 성능 손실이 거의 없는 채로 완전히 독립된 공간을 생성할 수 있습니다. 또한, 각 컨테이너는 호스트의 커널을 공유해서 사용하기 때문에 컨테이너 안에는 어플리케이션 구동을 위해 필요한 라이브러리와 실행파일만 존재하므로 가상머신에 비해 이미지의 용량이 크게 감소하게 됩니다.

 

2. 도커의 장점

도커의 대표적인 장점은 어플리케이션의 개발과 배포가 편해진다는 점입니다. 앞서 설명했다 싶이, 컨테이너는 격리된 공간이기 때문에 이 안에서의 변경 작업 등은 Host OS에 영향을 미치지 않으면서 Host OS의 시스템 리소스를 공유하기 때문에 결과적으로 시간과 리소스를 절약하며 독립된 개발 공간을 만들 수 있습니다. 

 

또한, 컨테이너에서의 작업을 마친 뒤 배포를 할 때, 해당 컨테이너를 '도커 이미지'라는 일종의 패키지로 만들어서 운영 서버에 전달하기만 하면 되기 때문에 배포가 매우 쉽습니다. 개발을 하면서 환경(패키지, 라이브러리 버전 및 설치 등)에 의한 의존성 때문에 많은 오류를 직면하게 되는데 도커 이미지로 배포할 경우 서비스를 개발했을 때의 환경을 다른 서버에서도 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능하게 됩니다. 여기서 언급된 '도커 이미지'에 대해서는 다른 포스팅에서 자세히 다뤄 보겠습니다.

 

여러 어플리케이션의 독립성과 확장성이 높아진 다는 것도 가장 큰 장점인데요, 마이크로 서비스 구조를 통해 여러 모듈을 독립된 형태로 구성하므로 언어에 종속되지 않고 변화에 빠르게 대응할 수 있습니다. 어플리케이션을 독립적으로 관리하기 때문에 유지보수를 편하게 진행할 수 있습니다.

 

3. 도커 아키텍처

https://docs.docker.com/get-started/overview/#docker-architecture

도커는 클라이언트-서버 아키텍처를 사용합니다. 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 서버 도커로, dockerd 프로세스로 동작하게 됩니다. 도커 엔진은 외부에서 API를 입력 받아 도커 엔진의 기능을 수행하는데, 이 때 도커 프로세스가 실행되어 서버로서 입력을 받을 준비가 된 상태가 도커 데몬입니다. 도커 데몬이 API를 사용할 수 있도록 CLI를 제공하는 것이 도커 클라이언트 입니다. 하나씩 살펴보도록 하겠습니다.

 

도커 클라이언트(docker)

유저가 Docker cli를 통해 명령어를 던지면 Docker Client는 적절한 API Payload로 변환해서 Docker Daemon(dockerd)에게 REST API로 POST 요청을 합니다. 

 

도커 데몬(dockerd)

Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 도커 클라이언트를 통해 전달된 API는 Unix Socket을 통해 dockerd에게 전달되어, 도커 데몬은 이 명령어를 파싱하고 명령어에 해당하는 작업을 수행하게 됩니다. 

 

도커 레지스트리

Docker 이미지를 저장합니다. 도커 레지스트리 중 Docker Hub는 누구나 사용할 수 있는 공개 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있습니다. 

 

도커 개체

도커를 사용하여 생성할 수 있는 이미지, 컨테이너, 네트워크, 볼륨 등의 개체를 의미합니다. 

 

 

도커를 본격적으로 사용하기에 앞서 알아두면 좋을 기초 개념들을 정리해 보았습니다. 공부를 하며 정리한 내용들을 차근차근 업로드 해보겠습니다. 부족한 내용이나 틀린 내용 있으면 편하게 알려주시면 감사하겠습니다 :)

'MLOps' 카테고리의 다른 글

[Git] Git 기초 개념 정리  (1) 2023.05.15