Docker 알아보기 - 도커의 기본 개념
뜬금없지만 Docker 을 사용해보고 싶다는 생각이 빡세게 들었다.
바로 본격적으로 시작한다.
필자는 Google Cloud를 사용한다. ( Ubuntu 16.04 사용 중 )
일단 먼저 가볍게 설치를 한다.
(Reference : https://docs.docker.com/install/linux/docker-ce/ubuntu/ )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
|
cs |
설치 방법은 위와 같다. 그냥 복사 붙여넣기하면 알아서 설치될 거다.
도커에 대해서 설명을 시작한다. (사실 필자도 아는 형한테 배운 거 ㅋㅋ 오늘 처음으로 쓰게 됨)
간단하게 그 형의 말을 A 필자를 P로 지정한다. (약간의 각색이 포함됨.)
A. 먼저 질문 가상 머신을 쓰는 이유는 무엇일까?
P. 저번에 내가 형 서버에 rm -rf 날렸을 때를 대비하기 위해서?
A. 응. 웬만하면 그런 짓 안 하지만, 일단 너 같은 새끼도 있으니까.
암튼, 네 말처럼 그런 Sandbox 용도로도 쓰임. 또한 그 외에는 자원 절약 용도로 쓴다.
왜냐면 예를 들어서 네가 리눅스 Ubuntu를 3개 돌린다고 가정해보자?
왜 이런 구성이 되었냐면, 각자 별도의 독립적인 환경이 필요했고, 그중 하나가 니같은 애들처럼 rm -rf 를 당했다 쳤을 때를 대비해서 격리를 시켰다고 가정하자. 그래서 결국 3개로 분리를 했지만, 그렇게 되면 3개분의 자원이 소모된다 이 말이지.
그런데 Docker가 나오기 이전에 이 개념은 이미 개선이 돼있었음. 그게 바로 뭐다?
P. ? 내가 어떻게 알아 그걸
A. 하아.. 하이퍼 바이저인 것이다.
P. 그거 Windows Pro 사용자에게만 지원한다는 Hyper-V 비슷한 건가?
A. 뭐, Hyper-V 도 같은 하이퍼 바이저이지만, 윈도우 10에서 제공하는 Hyper-V 랑 실제 Hyper-V 별도 서비스랑은 다른 거임.
여기서 중요한 게 니가 Windows 10에서 된다는 Hyper-V 랑 Windows Server에서 제공되는 Hyper-V 랑은 완전 다른 거임. 어떤 식으로 틀리냐면 Windows 10의 Hyper-V는 단순하게 VMware Workstation 이랑 똑같음
Windows 10 = Vmware Workstation
단순히 그냥 윈도우10이라는 운영체제 위에 가상 머신 자체를 올리는거라서 자원은 기존의 운영체제 + 가상머신 자체 까지 두개로 더해지는거고 더 정확하게는 윈도우 10 + VMWare 프로세서 + 가상 머신 3개지
그에 비해 하이퍼 바이저의 개념은 그 가상 머신 자체에 특화된 OS 가 베이스로 깔려서 실행됨.
즉, 그냥 그 가상 머신만 돌리는 OS 그 자체란 거임.
그게 예를 들어 ESX, ESXi, Xen , KVM, Hyper-V 이런 것들임
쉽게 말해서 하이퍼바이저의 자원 효율은 기존 방식과 비교해보면 Windows 10이라는 운영체제는 필요 없고
VMWare 자체가 OS로 대체되고 그 위에서 가상 머신이 돌아가는데 여기서 특별한 기술이 더해짐.
바로 그건 자원 공유의 개념인데, 예를 들어 메모리 오버 커밋 같은 거임 들어본 적은 있음?
P. ㄴㄴ 없음
A. 하아.. 우리가 흔히 가상 머신 돌린다고 가정하고 컴퓨터 스펙이 CPU 4 코어에 8기가 램이라 치자.
근데 가상 머신은 3개를 돌려야 해, 가상 머신이 각각 요구되는 스펙이 vCPU1 코어 2기가 램이라 치면
실제로 우리는 가상 머신에게 적어도 3 코어분의 자원 처리치 와 6기가의 램은 확보를 해줘야 한다 이 말이잖아?
자 그럼 여기서
가상 머신의 스펙을 더 올린다고 쳐, vCPU4에 각각 4기가 램을 올린다고 치자. 그럼 이게 돌아갈까?
토탈 vCPU12에 램 12기가의 분량 치를 CPU4에 8기가 램이 돌릴 수 있을까?
P. 안 돌아가지. 오버 메모리 아니야?
A. ㅇㅇ 결과는 못 돌림. 당연한 거임 이건
P. 2대는 돌아가겠네.
A. ㅇㅇ 근데 3개는 다 못 돌린다는 결과임. 근데 이거를 하이퍼 바이저는 해낼 수 있음.
심지어 3개가 아니라 5개로 늘여도 가능함
어떤 식이냐, 메모리는 과다 오버로 됐지만 실제로 각자의 메모리를 봤을 때 보통은 그 가상 머신을 위해 해당 메모리량을 미리 예약으로 잡아놓고 다른 가상 머신이 액세스를 못하게 막아버리겠지만, 여기서는 공유를 하게 됨
안 쓰는 메모리는 타 가상 머신에게 바로 넘겨줘버리고 그렇게 해서 서로 안 쓰는 메모리 영역을 타 가상 머신에게 양도함으로써 어찌어찌 돌리는 구조가 되는 거임. 근데 이것도 한계가 있음
뭐 자세히는 swap 메모리나 압축 등의 기술이 다 섞인 결정체지만 여기서 문제가 뭐가 될 거 같음?
그렇게 효율적이진 않다 이거임.
도커 얘기를 하다가 왜 이게 나왔냐면 잘 생각을 해봐.
내가 맨첨에 얘기한 건 Ubuntu 서버 3대가 각자 격리된 상황에서 서비스를 돌리려고 했단말이지
그러다 보니 효율적으로 돌릴 방법을 원했던 거고? 그렇게 하이퍼바이저 위에 돌리는 구성이 됐단 말야
근데 웃긴 건 이 서버 3대가 알고 보니 같은 운영체제에 대부분의 세팅이 비슷했단 말이지 애플리케이션 레벨 부분을 제외하면 내가 뭔 말하는진 이해 감?
P. ㅇㅇ 이해중. 아 그러니까 운영체제가 동일하고 동일한 환경이니까 그 환경을 묶고 그 위에 컨테이너처럼 올리자 이런 거 아님?
A. 뭐, 비슷하긴 한데. 대충 그런 느낌임
P. 애플리케이션 레벨 부분이 뭐임?
A. 서비스를 돌리는 그런 계층? 아래 사진을 보면 이해가 될 거야.
OS는 어찌 되었든 우리는 실행되는 서비스만 잘 돌아가면 되는 거니까 OS의 자원 소모에 대한 효율성을 생각해보자니 하이퍼바이저처럼 돌리는 것 또한 어떻게 보면 그렇게 효율적이지 못했다. 이 말이지
뭐 하나는 centos 하나는 windows server 이런 식으로 돌리면 몰라도 내가 말한 예시처럼 하기에는 비효율적이었다 이 말임
그래서 나온 게 도커다 이 말이야
아무튼 핵심은 하이퍼바이저든 도커든 공통적인 목표는 결국 같음
1. 자원을 효율적으로 돌림과 동시에
2. 격리된 환경이 필요했다.
뭐 어려운 말은 최대한 안쓰면서 하고 있긴 한데, 니가 막상 이리저리 검색해보면 좀 이해한 가는 부분이 많을 거임.
맨 처음에 들어보는 게 컨테이너임. 가상 머신으로 치자면 가상 머신 그 자체 임.
컨테이너는 좀 다른 말로는 이미지라고도 하는데, 뭔 차이냐면, 컨테이너가 가상 머신이라 하면 이미지는 그것을 배포하는 입장인 것임 ova라는 확장자 파일을 앎? 대충 그런 개념임.
다시 말해서, 그냥 배포의 차원에서 이걸 기반으로 차이점을 생성해서 다른 컨테이너가 될지 아니면 복제를 할지 이런 개념?
도커의 생태계는 보다시피 꽤나 npm 만큼 성장을 해서 상당히 많은 이미지들이 올라와있거든 우리가 흔히 옛날부터 말하던 APM 같은 거, Apache php MySQL을 세팅하는 환경을 우리는 일일이 구축하지 않고 도커의 이미지 하나로 바로 구축이 된다 이 말이지,
심지어 거기다 버전의 호환성 따위 고려할 필요도 없이 그게 더 좋은 거임
파이썬도 그렇고 두 가지 이상의 버전이 설치됨으로써 막 충돌이 나거나 매번 실행할 때마다 환경변수니 alternative를 써야 하니 이런 복잡한 것들이 사라졌다 이 말임
뭐 대충 이런 것들을 써야 하는 개념을 알았으면 실전 ㄱ?
실전은 다음 편에서 :)
오탈자나 추가 문의 사항은 아래 댓글이나 pental@kakao.com 으로 보내주세요 :)