Docker

Docker

🚀 What is Docker?

► What is a container and what problems does it solve?

필요한 모든 종속성 및 구성을 사용하여 애플리케이션을 패키징하는 방법

컨테이너란 호스트 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.

호스트 OS의 리소스를 논리적으로 분리시키고, 여러 개의 컨테이너가 공유하여 사용한다.

컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동하는 것이 특징이다.

► Virtualization and Linux Container

컨테이너를 이해하기 위해서는 일단 가상화라는 개념을 알고 있어야 한다.

가상화는 컴퓨터 리소스의 추상화를 일컫는 말인데, 애플리케이션, 서버, 저장장치 등 물리적으로 하나인 것을 복수의 것처럼 또는 반대로 복수의 것을 하나인 것처럼 만들어 주는 기술이다.

가상화를 통해서 가상머신(VM)을 만들어 낼 수 있다.

VM은 호스트 운영체제에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스하는 Guest 운영체제를 가지는 일종의 격리된 머신이다.

쉽게 생각하면 하나의 컴퓨터.

컨테이너는 가상머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 모든 종속항목과 패키지(그냥 APP에 필요한 모든 파일, 설치파일들, 필요한 모든 것들)로 묶어 소프트웨어 서비스 구동을 위한 격리환경을 마련해 주지만 큰 차이점이 있다.

바로 가상화 방식이 다르다는 점이다.

기존의 VM을 생성하는 가상화 방식은 주로 OS를 가상화한다.

Host OS가 존재하고 그 위에 Guest OS 전체를 가상화하는 방식이다.

그러므로 OS가 가상머신 이미지에 포함되어야만 하고 이는 용량이 매우 클 수밖에 없는 구조이다.

가상화 기술의 발전으로 성능이 좋아졌다고는 하지만, 전가상화와 반가상화 등 Guest OS를 포함하여 운영하는 방식은 여전히 하드웨어 성능을 100% 뽑아낼 수 없다.

하지만 컨테이너 기술은 다르다.

컨테이너는 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유하여 컨테이너를 실행하며 Guest OS가 존재하지 않는다.

이런 가상화를 '운영체제 수준의 가상화'라고 부른다.

이게 가능한 까닭은 바로 리눅스 컨테이너를 통해 프로세스를 격리 하는 것이 가능하기 때문이다.

► 프로세스 격리

리눅스(Linux) 운영체제는 커널 공간과 사용자 공간이 존재한다.

이 중 사용자 공간을 여러 개로 나누어 프로세스에서 사용하는 리소스를 제한할 수 있다.

즉 각각의 프로세스가 독립된 공간에서 할당받은 자원을 이용하여 동작하도록 만들 수 있는 것이다.

Docker를 Linux에서 사용하는 이유는 Linux의(정확하게는 커널) 다음 기술들을 이용하기 때문이다.

- Linux Namespace

리눅스 네임스페이스는 각 프로세스가 파일시스템, 네트워크, 유저, 호스트네임 등에 대해서 시스템이 독립뷰를 가질 수 있도록 만들어준다.

- Linux cgroup(Control group)

리눅스 컨트롤 그룹은 프로세스가 소비할 수 있는 리소스(CPU, 메모리, I/O, 네트워크 대역)등을 제한할 수 있는 기능으로 각각의 프로세스에 리소스를 할당할 수 있다.

기존 가상화 기술에서는 VM이 실제 물리 하드웨어를 에뮬레이트 하므로, OS가 반드시 필요했다.

하지만 리눅스 컨테이너(LXC)에서는 모든 프로세스가 호스트 OS에서 바로 시작한다.

일반적인 프로세스와 다른 점은 그룹화를 통해 단절된 공간에서 동작한다는 것이다.

즉, 컨테이너라는 것은 리눅스가 제공하는 기능을 이용하여 단절된 공간에서 할당받은 시스템 자원을 통해 독립적으로 가동되는 일종의 프로세스이다.

도커는 결국 컨테이너 엔진의 하나다. 위의 사진에 보이는 컨테이너 관리 소프트웨어라고 보면 된다.

Last updated