OCI ( OPEN CONTAINER Initiative ) : 컨테이너 표준 기술. cgroup & namespace & chroot 에 대한 표준 제정
- chroot : root 디렉터리를 변경해주는 것, 컨테이너 생성시 별도의 프로세스가 실행되며, 계정이 root 로 바뀐다. 즉, 일반 사용자가 컨테이너 내부로 들어갔을 경우 super user 인 root 로 작업할 수 있도록 해준다
- namespace : 각각의 컨테이너 별로 작업 공간을 제공하고, 각 컨테이너 별로 서로 간에 영향을 끼치지 않도록 격리시켜 구획을 나눈다
- linux namespace : 프로세스 별로 격리시켜 독립된 작업 공간 제공, 만약, httpd:ftp:nfs 프로세스로 구분을 한다면 두 개의 httpd 는 존재할 수 없다. 이미 하나의 httpd 가 설치되있기에 추가 설치가 불가능 하다
- Docker namespace : 컨테이너 별로 격리시켜 독립된 작업 공간 제공, 컨테이너 ID 별로 구분하기에 각 컨테이너가 동일한 httpd 를 실행할 수 도 있다
- K8s namespace : 각 사용자 별로 격리시켜 별도의 독립된 작업 공간 제공
- cgroup : namespace 를 통해 구획이 나뉜 각 컨테이너 별로 별도의 자원 사용량을 제공하는 것 ( cpu , ram )
CRI ( Container Runtime Interface ) : Kubelet 이 컨테이너를 제어할 수 있도록 해주는 인터페이스
쿠버네티스 : 컨테이너 오케스트레이션 툴, 일반적으로 오케스트레이션은 컨테이너 클러스터 환경에서 이루어지게 한다
- 쿠버네티스는 컨테이너나 서비스를 직접 만드는 도구는 아니다. 쿠버네티스는 컨테이너 / 네트워크 / 볼륨 등을 관리 ( 오케스트레이션 ) 하는 도구이다. 실제 컨테이너를 만드는 역활은 runtime 이 수행하게 된다. 이 runtime 으로 docker ( containerd ) , cri-o , podman , rocket 등등을 사용할 수 있고, 쿠버네티스는 모든 런타임과 통신이 가능하다. 이로인해 사실상 컨테이너 오케스트레이션의 표준으로 불린다
애플리케이션은 배포 , 시스템 ( 서버, 네트워크, 볼륨 ) 은 프로비저닝 한다
배포와 프로비저닝은 일반적으로 여러 컨테이너, 서버, 네트워크, 볼륨 등을 연계하여 구성 해야 하는 복잡한 과정이다. 하나의 작업을 수동으로 한 뒤, 이를 묶는 작업은 복잡하므로, IaC ( Infrastructure as Code - 코드형 인프라 ) 을 도입하여 yml 과 같은 파일 형태로 작성한 뒤, 이를 활용하여 환경을 구성하는 형식으로 변화하고 있다
- Docker-Compose.yml : 컨테이너 환경 구성
- cloudformation : aws 에서 서버 인프라 환경 구성
- heat : openstack 에서 서버 인프라 환경 구성
- terraform
- 도커 클라이언트에서 명령 입력
- 명령은 api 를 통해서 도커 서버 ( dockerd 프로세스로 작동하며 이를 도커 데몬이라고 함 ) 에 전달
- 도커 데몬 ( 컨테이너 엔진 ) 을 통해 명령 실행. 도커 데몬은 실제 작업을 하는 것이 아닌, 밑에 containerd 에 전달한다
- containerd 에서 컨테이너 관리, 컨테이너의 시작 등 실제 작업을 한다
- containerd 는 작업을 위한 자식 프로세스인 containerd shim 을 생성한다
- containerd shim 은 runc 를 호출한다. 이 runc 는 컨테이너 생성을 위한 namespace, cgroup, 구동 까지 해준다. 작업이 끝나면 runc 는 종료된다. 이 runc 는 containerd shim 과 통신을 한다
- nfs ( binding ) : Host 의 특정 디렉터리와 컨테이너의 특정 디렉터리를 mount ( /root/test:/var/www/html )
- iscsi ( volume ) : 별도의 볼륨을 생성하고, 해당 볼륨을 컨테이너의 특정 디스크로 활용하는 방법 ( testvolume:/root - /root 는 /dev/sda3 와 같이 특정 파티션이 된다 )
- tmpfs : Disk / Storage 의 특정 공간을 사용하는 것이 아니라, 메모리를 사용하는 방법으로, 속도가 빠른 대신 영구 보관은 불가능 하다
- public registry : docker hub 로, 불특정 다수가 접속할 수 있는 공간
- private registry : 특정 사용자나 그룹 사용자가 접속할 수 있는 공간
- local registry : 도커 데몬이 동작하는 사용자 컴퓨터
- 명령 실행시 local registry 에서 이미지 검색
- 이미지가 없으면, 자동으로 public registry 에 연결, pull 명령 전달
- public registry 에서 필요한 공식 이미지를 검색
- 해당 공식 이미지를 local registry 에 pull 을 통해 가져온다
- 가져온 이미지를 통해 컨테이너 생성