안녕하세요. 바른호랑이입니다.
이번 게시글에서는 Docker가 무엇인지에 대해 알아볼 예정입니다.
게시글은 '시작하세요! 도커/쿠버네티스 친절한 설명으로 쉽게 이해하는 컨테이너 관리'를 기반으로 작성하였으니 참고바랍니다.
Docker란 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트입니다. Go 언어로 작성되었으며, 2013년 3월에 첫 번째 릴리즈가 발표된 이후 지금까지 꾸준히 개발되고 있습니다. VMware, VirtualBox와 같은 기존의 Virtual Machine들과는 다르게 도커 컨테이너는 성능의 손실이 거의 없다는 장점이 있습니다.
Docker관련 프로젝트로는 대표적으로 Docker Compose, Private Registry, Docker Hub, Docker for Desktop 등과 같은 것들이 있으며, 이와 같은 프로젝트들은 Docker Engine을 좀 더 효율적으로 사용하기 위한 것들입니다. Docker를 이해하기 위해서는 우선 기존의 가상머신과 도커의 차이점에 대해서 이해해야 합니다.
기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식입니다. 여러 개의 운영체제는 가상 머신이라는 단위로 구분되고, 각 머신에는 Ubuntu, CentOS 등의 운영체제가 설치되어 사용되며, 이와 같이 하이퍼바이저에 의해 생성되고 관리되는 운영체제들은 Guest OS라 불립니다. 하지만 이와 같은 방식은 대다수의 작업들이 하이퍼바이저를 반드시 거쳐서 실행되어야 하기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다. 또한 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하는 이미지를 사용해야 하기 때문에 큰 사이즈의 이미지를 요구한다는 단점을 가지고 있었습니다.
이에 반해 Docker는 가상화 공간 생성을 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능의 손실이 거의 없으며, 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 필요한 용량 또한 가상머신에 비해 대폭 줄어든다는 장점이 있습니다.
컨테이너 기반 기술로는 OpenVZ, LXC, cri-o 등 다양한 솔루션들이 존재하지만 Docker는 컨테이너 생태계에서 사실상 표준으로 사용되고 있으며, 그로 인해 쿠버네티스, 메소스와 같은 오픈소스 프로젝트들은 Docker를 기준으로 개발되고 있습니다. 이로 인해 점점 더 많은 회사들이 서비스 개발 및 운영 환경에 도커를 도입하고 있습니다. 도커가 이와 같이 표준이 될 수 있었던 이유로는 아래와 같은 사항들이 있습니다.
1. 애플리케이션의 개발과 배포가 편해집니다.
: 서버 부팅 시 실행되는 운영체제를 일반적으로 호스트 OS라 부르며, 도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간입니다. 컨테이너 자체에 특별한 권한을 부여하지 않는 한, 컨테이너 내부에서 실행되는 작업들을 호스트 OS에는 영향을 미치지 않기에 독립된 개발 환경을 보장받을 수 있습니다.
컨테이너 내부에서 여러 작업을 마친 후 운영 환경에 배포하려고 한다면, 해당 컨테이너를 도커 이미지라는 일종의 패키지로 만들어 운영서버에 전달하기만 하면 되며, 운영 서버에 새롭게 패키지를 설치할 필요도 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요도 없습니다. 이와 같이 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능합니다.
또한 도커 이미지는 가상 머신의 이미지와 달리 커널을 포함하고 있지 않기 때문에 이미지의 크기가 크지 않으며, 이미지 내용을 레이어 단위로 구성하고, 중복되는 레이어의 재사용이 가능하기 때문에 애플리케이션의 배포 속도가 빨라진다는 장점이 있습니다.
2. 여러 애플리케이션의 독립성과 확장성이 높아집니다.
: 소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식을 모놀리스(Monolith) 애플리케이션이라고 하는데, 이와 같은 방식은 확장성과 유연성이 줄어든다는 단점이 있기 때문에 마이크로 서비스 구조가 떠오르게 되었습니다.
마이크로 서비스 구조는 여러 모듈을 독립된 형태로 구성하기 때문에 언어에 종속되지 않고 변화에 빠르게 대응할 수 있고, 각 모듈의 관리가 쉬워진다는 장점이 있습니다. 컨테이너는 수 초 내로 생성, 시작이 가능하고 여러 모듈에 독립된 환경을 제공할 수 있기에 마이크로서비스 구조에서 가장 많이 사용되는 가상화 기술입니다.
예를 들어 웹 서비스는 DB 컨테이너와 Web Server 컨테이너로 분리할 수 있고, 웹 서버에 부하 발생 시 관련된 컨테이너만 동적으로 스케일 업을 하여 부하를 분산할 수 있으며, 각각의 컨테이너와 관련된 이미지 버전을 독립적으로 관리하기 때문에 유지보수 또한 용이합니다. 이와 같은 컨테이너 기반 마이크로 서비스는 개발자가 그 구조를 구현한다기보다는 도커 스웜모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용하는 것이 일반적입니다.
도커는 다양한 운영체제에서 사용할 수 있고, 리눅스 컨테이너를 제어하는 API를 Go언어로 구현한 libcontainer를 사용하기 때문에 CentOS와 Ubuntu와 같은 대부분의 리눅스 운영체제에서 사용할 수 있으나, 지원이 중단되지 않은 최신 버전의 운영체제 배포판을 사용하는 것이 좋습니다. Winodows, Mac OS에서도 도커를 사용하는 것은 가능하지만 해당 OS들의 버전이 기준보다 낮은 경우에는 별도로 가상화 공간을 생성해야 할 수도 있습니다.
대표적인 도커 엔진으로는 유료로 제공되는 기업용 솔루션인 Docker EE와 무료로 제공되는 Docker CE가 있습니다. Docker EE는 각종 기술 지원 및 실제 서비스 단계에서 필요한 각종 부가기능들을 도커 엔진과 같이 제공하고, Docker CE는 별도의 기술 지원 및 서비스를 제공하지는 않지만 도커 엔진 자체의 핵심적인 기능을 무료로 이용할 수 있습니다.
Docker EE와 Docker CE는 기술 지원 및 서비스 운용을 위한 부가적인 서비스 지원 수준에서 차이가 있지만, 핵심적인 컨테이너 기술은 도커 CE에서도 동일하게 사용할 수 있기에 개별적인 사용에는 큰 문제가 없다는 것 또한 Docker의 큰 장점이라고 할 수 있습니다.
'IT & 데이터 사이언스 > Data Engineering' 카테고리의 다른 글
[Docker] Docker 네트워크 (1) | 2024.08.08 |
---|---|
[Docker] Docker 볼륨 (5) | 2024.08.05 |
[Docker] 컨테이너 외부 네트워크에 오픈하기 (0) | 2024.07.29 |
[Docker] Docker 엔진의 기본 단위와 컨테이너 생성, 삭제 (0) | 2024.07.25 |
[Airflow] Apache Airflow 살펴보기 (2) | 2024.07.15 |
댓글