도커란 무엇이고 왜 사용하는 것일까?

youngh·2024년 9월 1일

인턴일지

목록 보기
3/4

인턴 첫날 도커를 만나다🐳🐳

현재 내가 인턴 중인 회사에서는 도커를 통해서 프로젝트를 관리하고 있다. 도커에 대해서는 익히 들어보았지만 정작 왜 사용하고 어떤식으로 사용해야하는 지에 대한 지식이 별로 없었다.

도커에 대한 충격은 인턴 첫날에 받았다. 코드를 받고 세팅을 하고 코드를 실행해 보려고 했는데 사수님이 터미널에 도커 빌드 커맨드로 실행하라고 하셨다. 도커를 써본 적이 없어 눈치가 보였지만 다행히도 사수님께서 잘 알려주셨다.

실행을 하고 나니 다른 세팅을 할 필요 없이 바로 코드가 실행되었다. 항상 장고 프로젝트를 진행할 때 직접 가상환경을 설치하고 파이썬 버전을 맞추고, requirements.txt에서 필요한 라이브러리들을 하나 하나 설치 했었는데 그럴 필요가 전혀 없었다.

이때부터 도커란 무엇일까에 대해 호기심이 생겼다. 도대체 어떤 친구길래 이렇게 편리하게 개발할 수 있게 해주는 거지?

도커란 무엇이고 왜 사용하는 것일까?

먼저, 도커란, 컨테이너 기술을 사용해서 하드웨어 자원을 효율적으로 사용할 수 있게 도와주는 가상화 플랫폼이다. 이렇게 한줄로 설명하면 잘 와닿지가 않을것이다.

먼저 다른 질문을 던져보겠다.

컨테이너란 무엇인가?

컨테이너에 대해서 알기 위해선 가상화의 개념을 알아야 한다.

가상화란?

물리적 컴퓨팅 자원을 추상화하여 여러 개의 가상 자원으로 나누고, 각 자원을 분리하여 사용할 수 있게 하는 기술을 의미한다. 이를 통해 하나의 컴퓨터에 대한 자원을 더 효율적으로 사용할 수 있다.

가상화에 대한 개념이 나온 배경부터 살펴보자.

우리는 웹이나 앱을 배포할 때 서버 컴퓨터를 필요로 한다. 하루 종일 우리가 배포한 서비스를 구동시킬 수 있는 매우 강력한 컴퓨터가 필요하다. 이를 위해 우리는 AWS EC2와 같은 클라우드 컴퓨터의 도움을 받는다. 하나의 컴퓨터에서는 하나의 운영체제(OS)만 구동이 되고 여러 애플리케이션이 실행될 수 있다. 하지만 어플리케이션 간의 직접적인 충돌을 방지하기 위해서는 서로 독립적으로 실행시켜야했다. 즉, 데이터베이스, 웹사이트, 앱 등을 각각 서버 컴퓨터에 실행을 시켜야했다.

그렇다면 어떻게 되겠는가? 회사나 큰 서비스를 만드는 사람들은 각 서비스, DB 별로 서버 컴퓨터를 하나씩 구매 혹은 대여해야했다 (DB, 웹, 관리자 서버 별로 EC2를 결제한다고 생각해보면 체감이 될 것이다.) 이는 매우 비효율적이다. 돈도 많이 나갈 뿐더러, 서버 컴퓨터의 강력한 리소스(메모리, CPU 등)를 단 10-20% 정도 밖에 사용할 수 없었다.

이에 대한 해결책으로 나온것이 바로 가상 머신(VM)이다. 가상 머신이란 하나의 OS(Host OS) 에서 다른 OS(Guest OS)들을 구동시켜 하나의 서버 컴퓨터에서 여러 앱이나 웹을 구동시킬 수 있도록 하는 기술이다.

이를 위해선 Host OS (서버 컴퓨터의 하드웨어)위에 설치된 하이퍼바이저라는 소프트웨어가 필요하다. 하이퍼바이저를 통해서 Host OS와 Guest OS 간의 통신이 가능했고 각 VM에게 하드웨어 리소스를 균형있게 할당해주었다.

이를 통해서 하나의 서버 컴퓨터로 여러 어플리케이션을 구동시킬 수 있어 비용 절감의 효과를 누릴 수 있었다.

하지만, 각 VM 별로 별도의 OS를 설치하고 실행하다 보니 (하드웨어 수준에서의 격리) Disk 용량을 매우 많이 차지하였고 부팅이 매우 느렸다. 또, 서버 컴퓨터의 CPU, RAM 등에 부담이 되었다.

VM의 대안, 컨테이너📦

이에 대한 대안으로 나온 것이 바로 컨테이너이다. VM은 Host 서버 컴퓨터 위에 각 어플리케이션 별로 전체 하드웨어(OS)를 설치한 후 어플리케이션을 실행한다. 하지만 컨테이너는 바로 어플리케이션 단위로 실행이 가능하게 만들어졌다. (프로세스 단위의 격리 수준)

어플리케이션이 실행될 때 필요한 가상환경, 라이브러리, 코드 등을 하나의 ‘이미지’로 패키징해서 이미지를 빌드하기만 하면 추가적인 하드웨어 리소스 설치 없이 바로 어플리케이션을 실행할 수 있다. 서버 컴퓨터든, 협업하는 팀원의 컴퓨터든 이미지 파일만 빌드하게 되면 바로 실행 가능하다.

컨테이너는 하드웨어 수준의 격리가 아니기 때문에 어플리케이션들이 Host OS를 공유한다. 따라서 하이퍼바이저가 필요없고 대신 컨테이너 엔진이라는 소프트웨어(도커 등)가 필요하다. 이 엔진은 컨테이너 파일을 언패킹하여 Host OS에 뿌려준다.

그렇다면 컨테이너는 어떻게 리소스 분배가 이루어질까? Host OS의 커널에서 그 일을 담당한다. OS 커널에서 각 어플리케이션이 활용할 수 있게 리소스를 균형있게 분배해준다.

컨테이너의 핵심은 “Host OS 입장에서 각 컨테이너들은 하나의 Process 단위로 처리된다”는 것이다.

OS 커널은 각 Process 단위로 자원을 할당 시켜준다. 컨테이너 기술을 사용하면 Host OS 입장에서 평소처럼 각 컨테이너를 프로세스로 처리하면 부담이 없어 성능이 좋아짐과 동시에 각 프로세스(컨테이너) 별로 완전한 격리를 이룰 수 있다. 이게 컨테이너가 성능이 좋을 수 있는 이유이다.

하지만 어플리케이션들이 Host OS를 공유하고 있기 때문에 발생하는 단점들이 있다.

Host OS가 리눅스라면 (도커는 linux 기반) 각 어플리케이션들은 리눅스 기반의 어플리케이션이어야 한다. 또, Host OS에서 문제가 생기면 전체 어플리케이션들에서도 오류가 발생할 수 있다.

따라서 본인의 어플리케이션의 특성에 맞게 해당 기술들을 잘 활용해야한다. OS에 대한 의존성이 높은 어플리케이션을 개발 및 배포한다면 VM을 사용하는 것이 좋을 것이다. 하지만 하드웨어 리소스에 대한 의존성이 낮다면 컨테이너를 사용해서 어플리케이션을 분리하는 것이 좋겠다.

컨테이너의 개념은 어느정도 이해했다. 그럼 다시 처음으로 돌아와서, 도커는 무엇일까?

도커란?

도커는 컨테이너를 생성, 관리할 수 있게 만들어주는 오픈소스 서비스이다. 도커를 통해서 컨테이너를 쉽게 생성하고 관리할 수 있게 되는 것이다. 즉, 위에서 이야기했던 컨테이너 엔진의 한 종류이자 가장 많이 쓰이는 엔진이 도커이다. 도커를 사용하면 쉽게 컨테이너를 생성하고 이미지 파일도 쉽게 구성할 수 있다.

컨테이너 기술은 효율적으로 어플리케이션들을 충돌없이 원활하게 호스팅할 수 있게 도와주는 기술이다. 이를 통해서 어플리케이션들을 적절히 분리하고 각 어플리케이션 별로 자원을 효율적으로 분배할 수 있도록 프로젝트 아키텍쳐를 설계하는 것이 점점 중요해지는 실상이다.

이러한 컨테이너 기술의 선두에는 Docker 엔진이 있고, Docker는 컨테이너의 생성, 배포, 관리를 쉽게 할 수 있도록 도와주는 핵심 도구이다. Docker와 같은 컨테이너 관리 도구를 통해 프로젝트를 효과적으로 관리할 수 있는 능력이 필수적이라고 느꼈다. 또, Docker와 같이 효율적인 운영을 이해하기 위해서는 CS 기본 지식 (운영체제 등)이 매우 중요하다는 것을 느낄 수 있었다.


P.S.

AWS EC2를 이용해서 컨테이너를 배포했다고 가정하면 아래와 같이 구성되어있는 것을 확인할 수 있다.

장고 웹앱 같은 경우는 Gunicorn과 같은 WAS와 묶여서 컨테이너화 되기 때문에 하나의 EC2 프로세스 내부에서 또 여러개의 WAS 워커 프로세스로 나뉠 수도 있고 WAS의 워커 프로세스에서 하나의 HTTP 요청에 해당하는 프로세스가 장고 웹앱에서 여러개의 내부 프로세스(혹은 스레드)로 또 나뉠 수도 있다.

이렇게 컨테이너로 구성하게 되면 Host 서버의 리소스를 매우 효율적으로 사용할 수 있게 된다.

(사실 하나의 EC2에 모든 컨테이너가 배포되기 보단 각 컨테이너의 특성에 맞게 알맞은 AWS 서비스에 배포된다. ECS, RDS 등)

profile
개발은 그저 도구일 뿐

1개의 댓글

comment-user-thumbnail
2024년 9월 30일

너무나도 유익한 글이네요~

답글 달기