2022년 기준 StackOverFlow의 개발 툴에 관한 Survey 중 npm에 육박하는 사용량을 가진 Docker.

Docker는 왜 쓰는지, 어떻게 쓰는지, 어떻게 구성되어 있는지 알아보자.

 

내 컴퓨터에서 어떤 애플리케이션을 만들고자 하면, 우리가 사용하는 OS 위에 여러 소프트웨어를 깔아야 한다.

그 중에는 웹 서버도 있겠고, 데이터베이스도 있겠고, 또 여러 가지 소프트웨어들이 있겠다.

 

늘 그랬지만, 이 소프트웨어들을 설치하고 실행하는 과정은 그리 녹록치 않다.

설치하면서 만나는 오류들에 대해서 때로는 당황스럽고, 때로는 분노를 느낄 때가 참 많다.

내 생각이지만, 개발자의 덕목은 '귀찮은 것을 멀리하고 싶어야' 하는데 있다고 느껴진다.

그래서 개발자는 꿈을 꾼다.

 

웹 서버를 만든 사람이 컴퓨터를 구해서 적당한 OS를 설치해주고, 그 위에 적당히 알아서 웹 서버를 설치해주고, 내가 네트워크 통신으로 그걸 이용할 수 있으면 얼마나 좋을까...

이 방식은 너무나 좋지만 문제가 있었다.

바로 '소프트웨어 하나마다 그 소프트웨어를 굴릴 수 있는 OS를 설치해야 하고, 그 OS를 설치하기 위해선 새로운 컴퓨터가 필요한 것'이다.

돈을 아끼기 위해서 고용된 개발자가 소프트웨어를 설치하지 않으려고 컴퓨터를 사다니. 잘려야 마땅하다.

 

그래서 개발자는 또 다시 꿈을 꾼다.

 

각 소프트웨어마다 OS가 필요해서 컴퓨터를 새로 사야한다면, 그냥 내 컴퓨터 안에 가상화된 컴퓨터를 하나 만들어서, 그 컴퓨터에서 위와 같은 작업을 하면 어떨까?

천만다행이게도, 이 꿈은 이루어질 수 있었다.

바로 vmware, virtualbox같은 친구들이 '가상화(Virtualization)'라는 이름으로 물리적인 컴퓨터 안에 가상 머신(Virtual Machine = computer)을 설치해 주고, 그 각각의 VM 안에 OS를 깔아서 어플리케이션을 설치할 수 있게 만들어 주었다.

그림으로 확인해보자.

OS 위에 하이퍼바이저(VM을 생성하고 구동하는 소프트웨어)를 두고, 이 하이퍼바이저가 다음과 같은 일을 하게 한다.

  • host OS에서 리소스를 할당받아서 각 guest OS에 리소스를 할당하고 조율한다.
  • 각 guest OS들의 요청을 번역해서 하드웨어에 전달하기

여기서 잠깐! Host OS와 Guest OS의 차이점?

Host OS와 Guest OS 모두 자원을 어플리케이션이나 프로세스에 할당할 수 있고, 매니징해주는 OS라는 공통점이 있지만, Host OS와 달리 VM을 구동할 때 실행되는 Guest OS는 직접 자원을 가져올 수 없고 하이퍼바이저를 통해서만 리소스를 할당받을 수 있다.

 

여기까지는 좋았다. 그런데 또 문제가 발생했다.

  • 예를 들어 2개의 소프트웨어밖에 필요하지 않으면, 굳이 하이퍼바이저가 필요한가?
  • 그림에서 보여준 Guest OS가 모두 같은 OS라면, 용량도 크고 설치 시간도 길어지는데다 같은 OS를 계속 설치해 주어야 한다. => 개발자가 가장 싫어하는 '중복'이다.
  • 그러면 1억개의 소프트웨어를 실행하기 위해서는 내 컴퓨터에 1억개의 OS를 설치해야 하는데, 그러면 너무나도 느린 내 컴퓨터를 두고볼 수가 없다. 

결론 : 아무튼 비효율적이다.

 

그래서 개발자는 또 생각했다.

그냥 한 대의 컴퓨터에 있는 host(주인) OS로, 격리된 환경에서 앱을 실행하는데 필요한 라이브러리와 실행 파일(bin)만 가지고 앱을 실행시킬 수는 없을까?

바로 이렇게...

리눅스 운영체제에는 이런 앱 실행방법이 내장되어 있다. 이러한 기술을 '컨테이너'라고 부른다.

컨테이너 기술을 이용해서 이런 일을 쉽게 해주는 제품이 여러 가지 있지만, 가장 대표적인 제품이 바로 '도커'인 것이다.

도커는 우리가 리눅스를 사용하지 않아도 리눅스 OS에서 어플리케이션이 돌아갈 수 있도록, VM 위에 Linux OS를 설치해 어플리케이션을 돌릴 수 있도록 해준다.

도커 공식 사이트(https://docs.docker.com/get-started/overview/)의 문서를 읽어보면, 도커에 대한 설명은 다음과 같다.

컨테이너 기반 가상화 도구이며
애플리케이션을 컨테이너라는 단위로 격리하여 실행하고 배포하는 기술

이제, 어느정도 이 문장을 이해할 수 있을 것이다.

다시 컨테이너란 무엇인지 정리해보자.

  • 컨테이너는 가상화 기술 중의 하나이다.
  • 호스트 운영체제 위에 여러 개의 격리된 환경을 생성
  • 각각의 컨테이너 안에서 애플리케이션을 실행

컨테이너 기반의 특징에는 어떤게 있을까?

  • 리눅스 커널의 기능을 사용해서 만들어졌다. (아까 말했듯이 리눅스의 기술이므로)
    • chroot: 파일 시스템을 격리
    • namespace: 프로세스 격리
    • cgroup: 하드웨어 자원 격리
    • 등의 기능을 가지고 있다.
  • 프로세스 단위의 격리 환경

이제 질릴만큼 컨테이너와 가상화에 대한 이야기를 했으니, 마지막으로 도커를 정리해보자.

도커란?
- 오픈 소스 플랫폼이다.
- 다양한 운영체제에서 사용할 수 있다.
- 어플리케이션을 인프라에서 분리하여, 컨테이너 단위로 격리해서 실행하고 배포하는 기술이다.
- 리눅스 컨테이너 기술(LXC) 기반으로, vmware등의 가상화 소프트웨어보다 신속하다.
- 인프라를 어플리케이션을 관리하는 것 처럼 관리할 수 있다.
- 위 기능들을 통해 어플리케이션이나 코드를 빠르게 개발하고, 효율적으로 배포, 관리할 수 있다.

 

다음 글에서는 도커의 내부 구조를 알아보자.

+ Recent posts