Docker는 핵심 기능인 Docker Engine을 중심으로 컴포넌트를 조합하여 어플리케이션 실행 환경을 구축함. CLI 환경에서 도커를 다루는게 매우 중요함
도커의 이미지를 생성 및 컨테이너를 기동시키기 위한 도커의 핵심 기능
도커 명령 실행 및 Dockfile을 통한 image를 생성
컨테이너의 바탕이 되는 도커 이미지를 공개 및 공유하기 위한 레지스트리 기능
도커 허브도 도커 레지스트리를 사용
여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 애플리케이션의 실행 환경을 구성하는 컨테이너를 일원 관리하기 위한 툴
쿨라우드 환경에 도커의 실행환경을 명령으로 자동 생성하기 위한 툴
도커 스웜은 여러 도커 호스트를 클러스터화하기 위한 툴
클러스터를 관리하거나 API를 제공하는 역할은 Manager 가 컨테이너를 실행하는 역할은 Node가 담당
오픈 소스인 쿠버네티스가 대표적인 도커 스웜
도커는 컨테이너라는 독립된 횐경을 만들고 그 컨테이너를 구획화하여 애플리케이션의 실행환경을 만듬
이 컨테이너를 구획하는 기술은 리눅스 커널의 nameSpace
라는 기능을 사용하고 있음.
namespace
란 한덩어리의 데이터에 이름을 붙여 분할함으로써 충돌 가능성을 줄이고, 쉽게 참조할 수 있게 하는 개념
따라서 리눅스의 오브젝트에 6개의 독립된 환경을 구축할 수 있음
PID namespcae
: 각 프로세스에 할당된 고유한 ID, 네임 스페이스가 다르면 다른 프로세스끼리 서로 액세스가 불가하다.(장고 뷰 프로젝트 도커환경에서 장고 리소스 파일들을 뷰에서 액세스가 불가했었다.)
Network namespace
: 네트워크 디바이스, ip주소, 포트번호, 라우팅 테이블, 필터링 테이블등 과 같은 네트워크 리소스를 격리된 namespace 마다 독립적으로 가질 수 있다. (장고 vue 연동했던 프로젝트에서도 도커 환경을 이용해서 포트번호를 다르게 부여 했었다.)
UID namespace
: namespace 안과 밖에서 서로 다른 UID GID를 가질 수 있음.
예를들어 ubuntu docker 환경에서 루트 이용자 이지만, ubuntu host root 이용자는 아닌 이런 환경을 세팅해서 컨테이너 별로 권한을 격리시켜서 보안환경을 구축할 수 있음.
Mount namespace
: namespace 안에서 수행한 마운트는 호스트 os나 다른 namespace에서 액세스 할 수 없음.
UTS namespace
: namespace 별로 호스트명이나 도메인명을 독자적으로 가질 수 있음.
IPC namespace
: 프로세스간의 통신 오브젝트를 namespace별로 독립적으로 가질 수 있음.
IPC는 프로세스 간의 통신 오브젝트라고 하는 공유 메모리나 메세지 큐를 말함.
도커는 이러한 네임스페이스 장치를 사용하여 호스트 상에서 컨테이너를 가상적으로 격리시킨다.