도커 컨테이너란?
컨테이너란
• 개발자가 라이브러리 및 기타 종속성과 같이 필요한 모든 부분 응용 프로그램으로 패키징하고 하나의 패키지로 모두 전송
• 여러 컨테이너가 동일한 머신에서 실행될 수 있고 OS 커널 다른 컨테이너와 공유
• 각 컨테이너는 사용자 공간에서 격리된 프로세스로 실행
• Container 개념 탄생 = 1 + 2
1.기존 리눅스 환경: 자원 격리 사용(cgroup) + 특정 디렉토리 권한 제한(chroot) 격리 환경
2.변경 사항 레이어 형태로 저장하는 파일 시스템(Union Filesystem)
• 격리된 공간에서 프로세스가 동작하게 해주는 가상화 기술
VM & Container
가상화 개발 => 하이퍼바이저 사용(ex. VMWare, openstack) => 결과물은 가상머신
컨테이너 개발 => Container Runtime 사용 (ex. Docker) => 결과물은 컨테이너
=> 목적은 동일 -> Application을 사용하는 것
동일한 하드웨어라면 컨테이너 사용이 좋음!
-> 컨테이너 사이즈가 더 작으므로 속도가 더 빠름
-> 가상머신은 커널이 들어감. 사이즈가 더 크고 속도가 느림. 근데 보안적 측면에서는 더 좋음
도커 컨테이너란
- 이미지의 실행 가능한 인스턴스. Docker API 또는 CLI를 사용하여 컨테이너 생성, 시작, 중지, 삭제 등을 할 수 있음
- 컨테이너를 하나 이상의 네트워크에 연결하고 스토리지 연결을 하고, 컨테이너의 현재 상태를 기반으로 새 이미지를 생성 할 수 있음
- 기본적으로 컨테이너는 다른 컨테이너, 그리고 호스트 시스템과 격리됨
- 컨테이너는 이미지와 옵션(생성하거나 시작할때 설정한 옵션)에 의해 정의됨
- 컨테이너가 제거될 때, 그 상태에 대한 모든 state는 영구적이지 않으므로 다 삭제됨
Image
- read-only Layer => 변경 불가능
- layer 여러개 겹쳐진게 Image
Container
- writable Layer
- 쓰기가 가능한 Layer가 추가된 것이 Container
- 따라서 Container 내부를 변경할 수 있음
Base Image
- Image를 컨테이너 상에서 동작하게 하는것이 base Image
- Base Image 위에서 각 이미지가 동작
- Base Image는 리눅스 계열
Linux = bootfs + rootfs (rootfs = /bin, /etc, /usr.... / bootfs = Boot loader + Kernel)
Container의 생성
1. dockerd (docker daemon)
- volume, image, networking 관리 뿐 아니라 orchestration 까지 관장하여 처리하며 client 로부터 REST API 형식의 요청 수신하여 처리
2. containerd
- container 의 lifecycle 을 관리하며 client 로부터의 container 관리 관련 요청은 dockerd 를 거쳐 gRPC 통신 통해 containerd 로 전달
- containerd 는 container 관리 위해 runC 사용하여 Container 생성
3. runC
- container 생성
- system 에서 container 관련된 기능들에 대해 docker 가 쉽게 사용할 수 있도록 해주는 가볍고 이식가능한 container runtime
- Docker version 1.11 이후 libcontainer refactoring -> runC (container runtime)
cf) libcontainer
- Docker 진영에서 kernel 의 가상화 기술 다루기 위한 interface 자체적으로 개발, 관리해야 한다는 필요성으로 만든것
- kernel 의 가상화 관련 기술들을 직접적으로 다룰 수 있는 자체 구현체
Container Process
1. dockerd 는 요청을 gRPC 통해 containerd 로 전달
2. containerd 는 exec 을 통해 containerd-shim 자식으로 생성
3. containerd-shim 은 runc 이용하여 container 생성
4. runc 는 container 가 정상적으로 실행되면 exit
5. containerd-shim 은 그대로 살아있으며, 이는 container 내에서 실행되는 process 들의 부모
Cgroups과 Namespace
Cgroups
• 하나의 컴퓨터는 다수의 네임스페이스를 가질 수 있고, 각각은 커널에 의해 강제된 리소스 속성(제한) 가짐
• 프로세스에서 사용 가능한 CPU, 메모리, 네트워크 대역폭, 디스크 I/O 등 을 그룹 단위로 제어하는 리눅스 커널 기능
• 컨트롤 그룹은 컨테이너에서만 사용되는 기능은 아니고, 리눅스 시스템에 서 프로세스 관리 위해 일반적으로 사용
Namespace
• VM에서는 각 게스트 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능
• 리눅스에서는 이와 동일한 역할을 하는 namespaces 기능 커널에 내장
도커 컨테이너도 Cgroup과 Namespace를 제공한다.