본문 바로가기

노력을 이기는 재능은 없고
노력을 외면하는 결과도 없다.
- 이창호 9단

D E V E L O P M E N T/DOCKER

[Docker] Docker란 무엇일까요? / Docker 개념 및 설명

  Junesker   2024. 4. 8.
반응형

docker image

 

IT업계에서 종사하는 사람이라면 'docker(도커)'라는 단어를 들어본적이 있을것이다. 일을하면서나 검색을 할때, 다른 팀들과의 협업을 진행할 때, 신기술 관련 회의를 진행할 때 등등 다양한 상황에서 docker라는 단어가 굉장히 많이 나오고 있다. 그렇다는건 현 시대를 살아가는 우리들(IT업계 종사자)에게 친숙하기도하고 실제로도 가장 가까이 자리하고 있는 도커(Docker)라고 하는 친구같은 이녀석에 대해서 알아보도록 해보자.

 

 

 

 

 

√  DOCKER 탄생배경


 

'Docker에 대해서 좀 더 자세하게 알아보자' 라는 마음이 들었을 때, 가장 먼저 궁금했던 사항은 Docker의 탄생배경이었다. Docker라는 녀석을 사용하는데에 있어서 굳이 탄생배경이라는걸 꼭 알아야하나 라는 생각이 들 수 있지만, Docker라는 녀석이 왜 세상에 나타나게됬고 나타남으로 인해서 무엇을 목적으로 Docker라는 이 녀석을 사용하게 하려 하는지에 대한 취지가 궁금해졌다. 

Docker는 2013년 봄 시즌에 Docker 0.9.0 이라는 버전을 달고 세상에 나타났다. 세상에 나오자마자 많은 개발자들 사이에서 폭발적인 인기를 누릴 만큼 매력적인 녀석이었다고 한다. 가장 대표적인 건 가상화 기술의 패러다임을 변화시킨 중요한 이정표 중 하나였기 때문이다.

 

이렇게 2013년 봄 시즌에 태어난 Docker 0.9.0은 개발 및 배포 프로세스를 혁신하기 위해 많은 노력을 하게 된다.  전통적인 가상화 기술은 가상 머신(VM)을 사용하여 애플리케이션을 실행하고 패키지화하는 데 중점을 두었다. 이러한 VM은 호스트 운영 체제 위에서 완전한 게스트 운영 체제(가상 OS)를 실행하는 방식으로 작동한다.

그러나 VM은 상대적으로 무겁고 시작 시간이 오래 걸리며, 리소스를 많이 소모하는 단점이 있다. 호스트 OS위에 게스트OS가 탑재되는 경우라면 가상으로 만들어지는 운영체제를 돌리기 위해서 호스트 OS 자원을 이용하게 되고 그렇게 되면 메모리나 처리에 들어갈 여러 리소스를 잡아먹게 될 것이다. 특히 클라우드 환경에서 대규모 배포 시에는 비용과 관리 부담도 커질것이다.

Docker는 이러한 문제에 대한 대안으로 개발되었다고 한다. Docker는 컨테이너라는 경량화된 가상화 기술을 사용하여 애플리케이션을 패키지화하고 실행하는 데 중점을 두었다. 컨테이너는 호스트 운영 체제와 커널을 공유하므로 VM보다 더 가볍고 시작 시간이 빠르며 리소스를 효율적으로 사용할 수 있다.

이렇듯, Docker의 등장은 개발자와 운영팀 사이의 간극을 줄일 수 있고, 개발부터 운영까지의 생명 주기를 단순화하며, 애플리케이션의 이식성과 확장성을 향상시킬 수 있다. 이러한 이점으로 Docker는 소프트웨어 개발 및 배포의 새로운 표준으로 자리 잡았다.

 

 

 

 

 

√  DOCKER 란?


 

"개발자가 컨테이너 내에서 애플리케이션 배포 및 관리를 자동화할 수 있는 오픈 소스 플랫폼"

 

Docker란 개발자가 개발하고 배포하기 위한 플랫폼, 설치 환경 등등을 컨테이너 내에서 애플리케이션 배포 및 관리를 자동화할 수 있는 개방형 플랫폼이라 한다. Docker 공식 사이트 내, docs에서도 아래와 같이 설명하고 있다.

' Docker는 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 플랫폼, 그리고 Docker를 사용하면 애플리케이션을 인프라에서 분리하여 소프트웨어를 신속하게 제공할 수 있다. Docker를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다. 코드를 신속하게 전달, 테스트 및 배포하기 위한 Docker의 방법론을 활용하면 코드 작성과 프로덕션 환경 실행 사이의 지연 시간을 크게 줄일 수 있다.' 라고 설명하고 있다.

 

[출처]https://blog.qburst.com/2022/07/best-practices-for-building-docker-images/

 

Docker는 위 이미지처럼, 컨테이너를 가득 싣고 있는 배를 떠올리면 되는데 우리가 알고 있는 큰 선박들을 보면 여러 종류의 상품으로 구성되어 있는 컨테이너들을 가득 싣고 있는 모습이다. Docker 또한 개발자가 개발한 플랫폼, 해당 환경을 포함한 소프트웨어 등등이 각각 컨테이너에 구성되어 Docker라는 선박에 실려있는 것이다.

 

기존의 가상화 기술과 달리 Docker는 가상화 오버헤드를 최소화하고, 더 빠르고 효율적인 배포를 가능하게 한다.

Docker 컨테이너는 호스트 운영 체제의 리소스를 공유하며, 가상 머신과 달리 별도의 게스트 운영 체제를 가지지 않기 때문에 가볍고 빠르다. 여기서 VM과 Container의 차이점을 알 수 있다. VM은 호스트 OS위에 게스트 OS와 같은 운영 체제를 가지고 있다. 그렇기 때문에 호스트 OS의 자원을 할당받아 사용하게되고 그로인해 속도가 느려지고 무거워지는 단점이 생긴다. 하지만 Docker Container는 별도의 게스트 OS를 가지지 않기 때문에 가볍고 빠르다는 장점이 있는것이다.

Docker는 개발자와 운영팀 간의 협업을 강화하고 애플리케이션 배포를 단순화하는 데 큰 도움이 된다. 또한 다양한 환경에서 일관된 개발 및 실행 환경을 제공하여 이식성을 향상시키고, 더욱 쉬운 확장성을 제공한다. Docker는 오픈 소스이며, 커뮤니티와 기업을 통해 지속적으로 발전하고 있다.

 

 

 

 

 

√  DOCKER 동작 방식


Docker 아키텍쳐

 

[출처] https://docs.docker.com/get-started/overview/

 

도커 공식 사이트에서 아키텍처를 시각적 자료로 표현한 것이다. Docker는 클라이언트 - 서버 아키텍처를 사용한다. 

Docker 클라이언트는 Docker 컨테이너를 구축, 실행 및 배포하는 무거운 작업을 수행하는 Docker 데몬과 통신한다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행될 수 있고 또는 Docker 클라이언트를 원격 Docker 데몬에 연결할 수도 있다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다. 그리고 Docker 클라이언트는 Docker Compose로 이를 통해 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있다.

 

도커 데몬

Docker 데몬(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크, 볼륨과 같은 Docker 개체를 관리한다. 데몬은 Docker 서비스를 관리하기 위해 다른 데몬과 통신할 수도 있다.

 

도커 클라이언트

Docker 클라이언트는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법이다. docker run과 같은 명령을 사용하면 클라이언트는 이러한 명령을 실행하는 docker로 보내 이를 수행한다. 

 

도커 데스크탑

Docker Desktop은 컨테이너와된 애플리케이션과 마이크로 서비스를 구축하고 공유할 수 있는 Mac, Windows 또는 Linux 환경을 위한 설치가 쉬운 애플리케이션이다. Docker Desktop에는 Docker 데몬, Docker 클라이언트, Docker Compose, Docker Content Trust, Kubernetes 및 자격 증명 도우미가 포함되어 있다. 

 

도커 레지스트리

Docker 레지스트리는 Docker 이미지를 저장한다. Docker Hub는 누구나 사용할 수 있는 공개 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾는다. 자신만의 개인 레지스트리를 실행할 수도 있다. docker pull 또는 docker run 명령을 사용하면 Docker는 구성된 레지스트리에서 필요한 이미지를 가져온다. docker push 명령을 사용하면 Docker는 이미지를 구성된 레지스트리에 푸시한다.

 

 

 


 

 

Docker 핵심 구성요소

 

Docker의 동작방식을 이해하기 위해서는 전체적인 아키텍쳐 구조를 파악하고, 아키텍쳐 구조에서 사용되는 용어를 먼저 알아야한다. 그리고, Docker의 핵심 구성 요소를 알아야한다. 

 

Docker 엔진(Engine)

호스트 시스템에서 실행되는 서비스로, 핵심 역할을 담당하는 소프트웨어이다. Docker엔진은 사용자의 명령을 해석하고, 이미지 빌드, 컨테이너 실행, 네트워킹, 저장소 관리 등등을 수행, 관리한다. 그리고, Docker 엔진은 리눅스 컨테이너 기술(LXC)을 사용하여 컨테이너를 생성 및 관리하고 Linux,Windows,macOS 등 다양한 운영 체제에서 동작하며, 주로 CLI(Command Line Interface)를 통해 사용된다.

 

이미지(Image)

Docker 컨테이너를 생성하고 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 템플릿이다. 이미지는 여러 계층(layer)으로 구성되어 있으며, 각 계층은 파일 시스템의 변경 사항을 나타내고 Dockerfile을 사용하여 정의된다. 정의된 Dockerfile파일에는 이미지를 구성하는 명령과 설정이 포함되어 있다. 이미지는 Docker Hub와 같은 저장소에 저장되어 다른 사용자와 공유하여 사용할 수 있다.

 

컨테이너(Container)

Docker 이미지의 인스턴스로, 실행 중인 애플리케이션을 포함한다. 컨테이너는 격리된 환경에서 실행되며, 호스트 시스템의 자원을 공유하거나 격리된 네트워크 및 저장소를 사용할 수 있다. 각 컨테이너는 고유한 파일 시스템을 가지며, 해당 파일 시스템은 해당 이미지의 변경 가능한 계층 위에 구축된다.

 

도커 파일(DockerFile)

Docker 이미지를 정의하는 텍스트 파일이다. 해당 파일에는 이미지를 구성하기 위한 명령과 설정이 포함되어 있으며 FROM, RUN, COPY, CMD 등의 명령을 사용하여 이미지를 빌드한다. 아래는 FROM, COPY 등등의 사용 명령어를 예시로 들어본다.

# 이미지 정의
FROM ubuntu:latest

# 작업 디렉토리 설정
WORKDIR /app
...

 

Dockerfile은 애플리케이션의 환경 설정, 종속성 설치, 실행 명령 등을 정의한다.

 

도커 허브(Docker Hub)

Docker 이미지의 공식 저장소이다. 개발자들은 Docker Hub에서 이미지를 공유하고, 다른 사용자의 이미지를 다운로드하여 사용할 수 있다. Docker Search를 통해서 사용자가 공유한 이미지들을 검색하여 pull받을 수 있다. Docker Hub는 무료 및 유료 계정을 제공하며, 공개적으로 사용 가능한 이미지 외에도 개인 및 조직용 개인 저장소를 제공한다.

 

 

 


 

 

 

동작방식

 

개발자는 Dockerfile 이라는 파일을 사용하여 이미지를 정의하는데 정의된 Dockerfile에는 애플리케이션의 환경 설정, 종속성, 실행 명령 등이 포함된다. 정의된 Dockerfile을 사용하여 Docker엔진이 이미지를 빌드하고 해당 과정에서 Dockerfile에 정의된 명령을 순서대로 실행하고 이미지를 생성한다. 생성된 이미지는 Docker Hub와 같은 이미지 저장소에 공유할 수 있고 공유된 이미지는 다른 개발자나 시스템에서 다운로드하여 사용할 수 있다. 빌드를 통해 생성된 Docker 이미지를 기반으로 Docker 엔진은 컨테이너를 생성한다. 해당 과정에서 이미지의 파일 시스템과 설정이 컨테이너로 복제되고, 컨테이너가 실행된다. 

컨테이너가 실행되면 해당 애플리케이션이 호스트 OS에서 격리된 환경에서 동작하게 되는데, 호스트 시스템의 자원(CPU, 메모리 등)을 사용하며 필요에 따라 추가적인 설정을 통해 외부와 통신할 수 있다.

 

이렇듯, Docker는 이미지를 기반으로 컨테이너를 생성하고 실행하여 애플리케이션을 배포하고 관리한다. 이러한 방식으로 Docker는 개발과 배포 프로세스를 단순화하고, 이식성과 확장성을 향상시킬수 있는 능력을 갖추고 있다.

 

 

 

 

 

√  가상 머신(Virtual Machine) VS 도커 컨테이너(Docker Container)


 

가상 머신(Virtual Machine) VS 도커 컨테이너(Docker Container)

 

가상 머신(Virtual Machine)은 하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하여 사용하는 방식이다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고 각 가상머신에는 ubuntu, centOS 등의 운영체제가 설치되어 사용된다. 그래서 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 GuestOS라고 하고 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용한다. 이러한 가상화 방식을 사용하는 툴은 VirtualBox, VMware 등이 있다. 그러나, 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생한다. 그 뿐만 아니라 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기 또한 커진다. 

 

도커 컨테이너(Docker Container)는 가상화된 공간을 생성하기 위해 Linux 자체 기능은 chroot, namespace, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들이 떄문에 성능 손실이 거의 없다. 컨테이너에 필요한 커널을 공유해서 사용하고 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머신에 비해 대폭 줄어든다. 따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 가의 없다.

 

가상화 수준

가상 머신(Virtual Machine)은 호스트 운영체제 위에서 게스트 운영 체제를 실행하는 방식으로 작동한다. 이는 호스트와 게스트 간에 완전한 운영 체제 및 하이퍼바이저가 필요하므로 무겁고 리소스를 많이 사용한다. 그러나, 도커 컨테이너는 호스트 운영 체제의 커널을 공유하므로 게스트 운영 체제나 하이퍼바이저가 필요하지 않다. 이로 인해 가상머신보다 더 가볍고 빠르며 리소스를 효율적으로 사용할 수 있다.

 

시작 시간과 성능

가상머신은 시작하는데 몇초에서 몇분까지 소요될 수 있으며, 자원 할당 및 시작 시간이 상대적으로 오래 걸린다. 또한 게스트 운영 체제를 시작하는데 추가적인 시간이 소요된다. 그러나, 도커 컨테이너는 빠르게 시작되며, 몇 초안에 실행될 수 있다. 컨테이너는 이미지를 기반으로 생성되므로 컨테이너의 시작 시간은 이미지의 다운로드 및 설정에 따라 달라진다.

 

이식성

가상머신은 호스트 운영체제와 상관없이 실행될 수 있다. 하지만 VM을 이동하거나 공유하기 위해서는 가상화 소프트웨어 및 호슽으 운영 체제와의 호환성 문제가 발생할 수 있다. 도커 컨테이너는 호스트 운영체제와 커널을 공유하므로 이식성이 뛰어난다. 동일한 이미지를 여러 환경에서 실행할 수 있으며, Docker Hub와 같은 이미지 레지스트리를 통해 이미지를 쉽게 공유하고 배포할 수 있다.

 

리소스 사용

가상머신은 각 VM이 독립적인 운영 체제를 실행하기 때문에 메모리 및 디스크 공간을 많이 소비한다. 또한 가상화 레이어로 인한 오버헤드가 발생할 수 있다. 그러나 도커 컨테이너는 가벼우며, 컨테이너 간에 리소스를 공유하므로 메모리 및 디스크 사용량이 적다. 또한 도커 엔진은 컨테이너를 보다 효율적으로 관리하여 더 적은 오버헤드를 발생시킨다.

 

위 이미지처럼 가상 머신은 각각 독립적인 운영 체제와 하이퍼바이저를 가지고 있고, 호스트 시슽엠 위에 실행된다. 반면 도커 컨테이너는 호스트 운영체제의 커널을 공유하며, 도커 엔진 위에서 실행된다. 이를 통해 도커 컨테이너는 가상머신보다 가볍고 빠르며 이식성이 뛰어나다는 장점이 있다.

 

 

 

 

 

@Junesker


 

반응형

댓글