본문 바로가기

프로젝트/고민

프로젝트를 시작하며(docker)

프로젝트를 시작할때 협업을 하는 동료와 같은 db환경을 사용하면 좋겠다라는 생각에 docker를 이용해 각각의 로컬에서 mysql 서버를 띄워서 같은 db환경을 맞췄다. docker를 처음 사용해 봤는데 이번 기회에 docker에 대해서 정리해보고자 한다.

 

도커란?

컨테이너 기반의 가상화 도구

가상화?

그렇다면 가상화란 무엇이고 가상화의 등장 배경은 어떻게 될까? 

예를들어 6천만원짜리 좋은 성능의 서버가 있다고 가정해보자. 이 서버에 쇼핑몰이 있다고 생각하고 고정 사용자는 1000명이 있다고 가정하면 서버의 성능에 비해 실제로 하는일은 부족해 성능이 아까운 셈이 된다. 이러한 점이 아까워 해당 서버에 새로운 프로젝트를 올리려고 한다. 하지만 앞전에서 사용하던 쇼핑몰 프로젝트와 충돌이 일어나는 상황이 발생하여 새로운 프로젝트를 구동하지 못하는 상황이 발생해버렸다. 이러한 상황에서 서버의 성능을 나눠서 사용할 수 없을까? 라는 생각에 가상화라는 개념이 등장하게 되었다. 

이렇게 가상화를 통해 하나의 서버 자원을 나눠서 가지며, 성능을 분산 시키고, 분산된 서버들은 각기 다른 서비스를 수행할 수 있다.

 

가상화의 종류

가상화에 대해서 알아봤으니 이제 가상화의 종류에 대해서 알아보자

 

서버가상화

서버 가상화란 하나의 물리적 서버 호스트에서 여러 개의 서버 운영 체제를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍처를 말한다.

다음 그림에서 알 수 있듯이 하나의 host OS에 여러 개의 guest OS가 할당된것을 알 수 있다

하이퍼 바이저는 가상화 기술을 통해 여러 개의 운영체제를하나의 호스트 os에서 생성해서 사용할 수 있게 해주는 소프트웨어이다. 여기서 하이퍼 바이저에 의해 생성되고 관리되는 운영체제를 Guest 운영체제라고 하는데 각 Guest 운영체제는 완전히 독립된 공간과 자원을 할당받는다. 또한 하이퍼 바이저는 각 Guest 에게 자원을 나눠주면 조율해주는 역할을 한다.

 

이와 같이 가상화 작업은 하이퍼 바이저를 무조건 건너야 한다. 또한 가상머신에는 게스트 os를 사용하기 위한 라이브러리, 커널등이 모두 필요하기 때문에 배포하기 위한 이미지로 만들었을때 크기 또한 커진다

 

즉, 가상머신은 완벽한 운영체제를 생성할 수 있다는 장점이 있지만 성능이 느리고 용량상으로 부담이 있다. 이를 위한 해결책으로 컨테이너가 나왔다.

 

컨테이너

컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세
스 단위의 격리환경을 만든다. 다음 그림에서 컨테이너 엔진 위에서 컨테이너가 할당된것을 확인할 수 있다.

 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재한다. 따라서 이미지를 만들었을대 이미지 용량 또한 가상머신에 비해 훨씬 작다. 또한 하이퍼바이저도 거치지 않기 때문에 성능 손실도 거의 없다.

 

우리는 위에서 가상화 머신과 컨테이너에 대해서 간단하게 살펴봤다. 그렇다면 docker란 무엇일까?

docker란 컨테이너 기술에 여러 기술을 추가한 오픈소스 프로젝트라고 말할 수 있다.

 

따라서 컨테이너로 애플리케이션을 실행하나 직접 애플리케이션을 실행하나 host os 입장에서는 똑같은 프로세스로 본다. 따라서 우리는 가상머신 없이 가상머신보다 리소스를 적게 소모하는 프로세스 단위의 컨테이너라는 독립적인 가상화 공간을 사용할 수 있다.

 

위에 그림에서 컨테이너 엔진 부분이 있는데, 현재 docker에 대해 학습중이므로 docker 엔진에 대해서 간략하게 알아보자.

가상머신에서는 하이퍼바이저를 사용했지만 컨테이너에서는 컨테이너 엔진을 이용해 사용자가 컨테이너를 쉽게 사용할 수 있게 해주는 주체이다.

도커 엔진에서는 다음과 같은 기능을 한다.

  • 이미지 관리
    컨테이너를 생성하기 위한 이미지를 관리한다.
  • 컨테이너 관리
    컨테이너의 라이프 사이클을 관리한다.
  • 볼륨 관리
    컨테이너에 데이터 저장을 하기 위한 저장소 역할을 한다.
  • 네트워크 관리
    컨테이너에 접속을 관리하기 위한 역할을 한다.

위와 같이 docker에 대해서 간략하게 살펴봤다. docker는 방대하기에 당장 docker대한 모든것을 현재 학습하기는 어렵지만, docker의 등장 배경, docker 엔진이 제공하는 기능등을 간단하게 알아도 현재 수준에서 docker를 이용하기에는 무리가 없기에 서버가 확장을 해야하거나 docker의 기능을 더 알아야 할때 학습하여 익히도록 하겠다.