CS

도커는 뭘까?

duddn 2024. 6. 28. 08:32


도커는 격리되어있으며 가상화된 실행환경을 제공하는 플랫폼입니다. 격리되어있다는 것은 호스트 PC의 환경 혹은 도커로 실행한 프로세스간 서로의 환경에 영향을 받지 않고 실행할 수 있다는 의미이고, 가상화된 실행환경이란 물리적인 실행환경(OS, 애플리케이션 의존성)을 논리적인 실행환경(컨테이너)으로 변환한 환경을 의미합니다. 즉 논리적인 실행환경을 제공하기 때문에 특정 물리적인 실행환경에 종속되지 않고 도커가 설치된 어떠한 물리적인 환경에서도 일관된 실행결과를 보장합니다.

도커를 사용하는 이유

  1. 도커만 깔려있으면 실행환경과 관계없이 동일한 실행결과를 보장받을 수 있어 배포가 용이합니다. 예를들면 Ubuntu, Node 20환경에서 특정 애플리케이션을 실행하고자하면, 실행환경을 DockerFile에 코드로 명시해 해당 환경에서의 실행을 보장받을 수 있습니다. 따라서 Ubuntu를 사용하지 않는 개발자도 운영환경에서의 실행결과와 같은 결과를 확인할 수 있습니다.
  2. 도커는 VM에 비해 훨씬 가볍습니다. 필요한 애플리케이션과 의존성만 가지기 때문에 빠르게 시작하고 종료할 수 있습니다. 이러한 이유로 빠르게 배포할 수 있어 확장이 용이합니다.
  3. 컨테이너에서 발생한 문제가 호스트 PC및 다른 컨테이너에 영향을 끼치지 않습니다. 컨테이너는 격리되어 실행되기 때문입니다.
  4. 애플리케이션간 의존성이 충돌하지 않습니다. 하나의 PC에서 여러가지 프로세스를 동시에 실행시키는데, 각 프로세스의 의존성이 달라도 격리되어 실행되기 때문에 의존성이 충돌하지 않습니다.
  5. 각 컨테이너가 사용하는 리소스를 효율적으로 관리할 수 있습니다. 특히 마이크로서비스 아키텍처를 사용했을때 필요한 부분을 확장하고, 축소할 수 있습니다.

도커와 컨테이너

컨테이너의 탄생배경

리눅스의 chroot기능을 먼저 이해해야합니다. 리눅스의 사용자가 ls / 명령어를 입력하면 권한이 없을경우 당연히 접근할 수 없습니다. 이때 사용자가 항상 루트 디렉토리에 권한이 없기 때문에 사용자의 자유도를 낮춥니다. 보안을 유지하며 사용자가 오롯이 루트를 포함한 자신의 공간을 가질 수 있게 하는 명령어가 chroot입니다. chroot를 사용해 해당 사용자의 루트 디렉토리를 특정 위치로 지정할 수 있습니다. 이를 사용해 사용자의 파일 시스템을 완전히 격리할 수 있습니다.

chroot를 확장한 기능이 FreeBSD Jail 입니다. 파일시스템 뿐만 아니라 네트워크, 사용자, 프로세스등의 자원또한 격리할 수 있습니다. 현재의 컨테이너와 비슷한 기술입니다.

이러한 기술들을 확장시켜 현재의 컨테이너가 탄생했습니다. 특정 프로세스를 위한 격리된 공간으로 파일시스템, 프로세스, 네트워크, 사용자, 시스템 리소스(CPU, 메모리 등)을 격리시킬 수 있습니다. 또한 애플리케이션과 애플리케이션의 의존성을 모두 컨테이너에 적재해 격리되어 실행시킬 수 있습니다.

컨테이너는 왜 컨테이너일까?

도커를 사용하면 컨테이너에 애플리케이션에 필요한 의존성을 담아 애플리케이션의 실행환경을 신경쓰지 않고 실행시킬 수 있습니다. 이때 이름이 컨테이너인 이유는 실제 컨테이너의 역할과 일치하는 측면이 있기 때문입니다.

선박에 컨테이너를 싣고 수출입을 할때 해상 운송업자는 각 컨테이너 내부의 세부사항에 대해 신경쓰지 않습니다. 컨테이너는 규격이 일정하고 표준에 맞게 설계되었기 때문에 배에 컨테이너를 올리고, 잘 쌓고, 다시 내리는 과정에서 일일이 신경쓰지 않고 모두 같은 프로세스를 적용할 수 있습니다.

도커의 컨테이너도 마찬가지로 관리자는 세부사항을 신경쓰지않고 애플리케이션을 실행시킬 수 있습니다. 애플리케이션은 독립된 가상의 환경에서 실행되고 일관된 결과를 보장합니다.

컨테이너를 이루는 기술

Namespace

리눅스 커널이 제공하는 프로세스 격리기술입니다. 이 기술을 사용하면 격리된 프로세스가 마치 자신이 독립된 시스템에서 실행되는 것처럼 느끼게됩니다. 각 프로세스는 자신의 파일 시스템, 프로세스 목록, 네트워크, 사용자 ID, 등을 가지게 됩니다.

Cgroup

Control Group은 리눅스 커널이 제공하는 프로세스 그룹의 자원을 제한, 관리하는 기술입니다. 시스템 관리자는 특정 프로세스 그룹이 시스템 자원(CPU, 메모리 등)을 얼마나 사용할지 설정하고 모니터링할 수 있습니다.

가상머신 vs 도커

가상머신은 하드웨어를 논리적으로 분할해 다수의 운영체제를 운용합니다. 이를 “하드웨어를 가상화한다”고 하고 하이퍼바이저 기술을 사용합니다. 논리적으로 분할한 공간에 OS를 통채로 올리게 됩니다. 따라서 매우 무겁고 사용하지 않는 기능 또한 모두 올라가 자원낭비가 존재합니다.

도커의 컨테이너는 하드웨어를 가상화하는것이 아닌 프로세스의 실행환경을 가상화합니다. 따라서 실행환경 중 필요한 라이브러리와 바이너리만 포함해 매우 가볍습니다.

가상머신의 장점은?

완전한 운영체제를 제공하는것이 가상머신의 강점입니다. 도커는 단일 프로세스를 실행하기 위한 목적을 가지고 있기 때문에 여러가지 운영체제를 사용해보고 싶을때 도커를 선택하는것은 좋지 않은 선택입니다.

도커 아키텍처

도커 클라이언트

사용자가 도커를 사용하기 위해 명령을 실행하는 인터페이스입니다. 도커 클라이언트는 해당 명령의 실행을 실제로 수행하는 도커 데몬에게 요청을 보냅니다.

도커 데몬

호스트 PC에서 실행되는 백그라운드 서비스로 실제로 컨테이너와 컨테이너 이미지를 실행하고 관리합니다. 이 작업을 수행하기 위해 호스트 운영체제의 커널과 상호작용합니다.

도커 레지스트리

컨테이너 이미지를 저장하는 레지스트리입니다. 대표적으로 Docker Hub가 있습니다.

하위수준 아키텍처

containerd

컨테이너 런타임으로 컨테이너 이미지를 관리하고 컨테이너를 실행, 중지, 삭제하는 기능을 제공합니다. Docker의 핵심 런타임 컴포넌트입니다.

CRI를 지원해 kubernetes와 통합될 수 있습니다.

CRI

컨테이너 런타임 인터페이스로 kubernates에서 다양한 컨테이너 런타임을 지원하기 위해 정의된 표준 인터페이스입니다.

Shim

컨테이너 런타임 환경에서 중요한 역할을 하는 컴포넌트입니다. 컨테이너 런타임(ex) containerd)와 실행 바이너리(ex) runc) 사이에서 작동합니다. 컨테이너의 상태를 모니터링해 containerd에 보고합니다.

RUNC

OCI 표준을 따르는 경량의 컨테이너 실행 도구입니다. 컨테이너를 실제로 생성하고 실행하는데 사용됩니다. cgroup, namespace등의 실제 시스템콜에 접근합니다.

OCI

컨테이너의 표준을 정의하는 오픈소스 프로젝트입니다. 컨테이너 기술의 호환성을 보장하고, 다양한 컨테이너 런타임과 이미지가 상호 운용될 수 있도록 하기 위해 설립되었습니다.

 

출처

https://docs.docker.com/guides/docker-overview/

 

Docker overview

Get an in-depth overview of the Docker platform including what it can be used for, the architecture it employs, and its underlying technology.

docs.docker.com

https://hwan-shell.tistory.com/116

 

Linux) Doker와 Container의 탄생과 설명, 차이점

※이 글은 제가 인터넷으로 공부한걸 바탕으로 작성된 글입니다. 잘못된 내용이나 보충해야할 내용이 있으면 댓글이나 E-mail로 피드백 해주시면 감사하겠습니다. What is Docker? 도커는 리눅스의

hwan-shell.tistory.com

https://medium.com/echo-devblog/도커를-도입하는-이유-1-컨테이너-기술-원리-90a28c14024e

 

도커를 도입하는 이유 — 1. 컨테이너 기술 원리

“도커를 도입하는 이유 — 1. 컨테이너 기술 원리” is published by echo in echo DevBlog.

medium.com

https://hudi.blog/about-docker/

 

이론과 실습을 통해 이해하는 Docker 기초

본 포스팅은 도커에 대한 자세한 개념, 도커 기본 명령어, 컨테이너 실행 실습, 도커 컴포즈, 도커 이미지 빌드, 도커 허브에 이미지 배포 등 전반적인 도커 기초에 대한 내용을 다룬다. 1. 도커 (D

hudi.blog

https://medium.com/javarevisited/how-docker-works-internally-magic-behind-containerization-65ea5aa0a4ff

 

How Docker works internally? Magic Behind Containerization

Exploring the Inner Workings of Docker: Unveiling the Magic Behind Containerization

medium.com

https://medium.com/@furkan.turkal/how-does-docker-actually-work-the-hard-way-a-technical-deep-diving-c5b8ea2f0422

 

How does Docker actually work? The Hard Way: A Technical Deep Diving

Unveiling the power of Docker: What is Docker? How does Docker work? Explore the world of containerization in this zero to hero guide.

medium.com