sklass의 s-class 프로그래밍 blog

도커(Docker) 기초 본문

docker

도커(Docker) 기초

sklass 2021. 8. 25. 11:24

도커(Docker)는 2013년에 등장한 컨테이너 기반 가상화 도구로, Go 언어로 개발되었습니다. 

 

도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지(프로세스 실행 환경)을 구축할 수 있도록 해줍니다. 도커를 사용하면 이 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들 수 있습니다. 이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능합니다.

 

도커(Docker) VS 가상머신(VMWare, VirtualBox)

하드웨어를 소프트웨어로 에뮬레이션하는 가상머신은 이미 대중적인 도구가 되었습니다. 가상머신을 실행하는 호스트 머신에 가상화된 하드웨어와 OS를 구축함으로써, 호스트와는 다른 환경을 구축하고 개발과 테스트를 비롯한 다양한 목적으로 사용할 수 있습니다. 

 

컨테이너는 하드웨어를 소트프웨어로 재구현하는 가상화(=가상머신)와는 달리 프로세스의 실행 환경을 격리합니다. 컨테이너가 실행되고 있는 호스트 입장에서 컨테이너는 단순히 프로세스에 불과합니다만, 사용자나 컨테이너 입장에서는 호스트와는 무관하게 동작하는 가상머신처럼 보입니다. 그래서 컨테이너형 가상화라고 부르기도 합니다.

 

LXC(리눅스 컨테이너)로 부터 파생된 도커 컨테이너는 이러한 컨테이너 형 가상화를 지원하는 도구 중 하나로, 가상머신과는 근본적으로 다른 접근을 가집니다.

 

도커는 가상머신과 같이 하드웨어를 가상화하는 것이 아니라, 리눅스 운영체제에서 지원하는 다양한 기능을 사용해 컨테이너(하나의 프로세스)를 실행하기 위한 별도의 환경(파일 시스템)을 준비하고, 리눅스 네임스페이스와 다양한 커널 기능을 조합해 프로세스를 특별하게 실행시켜줍니다. 이는 가상머신과 같이 하드웨어를 가상화하는 것이 아니라, 운영체제 상에서 지원하는 방법을 통해서 하나의 프로세스(컨테이너)를 실행하기 위한 별도의 환경을 구축하는 일을 지원하고, 도커는 바로 프로세스를 격리시켜 실행해주는 도구라고 할 수 있습니다.

 

더 세부적인 차이점은 아래와 같습니다.

격리 레벨

컨테이너와 가상머신의 차이는 격리 레벨의 차이에서 발생합니다.

 

가상머신과 컨테이너의 격리 레벨 차이

먼저 가상머신의 경우 가상화된 하드웨어(Hypervisor) 위에 게스트 OS가 올라가는 형태로 거의 완벽하게 호스트와 분리된다고 볼 수 있습니다.

반면 컨테이너는 OS 가상화로, OS를 가상화해서 올리고 커널은 호스트와 공유하는 형식이기 때문에 가상머신 보다는 낮은 수준의 격리를 제공합니다.

 

이미지 크기

가상머신은 각각의 가상머신 마다 게스트OS가 설치되는 형태입니다. 반면 컨테이너는 컨테이너 엔진 위에 어플리케이션 실행에 필요한 바이너리만 올라가는 형태로, 그 외 커널 부분은 호트스의 커널을 공유합니다. 이러한 이유로 컨테이너가 가상머신보다 이미지 크기가 작습니다.

 

이미지 크기가 작다는 것은 공간을 절약하고 네트워크 트래픽을 줄일 수 있는 장점을 가집니다. 또한 컨테이너의 경우 이미지를 인터넷에서 받아오기 때문에 클라우드 환경에서 요금을 줄일 수 있는 장점도 있습니다.

 

스피드

가상머신은 호스트와 거의 분리된 형태이지만, I/O가 일어날때는 이야기가 달라집니다.

가상머신이 처리한 I/O를 호스트OS의 커널이 다시 받아 자신에게 맞게 처리하기 때문에 부하가 발생하기 때문입니다.

 

반면 컨테이너는 호스트와 커널을 공유하기 때문에 I/O가 쉽게 처리될 수 있고 이러한 이유로 가상머신보다 빠르다고 할 수 있습니다.

 

서비스 배포

가상 머신의 경우, 어플리케이션의 개발 소스 버전업을 하기 위해서는 기존 소스를 삭제하고 버전업된 소스를 배포해야하는데, 만약 여기서 서버 환경이 달라 에러가 난다면, 100대의 서버를 하나하나 수정하기란 쉽지 않을것 입니다. 

하지만 컨테이너 환경의 경우, 개발 환경에서 테스트를 마친 이미지를 운영 환경 이미지로 만들어 레지스트리에 배포하고 이전 운영 이미지를 내리고 신규 운영 이미지를 올리면 버전업 작업이 모두 끝납니다. 또한 같은 컨테이너 엔진에서 테스트 했기 때문에 서버 환경이 달라서 에러가 날 확률은 거의 없습니다.

 

보안

컨테이너의 경우 호스트OS를 공유하기 때문에 만약 호스트가 악의적인 공격에 노출 되었다면 모든 컨테이너가 위험해 질 수 있습니다.

 

반면 가상머신의 경우 호스트와 게스트간 공유되는 것이 없기 때문에 하나의 VM이 공격 당했다하더라도 거의 완벽하게 다른 VM이나 호스트는 보호되는 형태가 됩니다. 이러한 이유로 아키텍처로 보았을때 가상머신이 컨테이너보다 안전합니다.