본문 바로가기

개발

간략하게 알아보는 docker 개념

개요

서버 배포시 거의 필수가 되어버린 docker에 대해 짤막하게 알아보자. docker의 등장배경과 가상머신과의 비교를 통해 docker의 장점에 대해 알아보려고한다.

 

Docker란?

docker는 "컨테이너 기반의 가상화 도구"이다. 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있게 도와준다.

 

여기서 보다 자세히 알아볼 키워드는 컨테이너와, 가상화이다.

 

컨테이너

docker는 서버 런타임에 필요한 모든 것들을 도커 이미지로 빌드하게 되면 이를 컨테이너 단위로 실행, 중지 시켜준다.

node.js 런타임 환경 예시

 

위의 그림을 보면 웹서버 구동에 필요한 코드, node, dependencies, 환경변수등 모든 것이 빨간색 컨테이너에 담겨 있다는 것을 알 수 있다.

 

가상화가 필요한 이유

AWS 비용이 부담이 되어 집에서 사용하고 있는 데스크탑을 우리가 개발했던 모든 토이프로젝트의 서버로 쓴다고 가정해보자. 여기서 십중팔구 런타임 환경이 일치하지 않아 이슈가 발생할 것 이다. 서버 한대에 서로다른 런타임을 가지는 프로젝트들을 배포한다는 것은 매우 골치 아픈일이다. 그렇다고 서버 한대에 프로젝트 한개만 올린다면 H/W 성능을 최적으로 활용하지 못할 것 이다. 이를 위해서 필요한 것이 가상화이고, 가상화를 화용하면 서버의 성능을 독립적, 효율적으로 사용할 수 있다.

 

Virtual Machine과 컨테이너기반의 가상화

가상화 기술은 이미 docker이전부터 사용되였던 기술이고, docker는 위에서 말했듯이 컨테이너기반의 가상화 도구이다.

VM과 컨테이너간의 차이 (출처 - 드림코딩)

 

위 그림은 docker이전에 존재하였던 Virtual Machine(VM)을 활용한 가상화 방식과 컨테이너기반의 가상화 방식을 도식화한 것이다. 가장큰 차이점은 VM방식에서는 Guest OS가 머신 한대당 존재하는것에 반해 컨테이너 기반의 방식에서는 Host OS만 존재한다는 것이다.

Virtual Machine의 단점

하이퍼 바이저의 역할

가상화 작업은 반드시 하이퍼 바이저를 거치는데, 이는 위 그림을 보면 알 수 있듯 H/W에게 서로 다른 OS를 구동시켜 줄 수 있게끔 하는 역할을 하고 있다.

위에서 언급했듯이 머신 한대당 Guest OS(Window, Red Hat, macOS)가 각각 필요하고 운영체제는 서버를 구동시키기에는 불필요한 것들까지 포함하고 있어 가상머신의 이미지가 매우 커진다.

 

컨테이너기반의 가상화

💡 프로세스 단위의 격리 환경

 

linux 운영체제의 chroot, namespace, cgroup을 활용하여 프로세스 단위의 격리환경을 제공한다. 하나의 서버를 구성하는데 운영체제 전체를 같이 구성하는것은 매우 비효율적이다.

 

쉽게말하면, 운영체제 포함하지 않아 VM보다 경량화되었고, 컨테이너 엔진(docker engine)이 설치된 호스트 os를 공유한다. 그리고 대표적이고 자주쓰이는 컨테이너 엔진이 바로 docker이다.

 

컨테이너?

docker 환경에서 하나의 단위가 되는 컨테이너에 대해서 잠깐 짚고 넘어가자.

 

컨테이너의 사전적 의미는

💡 어떤 물체를 격리하는 공간 / 각각의 컨테이너는 격리된 상태로 다른 컨테이너들과 분리됨

 

docker 환경에서의 기술적 의미

💡 프로세스 단위의 격리환경 / 프로세스의 생명주기를 관리

 

Spring boot 1개 Nginx 1개를 컨테이너에서 실행한다면?

 

위 그림에서는 Spring Boot App과 Nginx App이 각기다른 컨테이너에서 구동되고 있다. 주목해야할 점은 하나의 커널을 통하여 하드웨어 리소스를 사용하고 있다는 점이다.

 

Why Container?

💡 Host OS와의 격리를 통해 독립된 개발 환경을 보장한다.

 

컨테이너를 하나의 프로세스로 바라보고, 프로세스 확장, 관리가 용이해진다.

프로세스(컨테이너) 확장, 관리 → Docker Engine