Docker

seyong·2021년 12월 26일
0
post-thumbnail

도커(Docker)란 ?


  • 어플리케이션을 컨테이너(Container)로서 조금 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트

도커는 컨테이너 기반의 가상화 도구이며, 어플리케이션을 환경에 구애받지 않고 실행하는 기술이라고 할 수 있다.
(어플리케이션 영역에서 동작하는 가상화 플랫폼)

기존에 사용되던 가상화 방법인 가상머신(Virtual Machine)과는 달리 도커 컨테이너는 성능의 손실이 거의 없어서 많이 사용되고 있다.

도커와 관련된 프로젝트(프로그램?)은 도커 컴포즈(Docker Compose), 도커 허브(Docker Hub) 등 여러가지가 존재하지만, 일반적으로 도커라고 하면 도커 엔진(Docker Engine)을 의미로 많이 사용됩니다.

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

Docker 컨테이너에 대해서 쉽게 비유하며 설명해보겠다.

도커의 전체적인 모습을 우선 카세트 플레이어📻라고 해보자.
도커 이미지는 카세트 테이프📼이다.
도커 데몬(서버)은 카세트 플레이어이다.
이미지인 카세트 테이프를 카세트 플레이어에서 재생하는 동작 그리고 그로인해 나오는 결과물이 바로 컨테이너이다.

이것이 무엇을 의미할까?

바로 어떤 컴퓨터 혹은 서버에서 도커만 설치되어 있다면, 이미지를 가지고 실행할 수 있다는 의미이다. 마치 카세트 플레이어 📻 처럼!

그렇다면 결과문인 컨테이너는 과연 영원할까? 그렇지 않다.

단일 프로세스(Process)로서 동작하고, 프로세스의 작업이 종료되면 컨테이너도 종료된다. 마치, 음악 재생이 모두 끝나면 종료되는것과 같이...

가상머신(VM) vs 도커 컨테이너


가상머신(VM)과 도커 컨테이너는 어떠한 차이가 있을까?

내가 생각하기에 간단하게 설명한다면 이렇게 설명할 수 있을 것 같다.

  • 가상머신은 OS 위에 OS를 띄우는 방식

  • 도커는 자신만의 컨테이너 가상화기술을 이용해서 OS 위에 정리된 프로세스를 띄워줌

좀 더 자세히 설명해보자면,

기존의 가상화 기술은 하이퍼바이저(Hypervisor)라는 것을 이용하여 여러 개의 OS를 하나의 Host에서 생성하여 사용하는 방식이다.
이때 VitualBox나 VMWare라는 툴을 사용한다.

이러한 여러 OS는 가상머신이라는 단위로 구별되고, 각 가상머신에는 Ubuntu/Windows 등의 OS가 설치되어 사용된다.

여기서 하이퍼바이저에 의해서 생성되고 관리되는 OS는 Guest OS라고 하며, 각 Guest OS는 다른 Guest OS와는 완전히 독립된 공간과 시스템 자원(Resource)를 할당받아서 사용하게 된다.

가상머신에서 각종 시스템 리소스를 가상화하고, 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 Host에 비해 성능의 손실이 발생하며, Guest OS를 사용하기 위한 라이브러리, 커널 등을 모두 포함하고 있기 때문에 가상머신을 배포하기 위한 이미지를 만들었을 때 이미지의 크기는 매우 크다.

즉, 가상머신은 완벽한 OS를 생성할 수는 있지만, 일반 Host에 비해서 성능이 많이 떨어지고, 매우 큰 용량을 가진 이미지를 어플리케이션으로 배포하기에는 부담스럽다는 단점이 존재한다.

반면, 도커 컨테이너는 가상화된 공간을 생성하기 위해, 리눅스의 자체 기능인 chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능의 손실이 거의 없다.

컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 어플리케이션 구동을 위해 필요한 라이브러리 및 실행 파일만 존재한다. 그래서 컨테이너를 이미지로 만들었을 때, 이미지의 용량이 가상머신에 비해서 대폭 감소하게 된다.

따라서, 컨테이너를 이미지로 반들어 배포하는 시간이 가상머신에 비해 빠르고, 가상화된 공간을 사용할 때의 성능 손실이 거의 없다는 장점이있다.


도커의 장점



1. 편리한 개발

도커 컨테이너는 Host OS 위에서 실행되는 격리된 공간이다.
따라서, 컨테이너 자체에 특별한 권한을 주지 않는 이상, 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정하더라도 Host OS에는 영향을 끼치지 않는다.

즉, 독립된 개발 환경을 보장받을 수 있다.


2. 쉬운 배포

컨테이너 내부에서 여러 작업을 마친 뒤 이를 OS에 배포하려고 한다면, 해당 컨테이너를 '도커 이미지'라는 일종의 패키지로 만들어서 운영 서버에 전달하기만 하면 된다.

컨테이너에서 사용되던 OS에서 새롭게 패키지를 설치할 필요가 없고, 각종 라이브러리 설치 등으로 인한 의존성(Dependency)를 걱정할 필요도 없다. 즉, 배포하면서 발생할 수 있는 많은 버그와 오류들이 많이 줄어든다.

서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능해지게 되는것이다. 환경변화에 적응이 빠르다고도 할 수 있겠다.


3. 독립성과 확장성

마이크로서비스 구조(MSA)의 개발을 통해서 어플리케이션들을 독립적으로 관리하여 편리한 유지보수가 가능하다.
예를 들어서, 웹 서비스를 웹 컨테이너 + 데이터베이스 컨테이너로 분리하여, 웹과 데이터베이스의 이미지를 독립적으로 관리할 수 있게 된다.

여기서 MSA 란 MicroService Architecture의 줄임말이다.

  • 마이크로서비스란 작고, 독립적으로 배포 가능한 각각의 기능을 수행하는 서비스로 구성된 프레임워크라고 할 수 있다. 마이크로서비스는 완전히 독립적으로 배포가 가능하고, 다른 기술 스택(개발 언어, 데이터베이스 등)이 사용 가능한 단일 사업 영역에 초점을 둔다.

도커 아키텍처


도커는 client-server architecture를 사용한다.

Client에서 Docker Daemon에 명령어를 보내서, 컨테이너를 building/running/distributing 하게 된다.

도커 Client와 Daemon은 같은 시스템 안에서 실행될 수도 있고, remote Docker Daemon에 Client를 연결하여 사용할 수도 있다. 그리고, 도커 Client와 Daemon은 UNIX Socket 또는 Network Interface를 기반으로하는 REST API를 사용하여 커뮤니케이션을 한다.

Docker Daemon

도커 데몬(dockerd)는 Docker API 요청을 받고, image/container/network/volume과 같은 도커 Object를 관리한다. 또한, 도커 서비스를 관리하는 다른 데몬과 커뮤니케이션도 가능하다.

Docker Client

도커 클라이언트(Docker)는 도커 유저가 도커와 Interact할 수 있는 주요 방법 중의 하나이다.
'docker run'이라는 커맨드를 입력하게 되면, 클라이언트는 이 커맨드를 dockerd으로 보내고, dockerd에서 이 커맨드를 실행하게 된다.
클라이언트는 Docker API를 사용하며, 하나 이상의 데몬과 커뮤니케이션이 가능하다.

Docker Registries

도커 레지스트리는 도커 이미지(image)를 저장할 수 있는 공간이다.
Docker Hub는 누구나 이용가능한 public registry이며, 기본적으로 도커는 Docker Hub에서 이미지를 찾도록 설정되어 있다.
물론, 개인 Registry도 사용할 수 있다.

Docker Objects

도커를 사용하여 생성할 수 있는 image / container / network / volume / plugin / others ...등등을 뜻한다.




.Reference
https://docs.docker.com/get-started/overview/
https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

profile
# 불편함을 편리함으로 바꾸고싶은 주니어 Back-end 개발자

0개의 댓글