Docker
[도커 알아가기] 2. 도커와 Docker engine
begong
2025. 1. 16. 02:58
반응형
관련 글 목록
1편에서 컨테이너 기술의 역사와 동작원리에 대해 알아보았습니다.
이어서 도커에 대해서 알아보겠습니다.
도커란?
- 컨테이너화 기술을 기반으로 하는 오픈 소스 플랫폼
- 애플리케이션 개발, 배포, 실행의 모든 과정을 자동화하고 간소화하는 데 도움을 줌
도커의 발전과정
- 초기엔 LXC를 기반으로 개발되었음
- docker초기에는 lxc를 사용하여 컨테이너를 실행
- Docker의 컨셉과 어울리지 않고(LXC의 복잡함, 과도한 기능),의존성 문제 떄문에
Libcontainer
를 개발- LXC : 각 컨테이너가 독립적인 리눅스 시스템처럼 동작할 수 있게 함
- ⇒ docker는 애플리케이션만 독립되면 됨.
- Libcontainer
- 광범위한 격리 기술을 만들고, 리눅스 커널에 있는 namespace, cgroup을 사용하여 컨테이너를 만들고 컨테이너의 수명주기를 제어하기 위해 개발
- 1.11.0 버전까지는 모놀리식으로, 모든 작업이 Docker Engine에서 실행되었음
- 현재는 여러 부분으로 모듈화 되어 작업이 여러부분에서 이루어짐
Docker의 아키텍쳐
- client - server아키텍처
- Docker client는 Docker Daemon과 통신
- Docker client
- 사용자가 Docker와 상호작용 할 수 있게 함
- 사용자가 명령을 내리면 dockerd로 명령을 보냄
- Docker Daemon
- API요청을 수신하여 이미지, 네트워크, 컨테이너, 볼륨과 같은 Docker 객체를 관리
Docker 객체
- 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체로 이루어짐
도커 실행의 주요 구성요소
- Docker 엔진
- Docker Daemon(dockerd), API, Docker CLI로 구성
- 💡Docker Runtime (runC, containerd 등)을 하위집합에 넣기도 함 (공식문서에는 위에 3개만 엔진의 요소로 들어가 있음)
- Dockerd
- Docker API 요청을 수신
- 역할
- 이미지 관리, 이미지 빌드, REST API, 인증, 보안, 코어 네트워킹, 오케스트레이션
- Docker CLI
- 명령어를 dockerd 에게 REST API형태로 전달
- containerd
- 컨테이너의 수명주기 관리, 이미지 push/pull, 스토리지 제어, 네트워크 관리, 네임스페이스 관리
- OCI런타임과 runC를 제어
- 컨테이너를 실행(생성)하기 위해 runC를 사용
- 이미지 관리 및 고급 API와 같은 다른 최상위 기능도 제공
- 💡
- runC와 containerd-shim이 containerd의 하위에 들어간다고 볼 수 있음
- runC
- OCI 형식에 따라 저수준에서 실행되는 애플리케이션을 패키징(생성)하는 런타임
- Libcontainer를 발전시켜 runC가 탄생 (Libcontainer는 runC에 포함됨)
- containerd-shim
- 컨테이너 프로세스가 runC의 하위프로세스로 시작되는데, runC는 컨테이너가 생성한 뒤 종료됨.
- shim이 새로운 상위 프로세스가 되어 컨테이너의 생명주기를 관리함.
- containerd가 컨테이너의 file descriptor와 종료상태를 관리하는 최소한의 코드만 메모리에 남김
- shim의 주요 역할
- Daemon이 재시작될 때, 파이프가 닫히는 등의 이유떄문에 container가 종료되지 않도록 stdin, stdout스트림을 열린 상태로 유지
- Docker나 containerd가 작동하지 않더라도 stdin, stdout, stderr와 같은 파일정보를 보관
- daemon에게 container의 종료 상태 보고
출처: https://medium.com/faun/the-missing-introduction-to-containerization-de1fbb73efc
도커의 실행 흐름
- 사용자가 Docker CLI를 통하여 명령어 실행
- Docker client는 적절한 API로 변환하여 Docker Daemon에게 전달
- Docker Daemon이 containered와 상호작용하며 컨테이너 실행과 관련된 작업을 함
- containerd
- 실제 컨테이너를 관리, 실행, 도커가 요청한 작업을 처리
- 이미지 풀링, 컨테이너 실행 및 중지 등 수행
- runC 를 사용하여 프로세스를 생성하고 격리
- runC
- 실제 컨테이너의 프로세스 격리 및 실행을 담당
- 네임스페이스와 cgroups를 활용하여 컨테이너를 격리하고 실행
- 컨테이너를 생성한 뒤 종료됨
출처 : https://gngsn.tistory.com
- 실제 컨테이너의 프로세스 격리 및 실행을 담당
- containered-shim
- runC가 실행한 컨테이너 프로세스를 추적, 컨테이너의 실행 상태를 관리.
- 컨테이너가 종료되면 종료된 컨테이너의 상태를 containerd에 보고
출처 및 참고문서
Introducing runC: a lightweight universal container runtime | Docker
Difference between Docker Desktop and Docker Engine
Something Missed? : History of Container Technology
반응형