Docker(도커)란

박도준·2020년 11월 24일
0

클라우드와 하이퍼레저를 공부하면서 도커와 자주 사용되는 것을 알게되었다.
그래서 이번 포스팅은 도커에 대해서 공부한 내용을 정리하려고 한다.



도커란?

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

현재 도커는 Go언어로 개발되고 있다.

리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지(프로세스 실행 환경)를 구축할 수 있도록 해준다.


위에서 도커를 설명할 때 언급했지만, 컨테이너와 이미지는 도커를 이해하기 위한 중요한 개념이다.

이제 컨테이너와 이미지에 대해 알아보자.



컨테이너

컨테이너라고 하면 배에 실는 화물 수송용 박스를 먼저 떠올릴 것이다. 실제 도커에서의 컨테이너도 이와 비슷하다.

컨테이너는 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해주는 역할을 한다.

백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립pc, aws, azure, google cloud등 어디에서든 실행할 수 있다.


그러면 여기서 궁금증이 생긴다.
컨테이너도 가상화 기술의 하나이면 기존의 가상화 방식과 다른점이 무엇인가?

기존의 가상화 방식과 컨테이너의 가상화에 대해서 알아보자.



기존의 가상화 vs 컨테이너

기존의 가상화 방식은 주로 OS를 가상화하였다.

우리에게 익숙한 VMware나 VirtualBox같은 가상머신은 Hyprvisor를 통해 가상화 기능을 제공하고, 각 독립된 커널 공간을 가진 OS를 생성하는 식의 환경 구성을 해준다.

각각의 VM마다 독립된 실행 환경을 제공하여, 각각의 VM마다 최소 GB 단위의 공간이 필요하며, VM수에 비례해서 늘어나게 된다.

때문에 가상 머신이 무겁고 느려서 운영환경에선 사용할 수 없다.

이러한 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM(Kernel-based Virtual Machine)반가상화 방식의 Xen이 등장한다.

  • 전가상화 : 하드웨어를 완전히 가상화하는 방식
  • 반가상화 : 하드웨어를 완전히 가상화하지 않고, 게스트 OS의 커널을 일부 수정해 하드웨어와 상호작용할 수 있도록 한다.

하지만 두 방식 모두 부팅 시에 상당한 시간이 소요된다.


컨테이너는 하드웨어 스택을 가상화하는 가상 머신과 달리 운영체제 수준에서 가상화를 실시하여 다수의 컨테이너를 OS 커널에서 직접 구동한다.

그래서 OS의 많은 자원들은 컨테이너들끼리 공유한다. 때문에 부팅 시간이 훨씬 짧고, 컨테이너 개수가 늘어나더라도 디스크 공간을 많이 차지하지 않는다.

또한, 컨테이너가 완전히 독립된 실행환경을 제공하지 않고 공유한다고 하더라도, 각 컨테이너 내의 프로세스들은 이를 감지하지 못하고, 자신이 OS의 모든 자원을 독점하고 있다고 생각한다.

때문에 컨테이너는 훨씬 가볍고 OS 커널을 공유하여 시작이 훨씬 빠르고, OS 전체 부팅보다 메모리를 훨씬 적게 차지한다.



이미지

이제 도커에서 중요한 개념 이미지에 대해서 알아보자.

이미지컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다.

컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다.

같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그래도 남아있는다.

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상의 의존성 파일을 컴파일하고 다른 것들을 설치할 필요가 없다.

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.



도커의 장단점

장점

  • 쉽고 빠른 실행 환경 구축 - 개발 프로젝트는 보통 팀단위 작업을 하게 된다. 협업을 위해 여러 컴퓨터에서 동일한 개발 환경을 구축하는 일이 선행되어야 한다. 이때 도커 컨테이너로 초기 개발혼경을 배포하면 프로젝트 개발 및 실행 환경을 쉽게 구축할 수 있다.

  • 가볍고 빠른 실행 속도 - 가상 머신은 OS를 재구동 해야하므로 시작 자체가 무거운 편이다. 반면 도커 컨테이너는 상대적으로 경량이기 때문에 시작이 빠르다. 컨테이너는 메모리나 스토리지 소모를 줄이면서 가상화할 수 있다.

  • 하드웨어 자원 절감 - 컨테이너의 크기가 매우 작고, 하나의 물리적 서버에 다수의 컨테이너를 가동시킬 수 있다.

  • 공유 환경 제공 - Docker의 특징은 컨테이너뿐만 아니라 공유된 서비스 Docker Hub가 있다. Docker Hub를 통해 전세계의 개발자의 결과물을 얻을 수 있고 결과물을 업로드 할 수 있다.

  • 쉬운 배포 - 프로그램 개발이 완료되면 개발했던 환경을 그대로 배포할 수 있다. 이 부분도 실제 서비스 운영 관점에서 큰 장점이다.ㄴ


단점(주의점)

  • 개발 초기의 오버헤드 - 도커를 처음 사용하는 개발자이면 초기 환경 설정시에 시행착오를 겪을 확률이 높다.
  • 자원의 격리와 쿼터 제한의 어려움 - 가상머신은 가상 하드웨어를 직접 제어할 수 있기 때문에 높은 수준의 자원 격리와 쿼터 제한을 수행할 수 있다.
    컨테이너의 경우 가상 하드웨어를 두고 있지 않기 때문에 격리 수준과 쿼터 제한이 가상 머신에 비해 떨어질 수 밖에 없다.
  • 호스트 운영체제에 실행 환경이 묶임 - 컨테이너는 호스트 운영체제의 커널을 공유하기 때문에 호스트 운영체제 환경을 그대로 가져갈 수 밖에 없다.
profile
Better late than never

0개의 댓글