[Docker]도커(Docker)란 ? , VM vs Container
1. 도커탄생 이유
우리는 기존에 웹을 개발할 때, 본인이 사용하는 운영체제(Window, MacOS 등) 위에서 Visual Studio와 같은 IDE(통합개발환경)을 설치하고 거기에 여러가지 라이브러리를 설치하여 개발을 진행했다.제가 웹개발을 할 때는 대략적으로 다음과 같은 과정을 거쳤습니다. 윈도우 운영체제 → 파이썬 설치 → VSC(Visual Studio Code) 설치 → 프레임워크 Django 설치 → 다른 웹사이트의 정보를 크롤링을 위한 BeutifulSoup 라이브러리 설치 → DB 설치 및 연동 ... 다시 무에서 유를 창조하듯이 새로 해야한다 .
또한
서버를 관리하는 일은 매우 복잡하고 어려운 작업이다. 만약 서버를 개발할때 개발 환경이 바뀌게 된다면 컴퓨터 세팅이나 프로그램 등을 처음부터 다시 설정을 해야한다. 여기서 사용하는 프로그램을 다 바꿔줘야하기때문에 매우 번거롭다는 문제가 발생한다. 특히 devops나 MSA가 유행하면서 micro service들이 잘 나뉘면서 관리가 더욱 복잡해지게 되었다. 또한 새로운 tool이 생겨나고 클라우드의 발전으로 설치해야할 서버가 많아지는 상황에서 서버 관리 방식의 변화가 필요했다.
이 문제점을 해결할 플렛폼 도커가 개발이 됐다.
2.docker 란 ?
컨테이너 기반의 오픈소스 가상화 플랫폼이다. 가상화란 물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이다. 다양한 프로그램과 실행환경을 컨테이너로 규격화 시켜 프로그램의 배포 및 관리를 단순화 시킬수 있다. 프로그램의 도트 뿐만아니라 실행에 필요한 모든 dependency들도 컨테이너에 담기 때문에 다른환경에서도 빠르게 애플리케이션을 실행 할수 있다. 또한 가상 머신처럼 독립된 실행환경을 만들어 주는 것으로 운영체제를 설치하는 것과 유사한 효과를 낼 수 있지만 실제 운영체제를 설치하지 않기 때문에 설치 용량이 적고 실행 속도가 빠르다.
개발/실행환경이 달라도 컨테이너로 규격화 시킨 프로그램들이 어떻게 잘 작동이 될까? 그것은 도커 컨테이너들이 도커 엔진 위에서 실행되기 때문이다. 그래서 도커가 설치되어 있는 곳이라면 모든 환경에서 동일하게 작동할 수 있다.
그런데 이런 구조면 VM(가상환경)과 비슷한 구조를 같고 있다.
그럼 VM이랑 컨테이너랑 어떤게 차이점이 있을까 ?
1. VM
VM은 하이퍼바이저를 통해 하드웨어를 에뮬레이션하는 방법으로 가상 이미지 마다 게스트 OS를 사용해야한다. 하이퍼바이저 위에서 필요한 만큼의 지원이 할당된 가상의 컴퓨터으로 ,각각의 VM은 서로간의 공유를 하지 않고 독립적으로 실행된다.
그러면 하이퍼바이저란 무엇인가 ?
하이퍼바이저는 하나의 물리적인 컴퓨터 위에 여러개의 게스트 os를 동시에 실행할 수 있게 해주는 플랫폼이다. 컴퓨터의 자원에 대한 가상화 레이어를 제공하며, 이를 통해 각각 VM에 필요한 리소스를 할당을 한다.
하이퍼바이저는 2가지의 유형으로 나뉜다.
1번째 유형은 물리적인 하드웨어 위에 바로 하이퍼바이저가 위치한 유형으로 , bare-metal hypervisor이라고 부른다. 이 경우 하이퍼바이적 간다한 OS의 역활을 수행하며, Host는 가상화 목적 이외의 용도로 사용할 수 없다. 그래서 Host os가 개입하지 않아서 높은 성능과 안정성을 제공하기 때문에 대부분 Enterprise 환경에서 채택하는 방식이다.
리소스 부족, 장애 등의 이유로 Baremetal에 문제가 발생할 때 다른 Baremetal로 VM을 이동할 수 있다. 관리자가 콘솔을 통해 직접 수행하거나, 자동으로 진행하도록 설정 가능하다. 또한 물리적인 자원양을 초과해서 할당(over-allocation)할 수 있는데, 이는 전체 VM에 할당한 리소스가 실제 하드웨어 스펙을 넘어가도 문제가 없다는 얘기다.
2번째 유형은 Host Machine에 OS가 설치되어 있고 그 위에서 Hypervisor가 수행되는 방식으로 'hosted hypervisor'라고 부르기도 한다. 일반적으로 소프트웨어 테스트나 연구를 위한 샌드박스로 사용된다. VM 생성시, Baremetal의 하드웨어 스펙을 초과할 수 없기 때문에 리소스 할당에 어느 정도 제약이 존재한다. 대표적인 제품으로는 VirtualBox(Oracle), Workstation Pro(VMware), Parallels(MacOS) 등이 있으며, 기능이나 성능은 대동소이하므로 본인 환경과 재정에 맞는 것을 선택하면 된다.
2. Container
컨테이너는 커널 하나에 격리된 여러 개의 사용자 공간 인스턴스가 포함 될 수 있도록 애플리케이션 수준에서 이루어지는 가상화의 일종이다. 이런 인스턴스를 컨테이너라 부른다. 또한 애플리케이션 코드, 런타임 ,시스템 도구, 시스템 라이브러리 및 구성을 하나의 인스터느에 패키징하는 기본적이 방법을 제공한다. 그리고 컨테이너는 Host OS를 공유한다.
정리를 하자면 컨테이너의 기술은 App layer에서의 추상화이다 즉 여러 커네이너들이 똑같은 하나의 머신 위에서 OS커널을 공유한다. 그러나 user space에서는 독립적인 프로세스로서 존재한다.
[ 컨테이너와 가상머신(VM) 의 차이 ]
하이퍼바이저 형 가상화 | 컨테이너 형 가상화 | |
시작 시간 | 길다 (분) | 짧다 (초) |
컨테이너 무게 | 수 GB ~ 수백 GB OS + 애플리케이션 + 런타임 소프트 웨어 |
~ 수백 MB 애플리케이션 + 런타임 소프트웨어 |
Guest OS | Windows/Linux 등 다양한 선택 가능 | 호스트 OS와 동일한 OS |
이식성 | 대부분 가상 이미지에 대한 변환이 필요 | 컨테이너 이미지 그대로 사용 가능 |
데이터 관리 | VM 내부 또는 연결된 스토리지에 저장 | 컨테이너 내부에 있는 데이터는 종료시 소멸되며, 필요에 따라 스토리지를 이용하여 저장 |
Guest OS 와 관계 | Guest OS는 하드웨어(가상)로 인식 | Host OS를 커널 수준으로 분리하여 OS를 가상화 형태로 사용, 필요에 따라 호스트와 리소스 공유 가능 |
시스템 성능 | 각 가상 머신마다 전용 운영 체제가 있기 때문에 가상 머신에 구축된 애플리케이션을 실행할 때 메모리 사용량이 필요 이상으로 많아져 가상 머신이 호스트에 필요한 리소스를 모두 사용할 수 있다. | 컨테이너화된 애플리케이션은 완전한 가상 머신보다 리소스를 더 적게 사용하고 호스트 메모리에 가해지는 부담을 줄일 수 있도록 운영 체제 환경(커널)을 공유한다. |
유지관리와 업데이트 | 운영 체제를 업데이트하거나 패치할 경우 기존 컴퓨터를 하나씩 업데이트해야 하고 각 게스트 OS를 개별적으로 패치해야 한다. |
컨테이너 호스트(컨테이너를 호스트하는 컴퓨터)의 운영 체제만 업데이트하면 됩니다. 따라서 유지관리가 매우 간소화된다. |
- VM의 대표적 단점: 하이퍼바이저 위에 Guest OS 가 올라가는데 그 위에 Binary, 라이브러리 등을 모두 구성해야 하기에 무겁고 성능저하가 발생한다. ( 오버헤드 )
- 컨테이너의 대표적 단점: 보안 이슈가 있다. 컨테이너는 커널을 공유한다. 즉, 논리적으로 격리한 개념인데 당연히 물리적으로 격리한 가상머신에 비해서는 보안이 취약 할 수 밖에 없다. 그리고 컨테이너는 MSA( Microservice Architecture ) 와 최적화 되었을때 빛을 본다.
도커 레이어
-출처-
https://cwal.tistory.com/15?category=947713 https://born-dev.tistory.com/39
하이퍼바이저(Hypervisor)
하이퍼바이저(Hypervisor)는 하나의 물리적인 컴퓨터(Host Machine) 위에 여러개의 Guest(VM; Virtual Machine)를 동시에 실행할 수 있게 가상화하는 플랫폼을 의미한다. CPU(core), 메모리, 기타 물리적 자원(ex: N
cwal.tistory.com
https://born-dev.tistory.com/39
컨테이너 vs 가상머신
[가상머신 ( Virtual Machine , VM )] 클라우드 서비스 형태로는 기본 엔진 (AWS : EC2 , GCP : CGE 등) 으로 제공된다. VM의 구현 방법에 따라 다르지만, 기본적으로 하이퍼바이저가 여러개의 VM을 띄우고 실행
born-dev.tistory.com
https://code-lab1.tistory.com/236
도커(Docker)란 무엇인가? 컨테이너와 가상 머신의 차이점
서버 관리의 어려움 서버를 관리하는 일은 매우 복잡하고 어려운 작업이다. 만약 서버를 개발할 때 개발 환경이 바뀌게 된다면 컴퓨터 세팅이나 프로그램 등을 처음부터 다시 설정해야 한다. 시
code-lab1.tistory.com