도커란? (공식문서)
- 도커는 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 플랫폼이다.
- 도커를 사용하면 애플리케이션을 인프라에서 분리하여 소프트웨어를 신속하게 제공할 수 있다.
- 도커를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다.
공식문서만으로는 도커가 무엇인지를 제대로 파악하긴 힘들다.
내가 생각하는 도커란?
컨테이너 기반 가상화 도구다.
+ 도커는 컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트이다.
가상화
등장하게 된 계기
성능 좋은 컴퓨터를 하나 사서 애플리케이션 서비스를 실행했는데, 전체 리소스의 15%정도만 사용하고 나머진 사용하지 않는 상황이라고 가정해보자.
그래서 다른 서비스를 해당 컴퓨터에 실행하려고 했는데, 기존 서비스와 기술 충돌이 발생해서 실행시키지 못하게 되었다. 나는 둘 다 실행시키고 싶은데 그게 되지 않는 상황인 것이다.
이를 해결하기 위해 등장한 개념이 가상화다.
그래서 가상화는 무엇인가?
가상화(假像化, virtualization)는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어이다. "물리적인 컴퓨터 리소스의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 리소스와 상호 작용하는 방식으로부터 감추는 기술"로 정의할 수 있다. 이것은 다중 논리 리소스로서의 기능을 하는 것처럼 보이는 서버, 운영 체제, 응용 프로그램, 또는 저장 장치와 같은 하나의 단일 물리 리소스를 만들어 낸다. 아니면 단일 논리 리소스처럼 보이는 저장 장치나 서버와 같은 여러 개의 물리적 리소스를 만들어 낼 수 있다. /wikipedia
가상화는 하드웨어 리소스를 추상화해서 여러 가상 머신(VM [Virtual Machine])을 동시에 실행할 수 있는 기술이다.
가상화의 핵심은 리소스(ex. CPU, 메모리, 스토리지 ..)의 효율적 사용, 격리 및 보안 강화, 환경에 대한 유연함이다.
가상 머신 내부 구조
위의 이미지를 보면 하나의 호스트에 여러 개의 게스트 OS가 할당된 것을 볼 수 있는데 이러한 서버 가상화를 구현해주는 기술이 하이퍼바이저다. 각각의 하이퍼바이저에 할당된 게스트 OS를 가진 친구들을 가상머신(VM)이라고 한다.
가상머신은 하이퍼바이저 소프트웨어에 의해 관리된다.
하이퍼바이저는 OS들에게 자원을 나눠주고 조율하고 OS들의 커널을 번역해서 하드웨어에게 전달하는 역할을 한다.
정리하면, 가상화는 하나의 실제 컴퓨터 자원을 가상으로 여러 개로 쪼개서 사용하여 [혹은 그 반대인 경우] 컴퓨터 리소스를 효율적으로 사용하게 해주는 소프트웨어 아키텍처다.
가상화 단점
가상화 작업은 게스트 OS를 가진 가상 머신들을 관리하는 하이퍼바이저를 반드시 거쳐야 한다.
따라서 배포하기 위한 이미지를 만들었을 때도 그만큼 크기가 커진다.
즉, 가상 머신은 완벽하게 운영체제를 생성할 수 있는 장점은 있지만, 성능이 느리고, 용량이 부담스러운 단점이 있다.
컨테이너
등장하게 된 계기
작은 애플리케이션을 실행하는데 OS까지 새로 구동한다는 건 다소 부담스러운 면이 있다.
이를 해결 하기 위해 컨테이너라는 개념이 나왔다.
컨테이너는 가상화된 공간을 생성하기 위해 리눅스 내 자체 기능인 chroot, 네임스페이스, cgroup을 사용하여 프로세스 단위의 격리 환경을 만든다.
컨테이너 내부 구조
도커 엔진 위에 각각 할당된 친구들이 컨테이너다.
컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리와 실행 파일만 존재한다.
앞서 가상머신에 있는 guest OS는 없다. 그렇기에 이미지의 용량도 가상 머신에 비해 확연히 줄어든다.
따라서 이미지를 만들어 배포할 때 시간이 가상머신에 비해 빠르며, 가상화된 공간을 사용할 때도 성능 손실이 거의 없는 장점이 있다.
- 참고로 컨테이너를 다루는 기술은 도커만의 기술이 아니다. 다른 컨테이너 기술도 있다.
사전적 의미
- 어떠한 물체를 격리하는 공간
- 각각의 컨테이너는 서로 격리된 상태로 다른 컨테이너들과 분리되어 있다.
기술적 의미
스프링을 예로 들었을 때 (ex. Servlet Container, IoC Container ...)
컨테이너는 무언가의 생성, 운영, 제거까지의 라이프 사이클을 관리한다.
가상화 관점에서의 컨테이너는
이미지 목적에 따라 생성되는 프로세스 단위의 격리 환경이다.
즉, 컨테이너는 환경을 제공함과 동시에 프로세스의 라이프 사이클을 관리하는 하나의 프로세스이다.
추가로 설명을 덧붙여보자면
스프링부트 애플리케이션을 직접 실행하는 것과 컨테이너로 스프링부트를 실행하는 것은 Host OS에서 똑같은 프로세스로 인식한다는 점이다.
컨테이너를 왜 써야할까?
- 독립된 개발 환경 보장: 컨테이너는 프로세스를 Host OS와는 격리된 환경에서 관리한다. 따라서 컨테이너에 어떠한 설정을 하더라도 Host OS에는 아무런 영향을 주지 않는다.
- 컨테이너 단위: 그렇기에 프로세스를 컨테이너 단위로 사용할 수 있게되고 프로세스 관리, 확장에 용이해진다.
가상화와 컨테이너의 주된 차이
가상화와 컨테이너의 주된 차이는 가상화가 가상 머신(VM) 위에 전체 게스트 운영체제를 실행하는 반면, 컨테이너는 호스트 운영체제의 커널을 공유하면서 프로세스를 격리하여 실행한다는 점이다. 이로 인해 컨테이너는 가상 머신에 비해 더 가벼우며 시작 시간이 짧고 성능 오버헤드가 적다.
도커 엔진
컨테이너를 어떻게 관리하지?
사용자인 우리는 도커 엔진을 통해 컨테이너를 관리할 수 있다.
도커 엔진에 대해 좀 더 살펴보자면,
도커 엔진은 도커의 핵심 구성 요소인 컨테이너, 이미지, 볼륨 및 네트워크를 생성하고 관리하는 작업을 수행하는 도커 생태계의 중요한 도구다.
- 컨테이너는 애플리케이션 실행을 위한 격리된 환경이고,
- 이미지는 컨테이너를 생성하는 데 사용되는 템플릿이며,
- 볼륨은 컨테이너의 영구 데이터를 처리하고,
- 네트워크는 컨테이너와 외부 세계 간의 통신을 관리한다.
이를 총 관리해주는게 도커 엔진이다.
https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81%ED%99%94
가상화 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. VirtualBox 가상화(假像化, virtualization)는 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어이다. "물리적인 컴퓨터 리소스의 특징을 다른 시스템, 응용
ko.wikipedia.org
https://docs.docker.com/get-started/overview/
Docker overview
Get an in-depth overview of the Docker platform including what it can be used for, the architecture it employs, and its underlying technology.
docs.docker.com
https://velog.io/@kdaeyeop/%EB%8F%84%EC%BB%A4-Docker-%EC%99%80-VM%EC%9D%98-%EC%B0%A8%EC%9D%B4
도커 : Docker 와 VM의 차이
도커가 있기 이전부터 가상화 기술은 존재했었다. 당연히 도커는 기존의 가상화 기술을 기반으로 만들어졌다. 기존의 가상화 기술을 알아보고 도커와 비교해 본다면 도커를 조금 더 이해할 수
velog.io