Docker는 컨테이너를 만들고 사용할 수 있도록 도와주는 도구이다. 🤔 그럼 컨테이너가 무엇일까 ?
소프트웨어에서 컨테이너라는 것은 표준화된 소프트웨어 유닛이다. 🤔 그럼 소프트웨어 유닛이라는 것은 무엇일까 ?
소프트웨어 유닛은 기본적으로 코드 패키지를 나타냅니다.
즉, 해당 소프트웨어를 실행할 수 있는 것들을 모아둔 것입니다.
예르들어, 프로그래밍 언어를 실행할때는, 코드
, 런타임
등 다양한 도구들을 모아둔 것이라고 할 수 있다.
소프트웨어에서 컨테이너 == 소프트웨어를 실행하기 위한 도구들의 모임
하지만 컨테이너라는 개념이 쉽게 이해가 되지 않는다. 왜냐하면 우리는 컨테이너라고 생각하면
사진 속 컨테이너가 떠오르기 때문입니다 ... 😂😂😂
그렇다면 사진 속 컨테이너의 역할을 자세히 알아보자.
사진속 컨테이너는 실제로 어떠한 물건을 옮기기 위해서 배나 트럭에 싣는 역할을 합니다. 그리고 컨테이너에 들어간 물건들은 보관되고 자체적으로 격리됩니다.
즉, 컨테이너의 담기면 다른 컨테이너와 섞이지 않는다는 것입니다.
이처럼 Docker는 컨테이너 기술 및 컨테이너를 구축하는 도구로서, 소프트웨어의 유닛 (코드, 런타임 등 코드 실행을 위한 종속성)들을 보관할 수 있고, Docker가 실행되는 모든 곳에서 사용할 수 있다.
💡 컨테이너는 개별적으로 따로 설정없이 소프트웨어를 실행할 수 있도록 코드, 라이브러리, 환경설정 등을 모아둔 것이고, Docker는 이러한 컨테이너를 만들고 사용하는 도구이다.
🤔 이떄 내가 궁금해진 부분은 바로 VM과 Container는 뭐가 다른걸까 ? 그리고 왜 Container를 선호하는 걸까 ?
VM은 일반적으로 크기가 기가 바이트단위이다. 일반적으로 VM은 자체 OS를 포함하고 있어 리소스 집약적인 기능 여러 개를 동시에 수행할 수 있다. 이처럼 VM에서는 사용할 수 있는 리소스가 늘어남에 따라 VM은 전체 서버, OS, 데스크탑, 데이터베이스, 네트워크를 추상화, 분할, 에뮬레이션할 수 있습니다.
VM에 대한 정의를 살펴보아도 너무 어렵게 느껴진다... 😂😂😂
위 사진을 보고 천천히 이해해보자.
VM을 사용한다는 것은 Host OS 위에 새로운 OS(Guest OS)를 설치한다는 것이다. 즉, 컴퓨터 내부의 컴퓨터를 만든다는 것이다.
다시 말해, VM은 가상으로 존재하지만 다른 머신이기 때문에 추가적인 무엇이든 설치할 수 있고, 에뮬레이션이 가능합니다.
하지만 VM은 매우 오버헤드라는 치명적인 단점을 가지고 있습니다.
왜냐하면 VM은 Host OS 내부에서 실행되는 독립적인 컴퓨터로서, Guest OS 전체를 가상화하기때문에, VM의 수가 많아진다면 메모리, CPU, 하드 드라이브 등 다양한 리소스들의 낭비로 인해 무겁고 느려집니다.
예를들어, 3개의 VM이 존재하는데 3개의 VM 모두 OS가 Linux라면 각 VM에 Linux OS가 별도로 설치되어 중복으로 낭비가 발생한다는 것입니다.
장점 | 단점 |
---|---|
분리된 환경 | 중복, 복제로 인한 낭비 발생 |
환경별 독립적인 구성 가능 | 중복, 복제로 인한 성능저하 |
안정적으로 공유 및 재생산 가능 | 공유 및 재생산이 가능하더라도 공유할수 있는 단일 구성 파일이 없어서 공유하기 위해서는 동일한 환경을 구성해야하기 때문에 각각의 설정이 필요로 |
따라서, 이러한 문제점을 해결하기 위해 Container를 사용하는 것이고, 핵심 개념입니다.
Container는 일반적으로 크기가 메가 바이트_단위이다. 앱을 실행하는데 필수적인 모든 파일이 컨테이너에 패키징 되는 것은 아니며, 특정 작업을 수행하는 단일 기능이 컨테이너에 패키징되는 경우가 많다. 이처럼 컨테이너를 경량화 속성과 공유 운영 체제__로 인해 여러 환경 간에 매우 쉽게 이동할 수 있다.
이처럼 Container는 VM의 무겁고 성능문제 이슈를 해결하기 위해 프로세스를 격리하는 방안으로 등장하였습니다.
🤔 그렇다면 Container는 VM과 무엇이 다르길래 문제점을 해결한 것 일까 ?
Container는 하나의 머신에 여러개의 머신을 설치하지 않으며, 하나의 OS를 공유하는 구조입니다.
그러면 어떻게 여러개 Container가 생성 가능하다는 것일까 ?
바로, Host OS에 기본적으로 내재된 컨테이너 에뮬레이트를 지원하는 내장 컨테이너를 활용합니다.
그리고 Docker가 이것을 작동하도록 처리하여 Container를 생성하고 관리하는 것입니다.
위 사진을 보면 Container는 Host OS설치까지는 동일하지만 그 위에 HyperVisor(VM가상화도구)가 아니라 Runtime Engine(컨테이너가상화도구)가 있다.
💡 컨테이너 가상화 도구 - Docker, rkt, LXC 등
그 중 Docker를 가장 많이 사용한다. 그리고 Docker가 컨테이너를 만들어주는 것이다.
하지만 Container가 무조건 좋은 것은 아니다. 왜냐하면 Container는 Host OS의 내재된 내장 컨테이너를 활용하기 때문이다.
📌 Container는 Host의 커널을 공유하여 격리 공간을 생성하는 하나의 프로세스 이기 때문입니다.
VM은 하나의 OS를 설치하여 물리적으로 격리했다고 할 수있지만, Host의 커널 공유로 인해 Container는 논리적으로 격리했다고 할 수 있습니다.
따라서, OS의 커널을 공유하기 때문에 컨테이너 하나가 보안에 노출되면 모든 컨테이너가 위험하다.
VM은 하이퍼바이저 위에 Guest OS,Binary, 라이브러리 등 모두 구성해야하기 때문에 무겁고 성능저하(오버헤드)가 발생한다.
더 쉽게 말해 VM은 가상의 컴퓨터 하나를 캡슐화하는 것이다.
그리고 Container는 Docker 내부의 Engine을 이용해 어플리케이션과 Binary 및 라이브러리만을 캡슐화하여 올리면 된다.
조금 더 쉽게 설명한다면, Container는 하나의 OS를 공유하는 형태로 논리적인 격리를 의미하고, VM은 각각의 OS를 띄우는 형태로 가상이지만 물리적인 격리를 의미한다.