대체 Docker가 뭐길래? 에 대한 정리

이민석·2022년 6월 15일
0

infra

목록 보기
1/2

드림코딩 엘리 - 도커 한 방에 정리를 보고 정리한 내용입니다.

도커를 이해하기 위한 프로세스와 커널에 대해 정리한 글이 궁금하다면
👉 여기로 오시면 됩니다.

도커(Docker)란?

어플리케이션을 패키징할 수 있는 툴, 컨테이너라는 하나의 작은 소프트웨어 안에 어플리케이션과 필요한 시스템툴, 환경설정, 디펜던시를 하나로 묶어서 다른 서버 / PC 그 어떤 곳이라도 쉽게 배포하고 안정적으로 구동할 수 있도록 도와주는 툴이다.

기술이 발전함에 따라 어플을 구동하는 것에 많은 것들이 필요해졌다.

node를 예로 들면, 소스파일만 서버에 배포하면 어플리케이션을 구동하는 데 문제점이 있다. 서버에서 구동하기 위해서는 로컬과 같은 조건을 구성해야 하는데, 개발자마다 서버마다 이러한 모든 것들을 설치한다는 것은 쉽지 않다.

그러므로 내 PC에서 구동된다고 서버에서도 잘 될거라는 생각을 하면 안된다. 서버와 나의 버전이 다를 경우도 있기 때문이다.

이러한 문제를 해결할 수 있는 방법이 도커이다. 도커 안에는 어플리케이션뿐만 아니라 어플리케이션이 정상적으로 동작하기 위한 node, 환경설정, 여러 라이브러리들의 디펜던시 그리고 다양한 리소스들이 포함될 수 있다.

이렇게 도커 컨테이너를 사용하면 내 어플이 구동하기 위한 런타임 환경에 필요한 모든 것들을 어떤 PC에서도 동일하게 구동할 수 있고, 내 PC에서는 되지만 왜 서버에서는 안될까?라는 문제를 해결할 수 있다. 그렇다면 도커의 컨테이너는 VM과 같은 것이 아닐까? 라는 의문이 생길 수 있다.


VM(Virtual Machine)이란?

하드웨어의 인프라 스트럭쳐 위에 VM웨어나 Virtual Box와 같은 하이퍼바이저 소프트웨어를 이용하여 각각의 가상의 머신을 만들 수 있다.

한 운영체제 위에서 동일한 어플리케이션을 각각의 고립된 다른 환경에서 구성하기 위해서는 이 VM을 이용하여 구동해야 했다. VM은 각각의 운영체제를 포함하고 있기 때문에 mac이라는 운영체제 위에서 VM를 이용하면 Window와 Linux를 동시에 이용할 수 있다.

이렇게 고립된 환경에서 어플을 구동하기 위해서 VM을 사용하면 운영체제를 포함하고 있기 때문에 굉장히 무겁고, 시작하는 데 오래 걸리고 인프라 리소스를 많이 잡아먹을 수 있다.

이러한 vm에서 많이 경량화 된 컨셉이 컨테이너이다. 하드웨어에 설치된 운영체제, 즉 Host OS에서 컨테이너 엔진이라는 소프트웨어를 설치만 하면 개별적인 컨테이너를 만들어서 각각의 어플을 고립된 환경에서 구동할수 있게 해준다.

이것이 VM과 큰 차이점이다. VM은 운영체제를 포함했다면 도커 컨테이너는 운영체제를 포함하지 않고 컨테이너 엔진이 설치된 Host OS를 공유한다. 이것이 어떻게 가능한 지 알려면 운영체제와 커널에 대해 깊숙히 다루어야 한다.

👉 운영체제를 관리하는 커널에 대해 알고싶다면?

다만 컨테이너가 구동되기 위해서는 컨테이너 엔진이라는 것이 필요하고 컨테이너 엔진이 Host OS에 접근하여 필요한 것들을 처리해준다 라고 알면 된다.


컨테이너를 만들기 위해서는 세 가지가 필요하다. 먼저 도커파일을 만들고, 도커파일을 이용하여 이미지를 생성하여 컨테이너를 구동할 수 있다.

도커파일

제일 첫 번째 단계인 도커파일 단계이고, 컨테이너를 어떻게 만들어야 하는 지 설명서나 레시피 같은 것이다. 어플을 구동하기 위해서 꼭 필요한 파일은 어떤 것이 있는 지, 어떤 프레임워크나 라이브러리를 쓰는지, 필요한 환경변수나 어떻게 구동해야 하는 지 스크립트도 포함할 수 있다. (requirement.txt와 유사한 기능인 것 같다.)

이미지

이렇게 작성한 도커파일을 이용해서 이미지를 만들 수 있는데, 이 이미지 안에는 어플을 실행하기 위해 필요한 모든 세팅들이 포함되어 있다. 한마디로 표현하면 실행되고 있는 어플의 상태를 이미지로 만들어둔다고 생각하면 좋다. 이렇게 만들어진 이미지는 변경이 불가능한 불변의 상태로 볼 수 있다.

컨테이너

마지막 단계인 컨테이너는 샌드박스처럼 우리가 캡쳐해둔 어플리케이션 이미지를 고립된 환경에서 개별적으로 실행할 수 있는 것을 말한다. 컨테이너 안에서 어플리케이션이 동작한다고 할 수 있다. 고로 컨테이너는 우리가 준비한 이미지를 이용하여 구동하는 것이다.

객체지향에 익숙한 사람들은 클래스라고 생각하면 좋다. 동작하고 있는 어플을 템플릿 형태로 이미지를 만드는 것을 말한다. 이 이미지를 이용하여 각각의 컨테이너를 만들 수 있다. 공통 이미지 상태는 불변의 상태로 제공되고, 컨테이너에서 각각 동작하는 어플은 파일도 만들 수 있고, 개별적인 수정이 가능한 상태로 볼 수 있다. 각각의 컨테이너에서 수정된 파일은 이미지에 영향을 주지 않는다.


지금까지는 컨테이너를 만드는 방법에 대해 알아보았고, 이번에는 컨테이너를 어떻게 배포할 수 있는 지, 이미지를 공유할 수 있는 지 알아보자.

깃과 깃헙을 사용해보았다면 익숙할텐데, 내 로컬 PC에서 이미지를 만들고 깃헙과 같은 컨테이너 레지스트리에 내가 만든 이미지를 푸시하는 것과 같다. 내가 만든 이미지를 다른 개발자 피시에 가지고 와서 그대로 실행하면 된다. 이미지를 정상적으로 실행하기 위해서는 도커와 같은 컨테이너 엔진을 꼭 설치해두어야 한다.

우리가 이미지를 공유할 수 있는 컨테이너는 퍼블릭과 프라이빗이 잇는데, 퍼블릭에는 도커허브나 깃헙패키지가 잇는데 도커허브가 가장 사랑받고 있다. 회사에서는 대부분 프라이빗을 사용하는데, 보안적인 이유가 크다. 우리가 알고있는 대표적인 3사가 서비스하고 있다.


간단한 정리

총정리하자면, 로컬 머신과 서버에 도커를 설치하고, 도커를 통해 도커파일을 작성한 다음 이미지를 생성하고, 이 이미지를 컨테이너 레지스트리에 올리고 서버에서 pull 받으면 서버에서 실행할 수 있는 과정이 도커다.

profile
오늘은 무엇을 배울까

0개의 댓글