도커란 ?
Docker
Docker 는 리눅스 컨테이너에 여러 기능을 추가해서 애플리케이션을 컨테이너로서 조금 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트이다.
도커와 관련된 프로젝트에는,
- Docker Compose
- Private Registry
- Docker Hub
- Docker for Desktop
- …
일반적으로 도커라고 하면 Docker Engine 이라는 의미로 많이 쓰인다.
도커의 생태계에 있는 모든 프로젝트들은 도커 엔진을 더 효율적으로 사용하기 위한 것에 불과하기 때문이다.
가상 머신과 도커 컨테이너
가상 머신
기존의 가상화 기술은, 하이퍼바이저를 이용해 여러 운영체제 (= Guest OS) 를 하나의 호스트에서 생성해 사용하는 방식이었다.
각 Guest OS 는 다른 Guest OS 와 완전히 독립된 공간과 시스템 자원을 할당받아 사용한다.
이러한 가상화 방식을 사용할 수 있는 가상화 툴로는 VirtualBox, VMware 등이 있다.
시스템 자원을 가상화하고 독립된 공간 생성 작업은 항상 하이퍼바이저를 거치기 때문에 일반 호스트에 비해 성능 손실이 발생한다.
그리고, Guest OS 를 사용하기 위한 라이브러리, 커널 등을 전부 포함하여 가상 머신을 배포하기 위한 이미지를 만들었을 때 이미지의 크기가 크다.
도커 컨테이너
도커 컨테이너는, 가상화된 공간을 생성하기 위해 리눅스의 자체 기능은 chroot, namespace, cgroup 을 사용하여 프로세스 단위로 격리된 환경을 만들기 때문에 성능 손실이 거의 없다.
컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 애플리케이셔을 구동하기 위한 라이브러리 및 실행파일만 존재하여 이미지로 만들었을 때 크기가 작다.
도커의 장점
컨테이너는 OpenVZ, LXC, cri-o 등 몇 가지가 존재하지만, 도커는 컨테이너 생태계에서 사실상 표준으로 사용되고 있다. 도커의 장점을 정리해보자.
애플리케이션의 개발과 배포가 편해진다.
독립된 개발환경을 보장받을 수 있다.
도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간이기 때문에, 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정해도 호스트 OS 에는 영향을 끼치지 않는다.
서비스를 개발했을 때 사용했던 환경을 다른 서버에서 컨테이너로서 똑같이 복제할 수 있어서, 개발/운영 환경의 통합이 가능하다.
컨테이너 내부에서 작업을 마친 뒤 운영 환경에 배포하려고 하면, 해당 컨테이너를 ‘도커 이미지’ 라는 패키지로 만들어 운영서버어 전달만 하면 된다.
도커 이미지는 가상 머신의 이미지와 다르게 커널을 포함하고 있지 않기 때문에 이미지 크기가 작다.
또한, 이미지 내용을 레이어 단위로 구성해서 중복되는 레이어를 재사용할 수 있어서 배포 속도가 뻐르다.
여러 애플리케이션의 독립성과 확장성이 높아진다.
마이크로서비스 구조는 여러 모듈을 독립된 형태로 구성해서, 언어에 종속되지 않고 변화에 빠르게 대응할 수 있고, 각 모듈의 관리가 쉬워진다.
컨테이너는 수 초 내로 생성과 시작이 가능하고 여러 모듈에 독립된 환경을 동시에 제공하기 때문에, 마이크로 서비스 구조에서 가장 많이 사용되는 가상화 기술이다.
예를 들어, 웹 서비스는 데이터베이스 컨테이너와 웹 서버 컨테이너로 분리할 수 있다.
웹 서비스에 부하가 발생하면 웹 서버 컨테이너만 동적으로 늘려서 부하를 분산할 수 있다.
시작하세요! 도커/쿠버네티스 <용찬호>