개발이든 뭐든 IT, SW쪽에 몸담고 있는 사람이라면 도커 컨테이너에 대해 한번 쯤 들어봤을 수도 있을 것 같다. 그래서 이건 뭐에 쓰는 놈이고 대략적으로 어떤 특징을 가지고 있으며, 어떤 거를 좀 알아야 할 지를 간단하게 설명하는 글을 작성해보고자 한다.

 

도커 컨테이너는 어디에 쓰는 녀석인가?

도커 컨테이너는 컨테이너라는 이름에 어울리게 무언가를 감싸고 있는 녀석이라고 생각하면 된다. 사용하는 이유와 Use-Case는 다양하겠지만, 사용 목적 자체는 가상머신(Virtual Machine)과 비슷하다.

가상머신을 사용하는 이유는 실제 머신, PC 하드웨어가 여러개 있지 않는 경우 하드웨어가 여러개 있는 것 처럼 SW적으로 사용하기 위해서 가상머신을 활용을 한다. 

하나의 PC에서 두개의 운영체제(윈도우와 리눅스 처럼)를 동시에 돌려서 무언가를 한다던지 하는 경우 가상머신을 사용할 수 있겠고, 두개의 PC가 서로 네트워크 통신을 하는 것 처럼 만들고 싶은 경우도 가상머신을 이용해서 비슷한 환경을 구축할 수 있다.

대충 사용하는 이유는 아래와 같을 수 있다.

  • 샌드박싱을 위해서
  • 간편한 환경 구축을 위해서

샌드박싱을 하는 경우는 일반적으로 보안적인 이유가 클 것이라고 생각된다. 보안회사에서 악성코드 분석 업무를 하시는 분들은 대부분 악성코드 분석을 가상머신 안에서 수행을 한다. 더군다나 동적 분석이라면 무조건적일 것이다. 그리고 환경 구축하는 방법이 복잡할때, 동일한 환경을 다른 하드웨어에서 구성을 해야하거나 배포를 해야 하는 경우, 가상머신 이미지 형태로 배포를 하게 되는 경우 환경 구축이 꽤나 쉬워진다. 집단 교육 등을 하거나 할 때 이런 방식이 편리할 수 있다.

가상머신과 비슷하다면, 그와 비교했을때 도커의 장점은?

가상머신은 하지만 큰 단점이 있다. 일단 리소스 사용량이 엄청나다. 메모리와 CPU를 호스트 OS의 것을 가져다가 게스트 OS에서 쓰는 것이므로, 실제 머신 하나 당 가상머신은 보통 1개정도만 띄우며 사용하며, 여러개를 띄우게 될 경우 스토리지 및 메모리, CPU 모두 사용량이 엄청나다. 그리고 설치 시 운영체제를 각각 새로 설치를 해 주어야 하기 때문에 구성에도 시간이 오래 걸리고, 배포 시에도 VM(Virtual Machine) 이미지는 용량이 매우 큽니다.

하지만 도커 컨테이너의 경우 가상머신과 비슷한 목표(goal)을 이룸에도, 구조가 호스트의 OS와 라이브러리들을 공유하는 형식이므로 구성 및 설치도 훨씬 빠르고 하나의 하드웨어에 수십개의 도커를 띄울 수 있습니다.

도커보다 가상머신이 갖는 강점은?

하지만 또 가상머신이 도커보다 좋은 장점이 있습니다. 아무리 비슷하게 한다고 하지만, 실제 OS까지 별도로 설치하는 가상머신의 경우 실제 환경 재현이 더욱 유사합니다. 물론 Host 운영체제를 설치를 해서 하이퍼바이저 위에서 도는 가상머신보다는 네이티브 베어메탈 운영체제가 제일 잘 맞긴 하겠지만, SW적으로는 가상머신이 환경구축의 일치율은 가장 높습니다. 도커는 그보다는 조금 낮은 일치율을 갖게 되겠지요.

예를 들어서 하드웨어적으로 붙는 장치 드라이버 등을 개발하면서 USB 포트에 해당 장비를 꽂아서 디버깅 및 테스트를 할 때, 네이티브 운영체제에 드라이버를 개발하는 것과, 가상머신안에 있는 운영체제에서 드라이버를 개발하는 것, 분명히 차이가 있겠지요?

그리고 도커 컨테이너의 경우 태생이 LXC(Linux Container)이므로, 아무래도 비 리눅스 계열의 운영체에서는 호환성이 떨어지는 편이라고 볼 수 있습니다. 초창기에는 윈도우 같은 운영체제는 아예 지원을 안하다가 지금은 지원을 하는 것으로 알고 있습니다. Linux Host에서 Linux Docker를 띄우는 경우가 가장 추천되는 상황이며, 윈도우 운영체제에서는 지원은 하지만 호환이 잘 안되는 부분이 아직 있을 수 있습니다.

(이 부분은 나중에 추가적으로 조사해서 덧붙이도록 하겠습니다.)

 

도커와 관련된 것들

도커를 사용할 때 자주 쓰이는 것들에 대해 학습을 해 놓으면 좋습니다.

Dockerhub

도커는 도커 이미지와 도커 컨테이너 이렇게 두개로 있다고 보면 되는데, 도커 이미지는 붕어빵 틀에 해당되며, 도커 컨테이너는 붕어빵이라고 보면 됩니다. 쉽게 생각하면 OOP에서 class와 object입니다. 도커 컨테이를 생성할려면 이미지를 기반으로 생성을 하게 되는데, 이 도커 이미지들이 모여있는 것이 도커허브입니다. 깃허브같은 느낌이지요. 그래서 깃허브에서 git clone을 하듯이 도커는 docker pull이라는 명령어로 도커허브에서 이미지를 받아올 수 있습니다. 이 도커허브에는 Ubuntu18.04 처럼 베이스가 되는 이미지부터, 이것저것 설정이 잘 되어 있는 이미지까지 다양하게 있으며, 여러분들도 도커 허브에 이미지를 올릴 수 있습니다.

Dockerfile

도커 이미지는 파일이 몇백 MB부터 GB단위 이상으로 커질 수 있습니다. 따라서 공유할때 엄청 무거운 대상이 되는데요, Dockerfile이라는 텍스트 형태의 파일을 이용해서 도커이미지의 내용을 기술해줄 수 있습니다. 깃헙 같은 곳에 dockerfile만 공유해도 쉽게 도커 이미지를 공유할 수 있는 셈이지요. 정확하게는 도커 이미지와 1대 1 대응이 되지는 않지만, 간편하게 환경을 공유할 수 있는 것은 사실입니다.

Docker compose

도커 컨테이너를 여러개 구성한 뒤, 포트포워딩 등을 이용해서 여러 컴포넌트가 서로 상호작용하는 마이크로 서비스를 배포하고자 할 때, Docker compose라는 걸 사용하면 편리합니다. 도커 이미지 하나를 쉽게 만들기 위해서 dockerfile을 사용한다면, 여러개의 도커 컨테이너들의 구성을 쉽게 구성하고 공유하기 위해서 docker-compose를 사용할 수 있습니다.

 

+ Recent posts