DevOps & Infra/Docker

[Docker] 도커란?

턴태 2022. 11. 16. 16:50

도커

예를 들어, Node.js로 웹 서버 및 웹 서버 서비스를 만들었다고 할 때, 나의 운영체제와 Node.js 버전 및 DB 버전에서 코드가 정상적으로 작동할 수 있습니다. 하지만, 사람마다 사용하고 있는 운영체제도 다 다르고 런타임 환경도 다르고 사용하고 있는 DB의 버전도 다르며 의존성 및 여러 가지에서 차이가 발생합니다. 단순한 차이 때문에 전체 애플리케이션을 구동하기 위해 버전을 일일이 다 맞추어야 하고 운영체제도 고려해야 하는 등 복잡한 과정이 잇따릅니다.

 

여기서 도커가 등장합니다! 도커는 하나의 컨테이너로 우리가 만든 애플리케이션과 시스템 도구 및 환경설정, 의존성 등을 한 데 담아서 어떠한 PC에서든 동작할 수 있도록 해줍니다. 이렇게 도커 컨테이너를 사용하면, 애플리케이션 구동의 런타임 환경에 필요한 모든 것들을 함께 컨테이너로 제공하기 때문에 준비하고 고려할 것이 적어 매우 편리한 도구입니다.

 

가상환경 VS 도커

사실 이렇게 보면 가상환경과 많은 부분이 흡사해보입니다. 가상환경에서도 원하는 운영체제, 원하는 라이브러리, 런타임 버전, 환경변수 등을 설정할 수 있습니다. 하지만 큰 차이는 호스트OS(내 PC의 운영체제) 위 게스트OS의 유무입니다.

출처: 깃북 - Understanding Docker(https://dydtjr1128.gitbook.io/understanding-docker/1.start-docker/1-starting-docker)

가상머신의 경우 하드웨어 위에서 Host OS가 소프트웨어로 자리잡은 상태에서 VMware나 VirtualBox와 같은 가상화 도구, Hypervisor를 사용하여 각각의 가상 환경을 구축하는 것입니다. Hypervisor는 Guest OS를 가상화로 제공하여 여러 개의 가상 환경을 운영할 수 있도록 해줍니다. 그런데 가상환경은 각각 OS를 또 추가로 설치해야 하므로 시간도 오래걸릴 뿐더러, 내 PC의 자원을 그대로 사용하기 때문에 무겁습니다. 이때문에 반가상화 기술로 조금 더 성능을 개선하긴 했지만, 여전히 무겁고 실행이 오래걸리는 것은 같았습니다.

 

여기서 OS를 따로 격리하는 것이 아니라 프로세스를 격리하는 아이디어가 나오기 시작했으며, 이러한 흐름에서 컨테이너라는 것이 등장했습니다. 컨테이너 엔진이라는 것을 두어서, 개별적인 컨테이너를 구동시켜서 각각의 컨테이너를 격리된 환경에서 동작시킬 수 있도록 했습니다. 가상환경이 각각 운영체제를 별도로 두는 것과는 다르게, 컨테이너는 하나의 Host OS를 공유하기 때문에 더 빠르게 실행할 수 있으며, 운영체제를 설치하면서 점거하는 저장공간도 상당히 줄일 수 있게 되었습니다. 이때 컨테이너 엔진 중에서 가장 대표적으로 사용하는 엔진이 바로 도커입니다.

 

컨테이너 만들기

컨테이너를 만들기 위해서는 총 세 단계를 거쳐야 합니다.

 

먼저 Dockerfile을 만들어서 어떤 과정으로 도커를 구동할지 정의해야 합니다. yaml 파일 처럼 작성합니다. 이 Dockerfile을 통해서 이미지를 만들게 되고, 이 이미지를 다운받아 컨테이너를 세팅합니다.

 

1. Dockerfile

도커파일컨테이너를 만들기 위한 설명서입니다. 도커파일에서는 다양한 프로퍼티와 값을 통해서 세팅할 내용을 작성할 수 있습니다. 예를 들어서, 컨테이너에서 필요한 파일을 지정하거나, 어떠한 프레임워크 및 라이브러리 등 필요한 외부 파일들을 설치할 수도 있고, 환경변수를 지정할 수도 있고, 구동할 스크립트도 포함시킬 수 있습니다.

 

2. 이미지

도커파일을 통해서 이미지를 만들 수 있습니다. 이미지 안에는 우리의 애플리케이션을 실행하기 위한 런타임, 외부 라이브러리, 코드, 시스템 도구 등의 세팅들을 포함하고 있습니다. Git의 경우와 비슷합니다. Git도 우리가 작성한 디렉터리를 그대로 스냅샷과 같이 상태를 저장하는 것처럼, 도커 이미지도 하나의 이미지에 우리가 구동할 것들에 관한 코드, 라이브러리, 시스템 도구 등의 스냅샷을 찍어두는 것입니다.

 

이렇게 만든 도커 이미지는 도커 허브라는 곳에 업로드하여 사용할 수도 있고, 외부에 노출시키지 않고 개인적으로 사용하기 위해서 내 환경에 레지스트리를 만들어 저장할 수도 있습니다.

 

3. 컨테이너

도커 허브 등에서 이미지를 가져와서 컨테이너를 세팅합니다. 이미지에서 필요로 하는 모든 것들을 그대로 컨테이너에 두어서 외부와 독립된 환경에서 최종적으로 우리의 애플리케이션을 동작시켜줍니다.

 

우리가 프랜차이즈 마트를 운영한다고 하면, 먼저 마트에서 발주 문서를 본사에 보냅니다. 그러면 발주 문서를 보고 해당 마트에 발주한 물류를 보냅니다. 그러면 마트는 그 물류를 적절하게 배치하여 마트를 운영합니다.

 

이때, 발주 문서도커 파일, 물류이미지, 마트 그 자체가 컨테이너라고 생각하면 됩니다. 각각의 컨테이너는 우리가 저장한 상태를 가지고 있는 불변의 이미지를 사용하기 때문에 모든 환경이 동일한 기반을 가지고 있으며, 이러한 컨테이너 속 애플리케이션을 원하는 대로 변경시킬 수 있고 외부와 독립되어 있어 이미지가 그대로 보존됩니다.

 

도커 이미지 배포

이미지에서 도커 허브내부 레지스트리를 통해 이미지를 저장하고 여기서 이미지를 당겨받아 컨테이너를 세팅한다고 했습니다.

 

이처럼 도커 이미지는 공통적으로 컨테이너 레지스트리라고 불리는 저장소에 Push하여 애플리케이션의 상태를 저장하고, Pull하여 그 이미지를 받아서 컨테이너를 구동할 수 있습니다. Git을 통해 GitHub에 Push하고 로컬 환경에서 Pull 받아 그 프로젝트를 로컬 레포지토리에서 사용하는 것과 같은 과정입니다.

 

도커 이미지(Dockerfile로 세팅) Push -> 도커 Hub -> 컨테이너로 Pull
프로젝트 디렉터리(스테이징하여 세팅) Push -> 깃 Hub -> 로컬 및 원격 레포지토리로 Pull

 

이때, 도커 허브, 레드햇 퀘이, 깃허브 패키지스와 같은 퍼블릭 레지스트리에 이미지를 올릴 수도 있으며 주로 도커 허브를 사용합니다.

 

하지만, 회사나 기업체 및 개인적으로 보관하고 싶은 경우에는 프라이빗 레지스트리에 이미지를 올립니다(aws, gcp, azure 등).

 

마치며

 

이렇게 도커에 대한 개념에 대해 개인적으로 정리해보았습니다. 도커는 동아리 프로젝트에서도 항상 쓰이고, 대부분의 기업체에서 사용하고 있습니다. 이제는 필수로 알아야 하는 기술 스택이 되었습니다. 또한, 스택오버플로우 서베이 2022에서도 가장 사랑받으며, 가장 수요가 많은 도구로 선정될 정도로 각광받는 기술입니다. 사용 방법도 깃처럼 간단하게 사용할 수 있어서 제대로 배워서 응용해봐야겠습니다.

 

추가로, 도커가 여러 개의 컨테이너를 구동하는데 이 도커로 생성된 컨테이너 집합군을 관리하기 위해 사용하는 도구가 쿠버네티스입니다. 컨테이너 인프라 환경을 지원하는 오케스트레이션 도구라고 생각하면 됩니다. 도커에 빨리 익숙해지면 쿠버네티스도 공부하면 좋겠습니다 ^_^