Docker는 컨테이너 기반의 오픈 소스 플랫폼으로, 애플리케이션을 컨테이너 내에 패키징하여, 어디서나 동일하게 실행할 수 있게 해줍니다.
컨테이너는 코드, 런타임, 시스템 도구, 라이브러리 등 애플리케이션 실행에 필요한 모든 것을 포함하는 경량의 독립 실행 가능한 패키지입니다.
Docker는 개발자가 소프트웨어를 더 빠르게 빌드, 테스트, 배포할 수 있도록 돕습니다.
Docker 사용 이유
- 환경 일관성
- Docker를 사용하면 개발, 테스트, 프로덕션 환경 간의 차이를 최소화할 수 있습니다. 컨테이너는 모든 종속성을 내부에 포함하기 때문에 어디서나 동일하게 실행됩니다.
- 빠른 배포와 확장
- 컨테이너는 가벼우며 시작이 빠르기 때문에, 애플리케이션의 배포와 확장이 간단하고 빠릅니다.
- 개발과 운영의 분리
- Docker를 사용하면 개발자는 애플리케이션의 빌딩과 배포 과정에 더 집중할 수 있으며, 운영 팀은 배포된 애플리케이션의 관리와 확장에 집중할 수 있습니다.
- 리소스 효율성
- Docker는 가상 머신보다 훨씬 적은 리소스를 사용합니다. 하나의 시스템에서 여러 컨테이너를 효율적으로 실행할 수 있습니다.
- 이식성
- Docker 컨테이너는 어떤 환경에서도 실행할 수 있습니다. 이는 클라우드, 온-프레미스, 개발자의 로컬 머신 등을 포함합니다.
- 개발 프로세스 간소화
- Docker는 개발, 배포 및 실행을 위한 간편한 워크플로우를 제공합니다. 이를 통해 소프트웨어 개발 라이프사이클이 간소화됩니다.
Docker의 구조
Docker는 컨테이너 가상화의 구조를 가집니다. 여기서 Container Engine이 Docker Engine입니다.
HardWare
- Host Os의 4대 리소스를 사용 합니다.
- CPU, Memory, Disk, Network를 적당하게 분배하여 사용합니다.
Kernal
Namespace (네임스페이스)
- 기능
- 네임스페이스는 프로세스에 대한 격리된 환경을 제공합니다.
- 프로세스 그룹이 시스템의 나머지 부분과 분리되어 실행될 수 있게 합니다.
- 프로세스에 대한 환경 격리를 실행합니다.
- 구성요소
- PID (Process ID) 네임스페이스
- 프로세스 ID를 격리하여, 컨테이너 내의 프로세스가 시스템의 다른 프로세스와 동일한 PID를 가지지 않도록 합니다.
- 컨테이너 내에서는 프로세스가 자신을 PID 1로 인식할 수 있으며, 이는 시스템의 PID 1과는 별개입니다.
- 네트워크 네임스페이스
- 컨테이너마다 독립된 네트워크 스택(IP 주소, 포트 번호 등)을 가질 수 있게 해줍니다.
- 이를 통해 각 컨테이너가 독립적인 네트워크 인터페이스와 IP 주소를 가질 수 있습니다.
- 마운트 네임스페이스
- 파일 시스템 마운트 포인트를 컨테이너마다 독립적으로 가질 수 있습니다.
- 이를 통해 컨테이너는 파일 시스템의 특정 부분만을 볼 수 있으며, 호스트 시스템의 파일 시스템 구조와는 분리됩니다.
- UTS (UNIX Time Sharing System) 네임스페이스
- 호스트 이름과 도메인 이름을 격리하여 컨테이너 내부에서 별도의 호스트 이름을 가질 수 있습니다.
- 사용자 네임스페이스
- 사용자와 그룹 ID를 컨테이너 내부에서 격리합니다.
- 이를 통해 컨테이너 내부의 사용자는 호스트 시스템의 다른 사용자와는 다른 권한을 가질 수 있습니다.
- PID (Process ID) 네임스페이스
cgroups (컨트롤 그룹)
- 컨트롤 그룹(cgroups)은 프로세스 그룹의 시스템 리소스(CPU, 메모리, 입출력 등) 사용을 제한하고 격리하는 기술입니다.
- 이를 통해 컨테이너가 시스템 리소스를 과도하게 사용하는 것을 방지하고, 시스템의 안정성을 유지할 수 있습니다.
- 예를 들어, 특정 컨테이너가 사용할 수 있는 CPU 시간이나 메모리 양을 제한할 수 있습니다.
chroot
- chroot는 프로세스의 루트 디렉토리를 변경하는 명령어입니다.
- 이 기술을 사용하면, 컨테이너 프로세스가 파일 시스템의 특정 부분만을 루트 디렉토리로 인식하도록 할 수 있습니다.
- chroot는 주로 파일 시스템의 격리를 강화하는 데 사용되며, 프로세스가 호스트 시스템의 나머지 부분에 접근하는 것을 제한합니다.
- 프로세스에 대한 파일 시스템을 격리 합니다.
DockerEngine
Docker 엔진은 컨테이너화된 애플리케이션을 빌드, 배포, 실행할 수 있게 하는 애플리케이션입니다. 여러 컴포넌트와 함께 작동하여 컨테이너의 생명 주기를 관리합니다.
Docker Daemon(dockerd)
- 공식문서에서 dockerd란 컨테이너들을 관리해주는 백그라운드 프로세스(docker daemon)라고 합니다.
- dockerd는 Docker Engine API의 요청을 unix, tcp, rd 세 종류의 소켓으로 받을 수 있다고 합니다. 이 세가지 중 별다른 설정을 하지 않으면 unix 도메인 소켓을 사용 합니다. docker.socket을 사용하여 unix 컴퓨터와 통신을 하게 됩니다.
- Docker의 이미지, 컨테이너, 네트워크, 볼륨과 같은 다양한 객체의 생명 주기를 관리합니다.
- Docker Daemon이 실행되고 있어야만 Docker 컨테이너를 생성, 실행, 중지, 삭제 등을 할 수 있습니다.
Docker.socket이란?
docker.socket
은 시스템의 Docker Daemon과 통신하기 위해 사용하는 유닉스 소켓 파일입니다.
이 소켓을 통해 Docker 클라이언트와 다른 도구들은 HTTP를 사용하여 Docker Daemon과 통신할 수 있습니다.
일반적으로,
docker.socket
은 Docker Daemon이 시스템 부팅 시에 자동으로 시작되도록 설정하는 systemd 서비스에 의해 관리됩니다.
docker.socket
을 사용함으로써 Docker API 요청을 Docker Daemon으로 전송할 수 있으며, 이는 Docker 컨테이너의 생성, 실행, 중지 등의 작업을 가능하게 합니다.
- 구조
- 서버 : 실제로 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체, dockerd 프로세스
- 클라이언트 : 도커 데몬 API를 이용할 수 있도록 CLI(command line interface)를 제공하는 것
- 클라이언트와 도커 데몬이 동작하는 과정
- 사용자가 docker 명령어를 입력 #CLI
- 클라이언트는 /var/run/docker.sock 유닉스 소켓을 사용하여 도커 데몬에게 명령어를 전달
- 도커 데몬은 이 명령어를 파싱하고 명령어에 해당하는 작업을 수행
- 수행 결과를 도커 클라이언트에게 반환하고 사용자에게 결과를 출력
Containerd
- containerd는 컨테이너의 생명 주기를 관리하는 산업 표준 컨테이너 런타임입니다.
- Docker Daemon에 의해 사용되며, 이미지를 가져오고, 저장하고, 컨테이너를 실행하기 위한 더 낮은 수준의 작업을 담당합니다.
- containerd는 OCI(Open Container Initiative) 표준을 준수하며, 이미지 관리, 네트워크 설정, 실행 중인 컨테이너의 생명 주기 관리 등을 담당합니다.
OCI란?
Open Container Initiative (OCI)는 컨테이너 기술의 표준화를 목표로 하는 프로젝트입니다. 2015년에 Docker, Inc.와 다른 주요 기술 회사들에 의해 설립되었습니다. OCI는 컨테이너 이미지 포맷과 컨테이너 런타임의 표준 사양을 개발하고 유지 관리하는 데 중점을 두고 있습니다. 이 표준화된 사양을 통해 다양한 컨테이너 기술과 플랫폼 간의 상호 운용성을 보장하고, 개발자들이 한 플랫폼에서 작성한 컨테이너가 다른 어떤 OCI 준수 플랫폼에서도 실행될 수 있도록 합니다.
runc
- runc는 컨테이너를 실행하기 위한 명령줄 인터페이스(CLI) 도구로, Open Container Initiative (OCI) 컨테이너 런타임 사양을 구현합니다.
- runc는 가장 기본적이면서 순수한 형태의 컨테이너 런타임으로, Docker, containerd, Podman 등과 같은 더 고수준의 컨테이너 관리 도구에 의해 백엔드에서 사용됩니다.
- 이 도구는 Linux 컨테이너를 시작, 실행, 정지하는 데 필요한 모든 기능을 제공하며, 다른 시스템에서도 사용될 수 있도록 다양한 플랫폼을 지원하려는 노력이 진행 중입니다.
- 즉, runc는 컨테이너를 실제로 생성하고 실행하기 위한 최소한의 컨테이너 런타임으로, 네임스페이스, cgroups, apparmor, seccomp과 같은 리눅스 커널 기능을 사용하여 컨테이너의 격리와 리소스 관리를 수행합니다.
'AWS Cloud School > Docker' 카테고리의 다른 글
가상화에 대해 (0) | 2024.03.23 |
---|