오랜만에 글을 쓰려니 마음처럼 쉽게 써지질 않는다.. 그래도 아자잣!
일반적으로 OS를 실행하기 위해서는 전용 물리적 서버가 필요하다. 1OS 1서버가 필요하다는 뜻이다. 하지만 각 서버에 사용되지 않는 부분들이 있다면, 이는 비용적인 측면에서 큰 손해로 이어진다.
이를 해결하기 위해 가상화 기술이 등장한다. 가상화 기술은 하나의 물리적 머신에서 여러 가상 환경을 생성하는 기술이다. 가상화 기술에는 여러 종류가 있지만, 가장 대표적인 것은 하이퍼바이저(Hypervisor)를 이용한 방법이다. 하이퍼바이저는 물리적인 하드웨어 위에 가상 머신을 생성하고 관리하는 소프트웨어 레이어다.
42학생이라면 이미 Born2beRoot에서 VM(virtual machine)을 다뤄본 적이 있을 것이다. 각 가상 머신은 자체 운영 체제(게스트 OS)와 응용 프로그램을 실행하는데 필요한 모든 요소를 포함하고 있다. 때문에 가상 머신들은 서로 독립적으로 실행되며, 하나의 가상 머신이 문제가 발생해도 다른 가상 머신이나 호스트에 영향을 주지 않는다.
하지만~ 이번 Inception에서 다루는 내용은 도커와 컨테이너에 대한 것이다. 그렇다면 도커와 컨테이너는 도대체 무엇인지, 이전에 배운 가상 머신과는 어떤 차이점이 있는지 살펴보자!
컨테이너에서 이미지란 컨테이너를 만들기 위한 읽기 전용 템플릿이다. 가상 머신 이미지와 기본적인 개념은 비슷하다. 실행 환경을 하나의 순간으로 포착하여 저장한다고 생각하면 된다. 때문에 여러 환경에서 동일한 동작이 보장된다.
컨테이너 이미지는 Inception 과제에서는 Debian 또는 Alphine 운영 체제 이미지에 nginx, mariadb, wordpress를 추가하여 새로운 이미지를 빌드 해야 한다.
이미지는 보통 Docker 이미지 포맷으로 저장되며, Docker를 비롯한 다양한 컨테이너 런타임에서 사용된다. 필요에 따라 베이스가 되는 이미지에 다양한 커스텀 설정을 추가하여 새로운 이미지로 만들 수도 있다.
직접 이미지를 만들기 위해서는 Dockerfile에 필요한 구성들을 기술하여 실행시키면 된다. Dockerfile의 각 지침들은 이미지에 레이어(layer)를 만들며, Dockerfile을 수정하고 다시 빌드 하면 이미지에서 바뀐 레이어만 새로 빌드 된다. 이런 특성 때문에 컨테이너 이미지는 가상 머신 기술보다 훨씬 가볍고, 빠르며, 이동성이 좋다.
이런 이미지를 실행시킨 것이 바로 컨테이너다. 그렇다면 컨테이너는 무엇인고?
컨테이너 또한 소프트웨어를 물리적인 하드웨어로부터 분리하여 실행하는 가상화 기술의 한 종류다. 컨테이너에는 애플리케이션과 실행에 필요한 라이브러리 및 의존 파일 등이 포함되어 있다.
가상 머신이 서버 하드웨어를 가상화하는 방식과 비슷하게, 컨테이너는 서버 운영 체제를 가상화한다.
이게 무슨 말이냐??? 컨테이너는 커널을 공유하는 방법으로 호스트 OS 하나에서 여러 OS를 가상화한다. 호스트 OS의 커널을 공유하기 때문에 호스트 OS가 macOS라면 그에 호환되는 리눅스 컨테이너를 실행하는 것이 일반적이며, Window 컨테이너를 직접 실행하는 것은 불가능하다.
컨테이너는 하나 이상의 네트워크에 연결시킬 수 있으며, 저장소를 따로 붙일 수도 있고, 현재 상태를 베이스로 새로운 이미지를 생성할 수도 있다.
가상 머신의 문제점은 이미지 사이즈가 거대하고, 게스트 OS로 인해 부팅 시간이 느리고, VM간의 환경이 일치하지 않아 재사용성이 낮다는 것이다.
컨테이너는 이런 가상 머신의 단점들을 보완한다. 또한 게스트 OS가 없기 때문에 OS 라이선스나 관리 비용이 절감된다는 장점이 있다.
가상 머신 컨테이너 시작 시간 몇 분 몇 초 이미지 크기 수 GB ~ 수백 GB ~ 수백 MB 게스트 OS Windows/Linux 등 다양한 선택 가능 호스트 OS 와 동일한 OS 이식성 대부분 가상 이미지에 대한 변환이 필요함 컨테이너 이미지 그대로 사용 가능 데이터 관리 VM 내부또는 연결된 스토리지에 저장 컨테이너 내부에 있는 데이터는 종료시 소멸되며,
필요에 따라 스토리지를 이용하여 저장게스트 OS와의 관계 Guest OS는 하드웨어(가상)로 인식 Host OS와 커널을 공유한 가상화 형태로
필요에 따라 호스트와 리소스 공유 가능
두 가상화 기술 중 어느 것을 사용할지 결정하기 위해서는 쉽게 이동할 수 있는 작은 인스턴스(컨테이너)가 필요한지, 아니면 사용자 정의 IT 리소스의 반영구적 할당이 필요한지를 생각해봐야 한다.
컨테이너가 적합한 경우
클라우드 네이티브 애플리케이션 빌드
마이크로서비스 패키징
DevOps 또는 CI/CD 프랙티스 촉진
동일한 OS를 공유하는 다양한 IT 설치 공간에서 확장 가능한 IT 프로젝트로 전환
가상 머신이 적합한 경우
기존, 레거시 및 모놀리식 워크로드 수용
위험한 개발 사이클 분리
인프라 리소스(예: 네트워크, 서버, 데이터) 프로비저닝
다른 OS에서 또 다른 OS 실행(예: Linux에서 Unix 실행)
https://aws.amazon.com/ko/docker/
http://www.opennaru.com/cloud/virtualization-vs-container/
https://www.redhat.com/ko/topics/containers/containers-vs-vms