Docker 톺아보기 1탄 - Docker랑 Container가 뭐야?
Docker가 궁금해?
== 도커가 뭐야...? ==
컨테이너 엔진(Container Engine) !!
컨테이너 기능을 쓸 수 있는 하나의 소프트웨어지!
위 그림에서
고래가 도커고,
고래 위에 네모난 것들이 도커 컨테이너야!
== 컨테이너는 또 뭔데? ==
쉽게 설명해줄게
컨테이너 뭔지 알지?
이게 컨테이너잖아
이거랑 똑같애!!
근데 하나 가정을 해보자
컨테이너에 삼겹살을 넣어서 배송을 하고 싶어
그냥 삼겹살만 넣어서 배송하면 어떻게 되겠어? 다 상하겠지?
삼겹살을 배송하려면 냉장, 냉동 설비가 구비되어있어야 한다는거지!!
그래서!!
컨테이너(Docker Container)는
삼겹살을 배송하기 위해(Application을 구동하기 위해)
냉장, 냉동 설비(Application이 동작하는데에 필요한 환경)가 설치되어 있는 것!
이라고 이해하면 쉬워!!
== 그럼 컨테이너는 왜 알아야 하고 왜 써야 하는데? ==
지금 이 시대가 원해!
시대가 흐름에 따라 소프트웨어 운영 방법도 변화해왔어
처음(Bare Metal)에는 소프트웨어가 설치되지 않은 일명 깡통 시스템에 소프트웨어를 직접 설치해서 운영했어
↓
이후 하드웨어의 성능은 높아지면서 가격이 저렴해졌어
그에 맞춰, 운영해야 하는 컴퓨터 시스템, 소프트웨어, 플랫폼 등도 많은 걸 요구하게 된거지
따라서 베어메탈 시스템에 Hypervisor 라는 가상머신을 생성하고 구성하는 소프트웨어를 만들고,
그 기술을 통해 가상 컴퓨터를 생성해
(Hypervisor에는 두가지 유형이 있지만, 패스하고 쉽게 생각해서 VMWare나 Virtual Box 라고 생각하면 돼)
생성된 각 가상 컴퓨터에서 구동하고자 하는 소프트웨어를 올려서 사용했어
↓
현재에는 Scale In, Scale out이 유연하면서 서비스 중단 없이 애플리케이션을 운영해야 하는 환경을
클라이언트(고객)들이 원하게 되었어
베어 메탈 시스템에 컨테이너 엔진을 통해 '컨테이너' 라는 가상 환경을 구성하여 애플리케이션을 운영하는거지
필요한 만큼의 환경만을 구성해서 운영할 수 있기 때문에 용량이 적고, 확장성이 좋고, 배포가 쉬워
(각 컨테이너는 분리되어 있어(isolate))
== 근데 왜 굳이 리눅스에서 돌려...? ==
도커는 애초에 리눅스 커널의 기능을 가지고 만들어졌어!
독립된 공간을 형성하는 chroot
독립된 여러 공간을 완전히 분리하는 기능을 지원하는 namespace
필요한 만큼의 하드웨어를 지원해주는 cgroup
도커는 이런 기능을 가지고 만들어졌고, 또 이런 기능들을 지원해주니 리눅스에서 돌려야지!
== 윈도우랑 맥에서는 안돼...? ==
리눅스랑 맥에는 리눅스 커널 기능이 없어
그래서 도커를 쓸때는 가상머신(Hypervisor)를 쓰는거야!
위에서 말해줬듯이 Hypervisor는 VMWare나 Virtual Box를 의미해
윈도우랑 맥에서 VMWare나 Virtual Box 같은 가상머신을 설치하고,
이 가상머신들 안에서 리눅스를 설치해서 거기서 컨테이너를 돌리는거야!
== 그냥 프로그램이랑 컨테이너랑 뭐가 달라? ==
하는 일은 똑같애!
근데 모양(구조)이 조금 달라
그냥 일반 리눅스 환경에서 프로그램(NodeJS로 짜여진 서버) 하나를 실행하려면
그 프로그램이 작성된 언어를 해석하고 실행할 수 있도록 뭔가(NodeJS)를 또 설치해야해
(Ubuntu : apt-get install ~ | CentOS : yum install ~)
그리고 끝이야? 아니지 프로그램을 실행해야지
NodeJS로 짜여진 서버를 실행한다고 치면 터미널에 $ node app.js 이렇게 쳐서 실행해야 하잖아
근데 컨테이너는 달라!
도커 파일(Dockerfile) 이라는게 있어서 거기에 필요한것들, 실행할 것들을 적어주면 도커가 알아서 다 설치하고 다 실행해줘
개꿀이지?
예를 들어줄게
#Dockerfile
FROM node:12 #냉장냉동설비와 버전
COPY app.js /app.js #삼겹살
ENTRYPOINT ["node", "app.js"] #삼겹살 배송
이게 전부야
이렇게 하면 NodeJS로 작성된 서버를 실행하는거야!
== 아니 너무 어려워 그래서 왜 쓰는건데?! ==
음... 이래도 어려우면 더 쉽게 얘기해줄게
니가 만든 걸 어디서든 그대로 돌릴 수 있어
물론 확장/축소가 쉽고 MSA나 DevOps에 적합한 구조라서 그런것도 있어
요즘 MSA 아키텍처가 대세라잖아?
그 흐름에 따라가려면 쓸 수 밖에 없는거지!
!!!!!그리고 특히!!!!!
프로그램을 아무리 잘 짜봐야 실행 환경이 안맞으면 당연히 안될거 아냐?
그중에 진짜 열받는게 버전 안맞을때!
근데 도커가 대박인게 버전도 동일하게 구성할 수 있어
그러니까 이제 버전때문에 프로그램 실행이 안되는 열받는 일은 없다는거지!
이것만 해도 도커를 쓸 이유가 충분하지 않아?ㅋㅋㅋㅋ
이런 컨테이너 기반이 아니었을 때에는,
개발자가 프로그램을 개발하면 엔지니어가 고객사에 직접 가서 환경 구성해주고 설치해주고 잘되는지 확인해야했어
(물론 지금도 그렇게 하는 곳들이 있지만...속닥속닥)
근데 또 고객사는 컴퓨터를 잘 몰라!! 갑자기 뭐가 안된대!!
그럼 또 엔지니어가 가서 왜 안되는지 봐줘야 되고~ 분명 고객사 지들 잘못인데 엔지니어가 쿠사리 먹어야되고~
이런일들이 비일비재 했던거지
근데 도커를 쓰면 이럴 일이 없어
환경도 도커가 다 해줘~ 실행도 도커가 다 해줘~
우린 개발만 하면 된다 이거지!!
너무 편하잖아!
References
따라하며 배우는 도커(따배도) - Youtube 이성미 강사