Docker 3. 기타 (containerd, 컨테이너 가상화방법...)

최강일·2022년 12월 11일
0

Docker

목록 보기
5/5

개요

docker 관련해서 추가적으로 궁금했던 내용들을 정리한다.

목차

  • 기타(궁금한 내용들)
    • containerd
    • 가상머신에서는 하이퍼바이저로 독립된 환경을 만든다. 컨테이너가 어떻게 독립된 환경을 만들었나
    • Ingress Overlay Network

containerd

Docker Engine이라는 하나의 패키지에 API,CLI,네트워크,스토리지 등 여러 기능들을 모두 담게 되었다.
때문에 Docker에 의존하고 있던 Kubernetes에서는 새로운 Docker 버전이 나올때마다 Kubernetes가 크게 영향을 받는 일들이 생겼다.

그래서 여러 집단들이 한데 모여 Open Container Initiative, 이하 OCI라는 프로젝트를 시작하여 컨테이너에 관한 표준을 정하는 일을 시작했다. 그래서 Docker에서는 OCI 표준을 준사하는 containerd라는 Container Runtime을 만들고, Kubernetes에서는 OCI 표준을 준수하는 이미지들을 실행할 수 있는 Container Runtime Interface, 이하 CRI 스펙을 1.5부터 제공함으로써 Docker 버전과 무관하게 OCI표준을 준수하기만 하면 어떤 컨테이너 이미지도 Kubernetes에서 실행가능한 환경이 만들어지게 되었다.

이렇게 Container Runtime이 Monolithic 아키텍처에서 분리되어 나오면서 Java 어플리케이션을 배포할 때 JDK보다 가벼운 JRE를 사용하는 것처럼 컨테이너를 실행할 때 무거운 Docker Engine이 아닌 containerd나 CRI-O와 같은 가벼운 Container Runtime을 사용하게 되면서 다음과 같은 장점도 있다.
더 빠르게 시작되며 cpu,memory 사용량이 줄었다. 하지만 반대로 Docker에 비해 사용하는것이 까다롭다.


![](https://velog.velcdn.com/images/shine230345/post/367aaf66-8477-434b-924d-f7b888c6a149/image.png)

요약하자면 Docker Engine 패키지에 많은 기능들이 응집해 있었고, 그에 의존도가 높았던 프로젝트들(Kubernetes)이 줄줄이 영향 받게 되었다. 그래서 Container Runtime 표준을 만들었고, Docker에서 만든 Container Runtime이 바로 containerd이다.
각자의 플랫폼은 표준을 따르기만 하면되고, 사용자 입장에서는 더욱 더 컴팩트한 사용이 가능은 해졌다.

참고로 containerd의 d는 daemon의 d이다. OCI구현체를 이용해 container를 관리해주는 daemon이다.
Docker engine자체는 이미지,네트워크,디스크 등의 관리 역할을 하고, 엔진과 containerd 각각이 분리된 덕분에 엔진 버전을 올릴 때 엔진을 재시작해도 container의 재시작 없이 사용할 수 있게 되었다.

참고
https://www.linkedin.com/pulse/containerd는-무엇이고-왜-중요할까-sean-lee/?originalSubdomain=kr
https://tech.ssut.me/what-even-is-a-container/

가상머신에서는 하이퍼바이저로 독립된 환경을 만든다. 컨테이너가 어떻게 독립된 환경을 만들었나?

리눅스 Cgroups 및 네임스페이스로 컨테이너가 독립적으로 돌아간다.

docker의 기본 아이디어는 프로세스와 cpu,memory,disk i/o, network 등의 리소스들을 컨테이너라는 하나의 그룹으로 묶어서 관리하는 것이다. namespace,cgroup 등 Linux의 여러 커널기능들을 조합하여 만들었다.

namespaces

VM에서는 각 게스트 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 갖고 있습니다.
리눅스에서는 이와 동일한 역할을 하는 namespaces기능을 커널에 내장하고 있다.
현재 리눅스 커널에서는 다음 6가지 namespace를 지원하고있다.

  • mnt (파일시스템 마운트): 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능
  • pid (프로세스): 독립적인 프로세스 공간을 할당
  • net (네트워크): namespace간에 network 충돌 방지 (중복 포트 바인딩 등)
  • ipc (SystemV IPC): 프로세스간의 독립적인 통신통로 할당
  • uts (hostname): 독립적인 hostname 할당
  • user (UID): 독립적인 사용자 할당
pid namespace 예제 : 프로세스별로 독립적인 공간을 할당

1. 실행 : sudo unshare --fork --pid --mount-proc bash
2. 확인 : ps aux

namespace를 통해 독립적인 공간을 할당한 후에 nsenter 라는 명령어를 통해 이미 돌아가고 있는 namespace공간에 접근할 수 있다. namesapce enter의 약자이다. docker exec와 비슷한 역할을 한다.
단 docker exec 와는 다르게 cgroups에 들어가지 않기 때문에 리소스 제한의 영향을 받지 않는다.

cgroups(Control Groups)

자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다.
cgroups는 다음 리소스를 제어한다.

  • memory
  • cpu
  • i/o
  • 네트워크
  • device 노드(/dev/)
메모리 제어 예제 : 실행중인 프로그램의 메모리를 제한

1. 제어기 생성 : sudo cgcreate -a 유저 -g memory:테스트
2. 목록 조회 : ls -alh /sys/fs/cgroup/memory/테스트
3. 2MB로 제한 : echo 2000000 > /sys/fs/cgroup/memory/테스트/memory.kmem.limit_in_bytes
4. 쉘 실행시켜 메모리 제한 확인 : sudo cgexec -g memory:테스트 bash -> top

lxc,libContainer,runC 등은 cgroups,namespaces를 표준으로 정의해둔 OCI(Open Container Initative)스펙을 구현한 컨테이너 기술의 구현체이다.

Summary
도커의 컨테이너 기술은 리눅스의 컨테이너(LXC)를 활용한 기술로, 컴퓨터에 독립적인 컴퓨팅 공간을 만들어낸다.
이는 기존의 VM과는 가상환경 구조에 차이가 있다.
vm은 환경 자체(os)를 가상화하지만 도커 컨테이너는 호스트 os의 커널을 공유하며 단순히 하나의 격리되어 있는 프로세스로써 동작한다.

=> 도커는 프로세스를 격리하고 프로세스에 필요한 컴퓨팅 자원을 독립적으로 할당/격리하여 완벽히 격리된 가상 환경을 구축하게 해준다.

Ingress Overlay Network

(작성중)

추가할 내용(2022-12-06)

  • swarm : 설정 파악
  • 도커 네트워크 : 사용하는 방법 자세히 파악 (bridge)
profile
Search & Backend Engineer

0개의 댓글