Docker

diense_kk·2023년 11월 6일
0

Developer

목록 보기
5/8


귀엽게 생겼네 ㅋㅋ

Docker란?

Docker는 개발자가 컨테이너를 빌드, 배포, 실행, 업데이트, 관리할 수 있는 오픈 소스 플랫폼이다. 컨테이너란 표준화되고 실행 가능한 구성요소로 애플리케이션 소스 코드와 이 코드를 임의의 환경에서 실행하는 데 필요한 운영 체제 라이브러리 및 종속 항목을 조합한 것이다.
도커 엔진(Docker Engine) 혹은 도커에 관련된 모든 프로젝트를 말함

도커 엔진

도커 엔진은 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 프로젝트이다. 도커의 생태계에 있는 여러 프로젝트들은 도커 엔진을 좀 더 효율적으로 사용하기 위한 것에 불과하기 때문에 도커의 핵심은 도커 엔진이라고 할 수 있다.

Virtual Machine VS Docker Container

Virtual Machine(가상머신)

기존의 가상화 기술인 가상머신은 하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해서 사용하는 방식이었다

이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고 각 가상머신에는 우분투, CentOS등의 운영체제가 설치되어 사용된다. 그래서 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용한다. 이러한 가상화 방식을 사용하는 툴은 VirtualBox, VMware등이 있다.

그러나, 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다. 그 뿐만 아니라 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 떄 이미지의 크기 또한 커집니다.

즉, 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있습니다.

정리
1. 가상머신은 하이퍼바이저를 통해 여러개의 운영체제를 생성되고 관리됨.
2. 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 거치므로 성능 손실이 큼
3. 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 포함하므로 배포할 때 용량이 큼

Docker Container

가상머신에서 경량화 된 컨셉이 바로 컨테이너이다. 컨테이너는 하드웨어에 설치된 운영체제, 즉 호스트 운영체제에서 container engine이라는 소프트웨어를 설치하기만 하면 개별적인 컨테이너를 만들어서 각각의 애플리케이션을 고립된 환경에서 구동할 수 있도록 해준다. 가상머신과의 차이점이 확실해지면서 가상머신이 운영체제를 포함했다면 컨테이너는 운영체제를 포함하지 않고 컨테이너 엔진이 설치된 호스트 운영체제를 공유하게 된다. 다만 컨테이너가 구동되기 위해서는 컨테이너 엔진이라는 것이 필요하고, 컨테이너 엔진이 호스트 운영체제에 접근해서 필요한 것들을 처리해주게 되는 구조이다. 여기서 컨테이너 엔진 중에서 가장 많이 사용하는 것이 바로 Docker라는 것이다.

컨테이너는 가상머신에 비해서 굉장히 가벼워져 기존이 문제점을 해결할 수 있다. 컨테이너는 가상화된 공간을 생성하기 위해서 리눅스 자체 기능인 chroot, namespace, cgroup을 사용해서 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 더불어 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리와 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 용량 또한 크게 줄어들게 된다. 따라서 배포하는 시간이 가상머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실이 거의 없어지게 된다.

정리
1. 가볍고 성능의 손실이 거의 없으며 빠르다.
2. 애플리케이션의 개발과 배포가 편해진다.
3. 여러 애플리케이션의 독립성과 확장성이 높아진다.
4. 프로젝트 자체의 성숙도나 확장성, 편의성 등이 좋다.

Docker의 구성과 동작 순서

Docker를 보면 컨테이너를 만들고 배포하고 구동하는 식의 방식으로 진행이 된다. 여기서 컨테이너를 만들기 위해서는 총 3가지가 필요하게 된다. 컨테이너를 만들어내기 위해서 먼저 도커 파일을 만들어야 하고 이를 이용하여 이미지를 만든 뒤에 컨테이너를 구동할 수 있다

Docker File

Docker file은 컨테이너를 어떻게 만들어야 하는지에 대한 설명서와 같은 역할을 한다. 애플리케이션을 구동하기 위해서 꼭 필요한 파일들은 무엇이 있는지 설명할 수 있고 어떠한 프레임워크나 라이브러리를 설치해야 하는지에 대한 외부 의존성에 대해서 명시할 수 있으며 필요한 환경 변수에 대해서 설정할 수도 있다. 그리고 어떻게 구동해야 되는지 스크립트도 포함할 수 있다.

Docker Image

이렇게 작성한 docker file을 이용해서 이미지를 만들 수 있는데, 이 이미지 안에는 애플리케이션을 실행하는데 필요한 코드, 런타임 환경, 시스템 툴, 시스템 라이브러리 등의 모든 세팅들이 포함되어져 있다. 간단하게 이야기하면 실행되고 있는 우리의 애플리케이션을 카메라로 예를 들면 사진을 하나 찍어둬서 이미지로 만들어둔다고 생각하면 된다. 이렇게 만들어진 docker image는 변경이 불가능한 불변의 상태로 볼 수 있다.

Container

마지막 단계인 컨테이너는 만들어둔 애플리케이션의 이미지를 고립된 환경에서 개별적인 파일 시스템 안에서 실행할 수 있는 것을 말한다. 즉, 컨테이너 안에서 우리가 만든 애플리케이션이 동작한다고 보면 된다. 컨테이너는 미리 준비해 놓은 애플리케이션의 이미지를 이용해서 애플리케이션을 구동하게 되는 것이다.

객체지향 프로그래밍에 익숙해지게 되면 여기서 이미지를 클래스라고 생각하면 된다. 클래스는 여러 객체를 생성해낼 수 있는 일종의 틀같은 것이다. 동작하고 있는 애플리케이션을 템플릿 형태로 이미지를 만들어두고, 이미지를 이용해서 실제로 애플리케이션이 동작하는 각각의 컨테이너를 만들어낼 수 있게 된다. 그래서 이미지는 만들어지는 당시에 프로젝트의 상태를 바꿀 수 없는 상태로 가지고 있게 되며, 컨테이너에서 각각 동작하는 애플리케이션은 파일도 만들 수 있고 수정도 할 수 있는 개별적으로 수정이 가능한 상태가 되는 것이다. 각각의 컨테이너에서 수정된 파일들이 있다면 이는 이미지에는 전혀 영향을 끼치지 않게 된다. 이미지는 클래스이고 만들어진 각 컨테이너는 인스턴스라고 볼 수 있는 것이다.

Docker Image 배포

컨테이너를 배포하는 과정, 즉 도커 이미지를 공유하는 과정은 git과 github를 사용해봤다면 익숙할 정도로 비슷할 것이다. 개발한 local machine에서 이미지를 빌드해서 github와 같은 container registry에 우리가 만든 이미지를 push하고 필요한 서버나 다른 개발자 PC에서 우리가 만들어둔 이미지를 가지고오는 pull을 통해서 그대로 실행하면 된다. 물론 이미지를 정상적으로 실행하기 위해서는 docker와 같은 컨테이너 엔진을 꼭 설치해둬야 한다.

0개의 댓글