Docker 아키텍처와 기본 개념
공식 문서
Docker 아키텍처
Docker는 크게 두 부분, 사용자와 실제 작업을 처리하는 서버로 나뉘는 클라이언트-서버 구조를 가지고 있습니다.
주요 컴포넌트
도커 클라이언트 (Docker Client)
- 사용자가 명령어를 입력하는 곳으로, Docker와 상호작용하는 인터페이스 역할을 합니다.
- 예:
docker run,docker build같은 명령어 실행
도커 데몬 (Docker Daemon)
- 실제로 Docker의 핵심 기능을 수행하는 서버입니다.
- 클라이언트가 요청한 명령을 받아 컨테이너를 만들고 실행하며 관리합니다.
- 호스트 운영체제 위에서 동작하며 컨테이너 관리, 이미지 빌드, 네트워크 설정 등을 담당합니다.
컨테이너 (Container)
- Docker 이미지를 기반으로 실행되는 독립된 실행 환경입니다.
- 각 컨테이너는 격리되어 있어 다른 컨테이너나 호스트 시스템에 영향을 주지 않고 애플리케이션을 실행할 수 있습니다.
이미지 (Image)
- 컨테이너를 만들기 위한 설계도 같은 것으로, 애플리케이션 실행에 필요한 모든 파일과 설정을 포함한 읽기 전용 템플릿입니다.
레지스트리 (Registry)
- Docker 이미지가 저장되는 장소입니다.
- Docker Hub 같은 공개 저장소가 대표적이며, 사용자들이 이미지를 업로드하거나 다운로드할 수 있습니다.
핵심 기술: 격리와 리소스 관리
Namespace (네임스페이스)
Namespace는 각각의 컨테이너가 독립된 환경처럼 보이도록 만드는 격리 기술입니다.
- PID namespace: 프로세스 ID를 격리해서 다른 컨테이너나 호스트의 프로세스와 섞이지 않게 합니다.
- Network namespace: 네트워크 인터페이스를 격리하여 컨테이너마다 독립적인 네트워크 스택을 제공합니다.
- File system namespace: 파일 시스템 접근을 격리하여 컨테이너가 호스트의 파일에 직접 접근하지 못하게 합니다.
- User namespace: 사용자 권한을 격리하여 컨테이너의 root가 호스트의 root가 아니도록 합니다.
쉽게 말해, 같은 이름이 겹쳐도 namespace가 다르면 서로 다른 독립된 공간으로 인식되어 충돌하지 않게 해줍니다.
Cgroup (Control Groups)
Cgroup은 컨테이너가 사용할 수 있는 시스템 자원을 제한하고 관리하는 기능입니다.
- CPU, 메모리, 네트워크 대역폭 같은 하드웨어 자원을 얼마나 쓸지 제한하거나 모니터링할 수 있습니다.
- 여러 컨테이너가 같은 서버에서 자원을 공평하게 쓰도록 하거나, 특정 컨테이너에 할당량을 정해 서버가 과부하 되지 않게 하는 역할을 합니다.
예시:
docker run -m 512m --cpus 0.5 my-app위 명령어는 컨테이너의 메모리를 512MB로, CPU 사용률을 50%로 제한합니다.
정리
Docker는 Namespace를 통해 프로세스, 네트워크, 파일 시스템을 격리하고, Cgroup을 통해 시스템 자원을 제한하여 경량이면서도 안전한 컨테이너 환경을 제공합니다.
참고 링크
- nowinseoul - 이 튜토리얼의 실제 적용 프로젝트