20.06.06 충남대학교 컴퓨터공학과 SW사업단에서 주최한 클라우드 및 도커 특강 1주차 클라우드 및 도커 기초 수업의 정리입니다. 9시간이나 들였는데, 확실히 제 것으로 만들어야죠!
도커는 위와 같은 로고를 가지고 있어요. 컨테이너를 싣고 있는 고래의 로고, 그리고 항만 노동자라는 의미의 Docker. 뭔가 감이 오시나요??
'컨테이너를 싣고 내리는 동작을 하는 프로그램이겠구나..' 라는 생각이 드신다면 정답입니다! 컨테이너가 무엇이냐의 문제일 뿐이죠. 컨테이너를 통해 가상화를 수행한다는 점만 아시면 퍼펙트하겠네요. 그렇다면 다른 이야기보다 가상화에 대한 이야기를 먼저 하고 도커 이야기로 다시 와볼게요!
가상화는 소프트웨어 기반, 즉 가상으로 애플리케이션, 서버, 스토리지, 네트워크와 같은 어떤 사물을 표현하기 위한 과정으로서, 모든 규모의 비즈니스에서 IT 비용을 절감하면서 효율성과 대응력을 높일 수 있는 효과적인 방법이에요.
너무 어렵다구요?? 그냥 하나의 하드웨어에서 리소스를 나누어서 여러개의 하드웨어로 수행할 작업을 하나의 하드웨어에서 하도록 도와주는 프로그램이라 생각하시면 편해요.
가상화의 등장 배경을 간단히 알아볼게요
x86 서버의 한계로 인해 많은 IT 조직이 오늘날의 높은 스토리지 및 처리 요구를 충족하는 데 필요한 용량을 운영하기 위해서는 용량의 일부분만 활용하는 서버를 여러 대 구축해야 하며, 그 결과 엄청난 비효율성과 과도한 운영 비용이 발생하게 되었습니다.
여기에 가상화가 도입되면 소프트웨어로 하드웨어 기능을 시뮬레이션하여 가상 컴퓨터 시스템을 생성하며, 이를 통해 IT 조직은 하나의 서버에서 둘 이상의 가상 시스템과 다수의 운영 체제 및 애플리케이션을 실행할 수 있게 됩니다. 이에 따라 규모의 경제성, 높은 효율성과 같은 이점을 누릴 수 있습니다.
그래서 이러한 가상화를 수행하기 위해서 가상머신(VM)이 등장해요. 가상화를 도와주는 Tool인데, 이건 정말로 컴퓨터 안의 컴퓨터라고 부를만 해요. 모 수업의 실습은 한 컴퓨터에 윈도우를 세개씩 돌리고 있으니...ㅠㅠ
이러한 가상머신은 주로 VirtualBox, VMware 등등이 사용되어 왔어요.
컴퓨터 안의 컴퓨터, 앞서 말했던 가상머신들은 OS전체를 가상화시켜서 진짜 또 하나의 컴퓨터처럼 사용했어요. 전가상화라고 불리는 방식이죠. 하지만 위의 방법은 큰 단점이 존재했어요. OS를 두개 돌린다고 생각하면 바로 드는 생각!
'와 정말 무거운 프로그램이다....'
그렇지 않나요? 간단히, OS를 쓰기 위해 OS전체를 사용해버리자! 라는 생각이죠. 정말 간단하지만, 느리고 무겁다는 큰 단점이 존재했어요.
이러한 문제를 해결하기 위해 반가상화라는 방법이 고안되었는데요, 이 방법은 Guest OS가 필요는 하나, OS전체를 가상화시키지 않는 방법이죠. 가상화시키는 크기가 줄어드니 가벼워짐은 말할 필요도 없구요.
하지만, OS를 설치해서 사용하는 이상, 성능의 문제는 해결되지 않았습니다. 전가상화든 반가상화든 추가적인 OS를 설치하여 가상화하는 방법은 어쨌거나 성능문제가 있었고 이를 개선하기 위해 프로세스를 격리하는 방식이 등장합니다.
리눅스에서는 이 방식을 리눅스 컨테이너(LXC) 라고 합니다. 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작하며, CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하기에 성능적으로도 거의 손실이 없습니다. 이 방식이 도커의 기초가 되죠. 이러한 가벼운 가상화기술의 수요에 인하여 도커가 등장하고 성장하게 됩니다.
앞에서 도커가 어떤 느낌의 프로그램이라고 했죠??
'컨테이너를 싣고 내리는 동작을 하는 프로그램이겠구나..'
이제 여기서 컨테이너가 무엇을 의미하는지, 아시겠죠?? 위에서 말했던 프로세스를 격리하는 방식인 리눅스 컨테이너를 의미해요. 이해를 돕기 위해 위의 사진을 한번 더 볼게요.
양 측의 차이를 보면 오른쪽이 확 줄어들었죠??
컨테이너는 Application 실행에 필요한 바이너리만 남겨서 도커 엔진 위에 올려둔 형태랍니다.
도커를 사용하다보면 또 이미지라는 개념이 있어요. 컨테이너랑 굉장히 헷갈리게 하는데 간단히 알아볼게요.
이미지 : 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것
그래서 상태값을 가지지 않고 변하지 않아요. 컨테이너가 되기 이전의 상태인 것이죠. 컨테이너는 이미지를 실행한 상태라고 볼 수 있구요. 그래서 하나의 이미지에서 여러 개의 컨테이너가 만들어질 수 있고, 컨테이너 내부에서는 많은 변화가 일어나도, 이미지에는 아무런 변화가 일어나지 않죠.
정리하면, 이미지는 컨테이너를 위한 모든 정보를 들고 있고, 변하지 않는 특성을 가지고 있는거죠. 컨테이너 이전의 단계.
빠르고 가벼운 가상화 솔루션
호스트의 운영체제를 공유해 필요한 최소한의 리소스만 할당받아 동작하는 방식이에요.
단일 호스트에서 다중 워크로드를 구동할 수 있기 때문에 하이퍼바이저 기반 가상화솔루션에 비해 훨씬 더 가볍게 가상화 환경을 구성할 수 있습니다.
개발자에게 자유로운 개발보장
개발 언어나 툴에 상관없이 어떠한 애플리케이션이라도 만들 수 있으며, Docker에서 만들어진 애플리케이션은 이동성이 좋아지고 어디서나 실행될 수 있어요. DockerHub를 통해서 공유도 굉장히 편하구요.
뛰어난 보안성
서비스가 해킹되더라도 격리되어있어 원래의 서버에 영향을 미치지 않는 구조로 되어있습니다.
협업의 이점
다른 가상화 툴을 이용하여 협업해보신 분들은 체감하시리라 생각합니다. 버전 맞추는 것이 얼마나 성가신 작업인지...
하지만, 도커를 이용하면, 한 사람이 만들어서 DockerHub에 올려두면 협업자들 모두가 동일하게 이용할 수 있어요. 다른 고수분들이 만들어 둔 이미지를 찾아볼 수도 있겠네요.
사실 Docker를 처음 써본 것은 큰 이유는 아니고, pipenv가 너무 짜증나는 것이 이유였습니다. 버전을 공유하기도 불편.. 하나하나 설치하기도 불편.. 특히 파이썬 버전이 다르면 파이썬 재설치하고,,,
이런 하찮은 이유들을 도커는 말끔히 정리해주었습니다. 정말 고마운 친구네요.
다음 시간에는 도커를 실전에 사용하는 방법을 알아보려고 합니다! 함께 가보아요!