기존의 가상화 기술
기존에 우리가 알고 있는 가상화는 하이퍼바이저(VMM)라는 기술을 이용하여 구현된 것이다
하이퍼바이저는 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행하기 위한 논리적 플랫폼을 말한다
하이퍼바이저를 이용한 가상화 방식에는 크게 2가지가 있다
Virtual Machine Type1(native)
호스트 OS 없이 하이퍼바이저가 하드웨어 바로 위에서 직접 동작하는 방식이다
중간에 OS가 없으므로 하드웨어에서 가상화 기술을 지원해줘야 하는 단점이 있지만, 요즘 CPU들은 대부분 가상화를 기본으로 지원하기 떄문에 그다지 단점이 되진 않는다
type1에서도 구현방식이 또 2가지로 나뉜다
전가상화
하드웨어 전체를 가상화한 뒤 가상머신을 올리는 방법을 말한다
모든 가상머신의 요청은 항상 하이퍼바이저를 통해서 가게 된다
반가상화
하드웨어 전체를 다 가상화하진 않는 방식을 말한다
특정 요청은 하드웨어에 직접 요청가능하고, 특정 요청은 하이퍼바이저를 통해서만 가능하다(CPU, 메모리 할당 등)
이러한 특성 때문에 OS를 조금 수정해줘야하는 단점이 있지만, 속도면에서는 당연히 더 빠르다는 장점이 있다
Virtual Machine Type2(hosted)
호스트 운영체제 위에서 하이퍼바이저가 동작하는 방식이다
우리가 잘 아는 VMWare, VirtualBox 등이 여기 속한다
당연히 속도는 더 느리다
컨테이너 가상화 기술?
우리가 원하는건 특정 환경에 종속되지 않은 상태로 어플리케이션을 띄우는 것이다
하지만 말 그대로, 단순히 어플리케이션만을 띄우고 싶을 뿐인데 OS까지 띄우는것은 엄청난 낭비이다
하지만 이러한 요구를 만족시키기 위해선 어플리케이션 격리
를 해결해야 한다
필요한 것 : 격리된 CPU, 메모리, 디스크, 네트워크를 가진 공간을 만들고 이 공간에서 프로세스를 실행해서 유저에게 서비스
Cgroup, namespace
위의 필요한 부분을 달성하기 위해 사용한 대표적인 2가지 기술이다(리눅스 기술이다)
Croup는 CPU, 시스템 메모리, 네트워크 대역폭과 같은 자원을 시스템에서 실행 중인 프로세스에 할당할 수 있는 기술을 말한다
처음에는 process containers 라는 이름으로 구글에서 개발되었으나, 이후 Cgroup 으로 이름이 변경되었다
개발 이후 리눅스 메인 커널에 하나의 기능으로 들어갔다
namespace는 리소스들을 서로 다른 네임스페이스 그룹으로 나눠서, 서로 다른 네임스페이스에서는 볼 수 없다록 하는 기술이다
네임스페이스를 구성하는 방식에는 pid, uts, network 등등 총 6가지의 방법이 있다(?)
결과적으로 이 Cgroup
와 namespace
를 사용하여 컨테이너
라는 기술이 탄생하게 된다
- Cgroup을 이용하여 프로세스에 리소스를 할당
- namespace를 이용하여 리소스간 볼 수 없게하여 격리시킴
이 Cgroups, namespaces를 표준으로 정의해둔 것을 OCI 스펙이라고 하고, 도커에서 사용했던 LXC나 현재 사용하는 runC는 모두 이 스펙을 구현한 구현체이다
도커란?
컨테이너 기반의 오픈소스 가상화 플랫폼을 말한다
앞서 언급했던 컨테이너 가상화 기술
을 사용하는 것은 물론이고, 그것을 관리하기 위한 명령어들, 이미지 버전관리, 도커 레지스트리 등등의 많은 기능을 제공한다
이곳에 잘 설명되어 있다 https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
제공하는 기능 외에 도커의 주요 장점을 간단히 살펴보면 아래와 같다
코드로 관리하는 인프라와 불변 인프라
알다시피 애플리케이션 배포는 항상 인프라의 가변성
을 포함하고 있어서 문제가 많다
(어플리케이션이 동일하더라도 배포하는 서버의 환경에 따라 여러가지 문제를 가져올 수 있다)
이러한 문제를 해결하는 가장 좋은 방법은 애플리케이션이 의존하는 환경의 차이를 가능한 한 배제하는 것
이다
도커는 특정 시점의 서버 상태를 복제하는 기능(docker image)과 이를 코드로 관리할 수 있는 기능(Dockerfile)을 제공한다
그리고 애플리케이션과 환경을 같이 묶어서 빌드할 수 있게 함으로써 기존에 존재하던 환경의 차이를 최소한으로 줄여버렸다
이로인해 높은 이식성 또한 갖추게 되었다
빌드된 이미지는 도커가 설치된 머신이라면 어디서든 실행할 수 있기 때문이다
구성관리의 용이함
일정규모를 넘는 시스템은 보통 여러개의 어플리케이션과 미들웨어를 조합하는 형태로 구성된다
도커를 사용한다고해도 이 부분은 여전히 어려운 문제이다
하지만 도커는 이 문제를 해결했다
설정파일을 사용하여 컨테이너 간 의존 관계와 시작 순서롤 제어할 수 있는 docker compose를 개발했고,
대규모 트래픽에 맞춰 어플리케이션을 오케스트레이션 해주는 docker swarm 을 개발했다
그리고 최근에는 끝판왕으로 등장한 구글의 쿠버네티스
가 있다
이렇듯 도커는, 도커를 편리하게 사용할 수 있게 해주는 주변 도구가 잘 갖춰져 있다는 장점도 가지고 있다
이러한 장점으로 도커는 굉장히 빠른 속도로 전파되어갔고, 사실상 표준(de fecto)가 되어 새로운 개발스타일을 많이 만들어내게 되었다
도커 설치 및 실행
앞서 언급한 Cgroups, namespaces는 리눅스 기술이기 때문에 mac이나 Windows에서 바로 사용할 수 없다
그러므로 LinuxKit 이라는 경량 시스템을 실행하고, 그 위에서 컨테이너를 실행하는 구조로 동작한다
물론 직접 설치할 필요는 없고 mac, windows 용 도커 설치하고 실행 시 자동으로 같이 실행된다
설치 및 실행법은 좋은 글이 있어서 아래의 글로 대체한다
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
참고 :
- 야마다 아키노리, 『도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문』, 심효섭 옮김, 위키북스(2019)
- https://www.joinc.co.kr/w/man/12/docker/InfrastructureForDocker/about
- https://tech.ssut.me/what-even-is-a-container/