Docker
도커는 리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트이다. 도커 엔진(Docker Engine)은 도커 이미지를 생성하거나 도커 컨테이너를 실행시키는데 필요한 핵심 기능을 제공한다.
내가 생각하는 도커를 쓰는 이유는 다음과 같다
- 프로그램을 다운로드 시 발생하는 복잡한 설치 과정과 문제들을 방지한다
- 환경에 종속적이지 않으며, 리눅스에서 100% 동작을 보장한다
- 시스템 자원을 효율적으로 이용할 수 있다
- 소프트웨어 전달 주기를 가속한다
- MSA 환경에서 빛을 발한다
컨테이너
도커를 이해하기 위해서 우선적으로 컨테이너에 대해 알 필요가 있다.
도커에서 이야기하는 컨테이너는 패키지 된 소프트웨어의 단위이다. 패키지된 소프트웨어란 이를 구성하는 코드와 의존성의 집합을 의미한다. 컨테이너를 통해 다른 컴퓨팅 환경에서 빠르고 신뢰도 있게 애플리케이션을 실행시킬 수 있다.
컨테이너 이미지
컨테이너 이미지는 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정 등 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다.
컨테이너 이미지는 런타임때 도커 엔진에 올라가 도커 컨테이너가 된다.
리눅스와 윈도우 기반 애플리케이션 모두에서 사용할 수 있는 컨테이너화 된 소프트웨어는 환경에 관계없이 항상 동일하게 실행된다. 컨테이너는 소프트웨어를 환경으로부터 격리시키고 개발과 스테이징의 차이에도 불구하고 균일하게 동작하는 것을 보장해준다.
간단하게 설명하면 컨테이너 이미지가 애플리케이션에 대한 메타 데이터이며, 컨테이너가 동작하는 인스턴스로 볼 수 있다.
도커가 사용하는 기술 - 컨테이너 격리 방식
도커는 컨테이너 격리를 위해 리눅스의 Cgroup, namespace 기술을 사용한다. 이 기능은 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능이다
C-group (control group)
- CPU, 메모리, Network Bandwith, GD i/o 등 프로세스 그룹의 시스템 리소스 사용량을 관리
- 어떤 어플이 사용량이 너무 많다면 그 어플리케이션을 C group에 넣어 CPU와 메모리 사용을 제한할 수 있다.
네임스페이스 (namespace)
- 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술
- 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술
컨테이너와 VM의 차이
컨테이너와 VM의 차이는 각각의 애플리케이션 하위의 OS이다. 컨테이너 기술에선 각각의 컨테이너가 호스팅 OS 커널을 공유한다. 동작하는 각각의 프로세스는 격리된 공간을 갖지만 애플리케이션마다 OS를 가지지 않는다.
반면 VM은 하이퍼바이저에 의해 관리되며 각 VM마다 독립된 가상 하드웨어 자원을 할당받는다. 각 VM은 전체 OS, 애플리케이션 그리고 필요한 바이너리 파일과 라이브러리에 대한 복사본을 포함한다.
이러한 차이로 인해 도커 컨테이너가 VM에 비하여 가지는 장점은 아래와 같다.
- 게스트 OS가 필요하지 않다 훨씬 가볍다
- 애플리케이션 실행시 호스트 OS위에 이미지만 배포하면 된다
- 부팅속도가 빠르다
- 더 많은 애플리케이션을 핸들링할 수 있다.
Linux가 아닌환경에서 C-group과 네임스페이스를 사용할 수 있는 이유
docker version 을 이용해 Docker Engine의 OS를 확인해보면 linux/amd64 인 것을 확인할 수 있다. 도커에선 내부적으로 MacOS / Windows위에 리눅스 VM을 띄우고 그 위에 리눅스 커널을 둔다. 즉, 내 컴퓨터가 MacOS 혹은 Windows라도 리눅스 VM이 깔려 있기에 도커가 돌아가는 환경에서 C-group과 네임스페이스를 사용할 수 있다.