도커(Docker)에 대해서 알아보자

지드루·2022년 9월 17일
0

최근 개발환경을 구성하는데 있어서 빠질 수 없는것으로 꼽히는 것 중 하나가 바로 도커(Docker)이다. 도커는 어떤 플랫폼이기에 많은 개발자들의 사랑을 받는 플랫폼이 되었을까?

도커란?

도커는 컨테이너 기술 기반의 가상화 플랫폼이다. 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 것들이 포함되어 있다. 즉, 도커를 사용하면 환경에 구애받지 않고 코드가 문제없이 실행될 것임을 확신할 수 있게 되는 것이다.

가상화와 컨테이너

가상화란 하나의 하드웨어를 여러개로 가상으로 분할하여 효율적으로 사용할 수 있게 해주는 기술이다. 이렇게 분리된 가상머신들은 각각 독립된 환경으로 구동되게 된다. 가상머신을 생성하기 위해서는 하이퍼바이저라고 불리는 소프트웨어를 이용하는데, 이 하이퍼바이저는 호스트 하드웨어에 설치되어 호스트와 게스트를 나누게 되고, 각각의 게스트는 하이퍼바이저에 의해 자원을 할당받게 된다. 이렇게 가상머신을 사용해서 하드웨어가 여러개 있는 것처럼 사용할 수 있다.

하지만 가상머신을 사용하기 위해서는 반드시 하이퍼바이저를 거쳐야 하기때문에 성능저하가 반드시 나타나게 된다. 또 가상머신은 해당 환경을 구동하기 위해 필요한 모든 자원을 포함해야하기 때문에 이미지의 크기가 커지며, 물리적 컴퓨터보다 효율성도 떨어지고 속도도 느려지게 된다.

이에반해, 컨테이너는 가상의 OS(게스트 OS)를 만드는 것이 아니라, 기존 환경의 OS를 공유하며 필요한 프로세스만 격리하는 방식이다. 커널자체를 공유하고 있기때문에 OS의 많은 자원들을 컨테이너들끼리 공유할 수 있게 된다. 때문에 기존의 가상머신 방식과는 다르게 이미지의 용량도 상대적으로 매우 작으며, 실행속도도 훨씬 빨라지게 된다.


가상머신과 컨테이너의 구조적차이

장단점을 비교하면 다음과 같다.

가상머신

  • OS선택의 자유
    게스트 OS는 호스트 OS와 완전히 독립된 환경이므로, 서비스 환경에 맞추어 OS를 자유로이 선택할 수 있다.
  • 보안성
    마찬가지로 게스트와 호스트가 완전히 분리된 환경이므로, 보안적으로 우수하다.
  • 무거움
    이미지 자체의 용량도 매우 무겁고, 부팅시간도 매우 길다
  • 성능이슈
    가상머신으로 무언가 하려면 반드시 하이퍼바이저를 거쳐야 하기 때문에, 성능저하가 필연적이다.

컨테이너

  • 가벼움
    가상 머신보다 공간을 더 적게 차지하고, 부팅시간도 매우 짧다
  • 효율적
    리소스를 별도로 할당할 필요없이, 리소스를 효율적이고 동적으로 사용한다. 컨테이너 하나의 수요가 감소하면 여분의 리소스를 다른 컨테이너가 사용할 수 있다.
  • 성능
    하이퍼바이저를 거치지 않기 때문에 성능적으로 훨씬 우수하다.
  • 보안문제
    컨테이너는 근본적으로 커널환경을 공유하기 때문에, 환경자체가 격리되어 있는 가상머신에 비해서 보안적으로 취약한 단점이 존재한다.
  • OS선택이 제한됨
    마찬가지로 호스트 OS에 전적으로 의존하기 때문에, 호스트 OS와 동일한 OS를 선택할 수 밖에 없다.

도커는 컨테이너 기술을 채용함으로써, 컨테이너 기반 기술의 장점을 적극 활용하기 위한 플랫폼인 것이다.

이미지?

앞선 단락에서 이미지라는 단어가 여러번 나왔다. 이미지라는 단어는 알고 있겠지만, 과연 도커 생태계에서 이미지는 어떤 의미로 쓰일까? 이미지는 컨테이너와 함께 도커에서 가장 중요한 개념이다. 이미지란 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값이 없으며, 변하지 않는다(Immutable).

앞서 설명한 컨테이너는 즉, 이미지를 실행한 상태이며 추가되거나 변하는 값들은 컨테이너에 저장되게 된다. 때문에 같은 이미지에서 여러개의 컨테이너를 생성할 수 있으며, 컨테이너의 상태가 변하거나 컨테이너가 삭제되더라도 이미지는 그대로 남아있게 된다.

한마디로 이미지는 컨테이너 실행에 필요한 모든 정보를 가지고 있기 때문에, 의존성을 위해서 이것저것 설치하거나 충돌을 해결할 필요가 없는 것이다.

그래서 도커란?

앞서 말했듯이, 도커란 컨테이너 기반의 가상화 플랫폼이다. 이미지를 실행시켜 컨테이너로 만들거나, 컨테이너를 관리하거나, 컨테이너를 이미지로 만드는 작업을 쉽게 할 수 있게 해준다.

이를 이용하여 개발자는 라이브러리간의 충돌을 방지하기 위해 환격을 격리시켜야 할 때, 완성된 서비스를 배포할 때, 혹은 배포받은 서비스를 받아 실행해볼 때 유용하게 도커를 사용할 수 있다. 특히 배포 과정에서 도커를 사용하게 된다면, 종속성이슈를 해결하는데 큰 도움이 된다.

0개의 댓글