이 글은 [2024 NEW] 개발자를 위한 쉬운 도커 강의를 듣고 작성한 글입니다! 모든 이미지 출처는 해당 강사님께 있습니다.
도커는 컨테이너를 관리하기 위해 만들어진 소프트웨어이다. 컨테이너는 큰 서버를 나누어 사용하기 위한 가상화 기술이다. 도커와 컨테이너를 이해하려면 서버와 가상화 기술이 무엇인지 알아야 한다. 가상화 기술에는 대중적인 가상화 기술인 Hypervisor, 새롭게 등장한 컨테이너 가상화인 Container가 있다.
엔터프라이즈에서 서버를 운영하는 방식은 총 3가지가 있다.
베어메탈(Baremetal)은 우리가 컴퓨터를 구입하여 사용하는 것과 비슷한 방식인데, 여러가지 이유로 비효율적이다.
그 외에 하이퍼바이저(Hypervisor), 컨테이너(Container) 방식이 있다.
가상화 기술
가상화 기술이란, 실제로 존재하는 컴퓨터가 아니지만 마치 실제로 존재하는 것처럼 만들어주는 기술이다. 가상화 기술을 사용하면 하나의 컴퓨터에서 여러 대의 컴퓨터를 가진 것 처럼 사용할 수 있다. 물리적인(실제 존재) 컴퓨팅 환경 내에서 논리적인(가상으로 존재) 컴퓨팅 환경을 만드는 것이다.
가상화 기술을 사용하면 한 대의 컴퓨터에 여러 대의 논리적인 OS 환경을 만들 수 있다. 가상으로 만들어진 OS에서는 사용자가 직접 리소스를 분배가 가능하다. 리소스를 분해하는 것은 하나의 가상환경이 사용할 수 있는 리소스의 최댓값을 정의한다는 것이다. 한 대의 프로그램에서 에러가 발생해도 하나의 환경의 문제로 끝난다. 즉, 다른 OS 환경에는 영향을 주지 않는다.
전통적인 가상화 기술, 하이퍼바이저
하이퍼바이저는 컴퓨터에 설치되는 프로그램이다. 하이퍼바이저를 사용해서 가상 OS를 만들고 관리할 수 있다. 가상환경을 만드는 것이 프로그램을 설치하는 것과 같이 디스크 공간을 차지한다. 가상환경을 실행하게 되면 사용자가 지정한 만큼의 CPU와 메모리를 사용하게 된다.
물리적인 서버에 설치되는 OS를 호스트OS (Host OS)라고 한다. 호스트OS에는 하이퍼바이저를 설치해서 가상환경을 만들 수 있다. 하이퍼바이저는 호스트OS로 새로운 OS를 실행하는데, 그것을 게스트OS라고 한다. 호스트OS는 물리적인 하드웨어와 직접 연결되어 있다. 게스트OS는 호스트OS를 나눈 논리적인 공간이며, 일반적으로 가상머신이라고 부른다. 가상머신에서 웹 서버, WAS, DB같은 서버 프로그램을 프로세스로 실행해서 운영한다.
프로세스가 정상적으로 동작하기 위해서는 CPU나 메모리와 같은 리소스를 사용해야 한다. 프로세스는 OS를 통해서만 리소스를 사용할 수 있다. OS에는 하드웨어를 사용하기 위해 커널(Kernal) 이라는 것이 설치되어 있다. 프로세스들은 커널의 System Call을 사용해 하드웨어 자원을 사용할 수 있다. OS는 대표적으로 윈도우, 리눅스, 맥OS가 있다. 각각의 OS는 다른 종류의 커널을 사용하기 때문에 System Call도 다르다.
하이퍼바이저는 격리된 공간을 만들어 호스트OS와 다른 종류의 게스트OS 사용이 가능하다. 하이퍼바이저는 특정 제품이 아니라 기술이기 때문에 하이퍼바이저 역할을 수행하는 다양한 소프트웨어가 존재한다. virtual box는 오픈소스로, 테스트, 학습에 많이 사용된다.
컨테이너 가상화
Docker는 컨테이너 가상화라는 새로운 가상화 기술과 관련이 있다. 컨테이너 가상화는 현대에서 하이퍼바이저 가상화보다 선호되는 기술이다. 그 이유는, 가볍고 빠르다는 것이다.
컨테이너 가상화는 리눅스 커널이 제공하는 LXC라는 자체 격리 기술에서 출발했다. 하이퍼바이저 가상화는 하이퍼바이저 프로그램이 격리된 공간을 만들어 주었다. LXC를 사용하면 하이퍼바이저를 사용하지 않고도 커널만 사용하여 격리된 공간을 만들 수 있다. LXC 기술은 커널의 Namespace, Cgroups 기술을 사용한다. LXC 기술을 사용하여 만들어진 각각의 격리된 공간을 컨테이너라고 한다. 컨테이너 가상화는 커널의 격리 기능을 사용하기 때문에 모든 컨테이너는 호스트OS의 커널을 공유해서 사용한다.
하이퍼바이저 가상화는 하이퍼바이저를 통해 요청을 하는 단계가 커지는데, 이것을 오버헤드가 크다고 한다. 컨테이너 가상화는 HostOS의 커널을 그대로 사용해 중간 단계가 없어 하이퍼바이저 보다 오버헤드가 적다. 하드웨어 리소스 사용이 효율적으로 사용 가능하다. HostOS의 Kernal을 공유하기 때문에 Kernal을 실행하는 시간 자체가 없다. 즉, 부팅이 빠르다.
도커
도커는 커널의 컨테이너 가상화 기술을 편리하게 사용하기 위해 만들어진 소프트웨어이다. 사용자는 도커를 통해 컨테이너 만들고 운영이 가능하다. 하이퍼바이저 가상화에서는 격리된 공간을 만드는 주체가 하이퍼바이저라는 소프트웨어라면, 컨테이너 가상화에서 실제 격리를 수행하는 주체는 커널 자체이다.
컨테이너 플랫폼은 가지고 있는 컨테이너 엔진과 컨테이너 런타임으로 구성되어 있다. 컨테이너 엔진은 사용자의 요청을 받아서 컨테이너를 관리하는 역할을 하고, 컨테이너 런타임은 직접 커널과 통신하면서 실제 격리된 공간에 만든다.
도커의 아키텍처는 다음과 같다. 도커는 클라이언트-서버 모델로 실행된다. 사용자의 명령을 전달해주는 클라이언트와 클라이언트를 관리해주는 도커 데몬이라는 서버가 존재한다. 클라이언트는 도커 데몬에게 사용자의 명령을 전달한다. 도커 데몬은 호스트 OS에서 지속적으로 실행되며 클라이언트 요청에 따라 컨테이너를 관리한다. 도커 데몬은 클라이언트가 기능을 사용할 수 있도록 API를 제공한다.
도커에서는 Docker CLI(Command Line Interface)가 클라이언트 툴로 제공된다. 클라이언트가 명령어 입력하면 CLI가 서버의 API 양식에 맞게 요청을 보낸다. CLI는 응답으로 받은 데이터를 사용자가 보기 좋게 테이블 형태로 만들어서 화면에 보여준다.
'Docker' 카테고리의 다른 글
이미지 레지스트리 (0) | 2024.02.19 |
---|---|
컨테이너의 라이프사이클 (0) | 2024.02.17 |
이미지의 메타데이터(Metadata) (1) | 2024.02.17 |
이미지와 컨테이너 (1) | 2024.02.16 |
컨테이너 실행 (0) | 2024.02.15 |