컨테이너(Container)
- 클라우드 컴퓨팅의 운영 및 관리에 가장 기본이 되는 기술 중의 하나인 "가상화 기술"은 나날이 발전하며 새로운 기술들을 도입하고 있다. 그 중에서도 최근 주목을 받고있는 것이 바로 "컨테이너"입니다. 컨테이너 기반의 오픈소스 플랫폼들은 하이브리드 클라우드 구현과 DevOps 그리고 마이크로서비스 아키텍처를 구현하기 위한 필수적인 기술로 자리잡고 있다.
컨테이너의 진화
- 1979년에 chroot를 발표한 것으로 부터 시작된다. chroot는 이름 그대로 "root 디렉토리를 변경" 하는 것이다.
- 2000년 Unix OS인 FreeBSD에서 OS 가상화 기능인 FreeBSD Jail를 발표한다. 호스트 OS와 Jail라느 OS 가상화 환경에서 파일 시스템, 프로세스, 네트워크를 분리 할 수 있는 획기적인 기술을 제공했고 이것이 컨테이너의 시작이 된다.
- 2006년, Google은 Process Containers라는 프로세스 자원 이용량을 제어하는 기능을 발표한다. 이듬해 이 기능은 cgroup으로 이름을 바꾼다. 2008년에는 Red Hat에서 논리적으로 시스템 자원을 분할하는 Namespace를 발표하고, 비슷한 시기에 IBM에서 LXC(LinuX Containers)를 발표한다. LXC가 cgroup과 Namespace를 사용하여 구현한 최초의 Linux 컨테이너 엔진이다. LXC는 이후 컨테이너 엔진의 형태를 갖추게 되었고 바로 현재 컨테이너 기술의 시초라고 할 수 있다.
가상화와 컨테이너의 비교
- 가상화 기술은 하이버바이저를 통해 하드웨어를 에뮬레이션하는 방법으로 가상 이미지 마다 게스트OS를 사용해야 한다. 반면 컨테이너는 커널을 공유하는 방법으로 호스트 OS 하나에서 여러 OS를 가상화 한다.
- 컨테이너는 커널이 공유화 됨으로써 OS 부팅은 불필요하고 가상 환경을 구성하는 스택이 간단하다.
도커(Docker)
- 애플리케이션을 개발, 배송 및 실행하기 위한 개방형 플랫폼이다. 도커를 사용하면 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공할 수 있다.
도커 아키텍처
- 도커는 클라이언트-서버 아키텍처를 사용한다. 도커 클라이언트는 도커 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행하는 도커 데몬과 통신한다. 도커 클라이언트와 데몬은 동일한 시스템에서 실행되거나 도커 클라이언트를 원격 도커 데몬에 연결할 수 있다. 도커 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다. 또 다른 도커 클라이언트는 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있는 Docker Compose이다.
도커 데몬
- 도커 데몬은 도커 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 도커 객체를 관리합니다. 데몬은 도커 서비스를 관리하기 위해 다른 데몬과 통신할 수도 있다.
도커 클라이언트
- 도커 클라이언트는 많은 도커 사용자가 도커와 상호 작용하는 기본 방법이다. docker run과 같은 명령을 사용하면 dockerd가 명령을 수행한다. docker 명령은 Docker API를 사용하고 도커 클라이언트는 둘 이상의 데몬과 통신할 수 있다.
도커 데스크탑
- 도커 데스크탑은 컨에이너화된 애플리케이션 및 마이크로서비스를 구축하고 공유할 수 있는 Mac 또는 Windows 환경용으로 설치하기 쉬운 애플리케이션이다. 도커 데스크탑에는 도커 데몬(dockerd), 도커 클라이언트(docker), Docker Compose, Docker Content Trust, Kubernetes, Credential Helper가 포함된다.
도커 레지스트리
- 도커 레지스트리는 도커 이미지를 저장한다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있다. 자신의 개인 레지스트리를 실행할 수도 있다.
- docker pull / docker run 을 사용하면 구성된 레지스트리에서 필요한 이미지를 가져온다.
- docker push 을 사용하면 이미지가 구성된 레지스트리로 푸시된다.
도커 객체
- 도커를 사용하면 이미지(image), 컨테이너(Container), 네트워크, 볼륨, 플러그인 및 기타 개체를 만들고 사용한다.
이미지(image)
- 이미지는 도커 컨테이너 생성 지침이 포함된 읽기 전용 템플릿이다.
- 자신만의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시한 이미지만 사용할 수 있다. 고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하기 위한 간단한 구문으로 Dockerfile을 만든다. Dockerfile의 각 명령은 이미지에 계층을 생성한다.
컨테이너(Container)
- 컨테이너는 이미지의 실행 가능한 인스턴스이다. Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제 할 수 있다. 컨테이너를 하나 이상의 네트워크에 연결하거나 컨테이너에 스토리지를 연결하거나, 현재 상태를 기반으로 새 이미지를 생성할 수 있다.
- 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있고 제어가 가능하다.
- 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라진다.
쿠버네티스(Kubernetes:K8s)
- 쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장가능한 오픈소스 플랫폼이다. 쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.
쿠버네티스가 필요한 이유
- 컨테이너는 애플리케이션을 포장하고 실행하는 좋은 방법이다. 프로덕션 환경에서는 애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야 한다. 예를 들어 컨테이너가 다운되면 다른 컨테이너를 다시 시작해야 한다. 이 문제를 시스템에 의해 처리하기 위해 쿠버네티스를 사용할 수 있다.
- 쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임워크를 제공한다. 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.
서비스 디스커버리와 로드 밸런싱
- 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.
스토리지 오케스트레이션
- 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템을 자동으로 탑재 할 수 있다.
자동화된 롤아웃과 롤백
- 배포된 컨테이너의 원하는 상태를 서술할 수 있으며 현재 상태를 원하는 상태로 설정한 속도에 따라 변경할 수 있다.
자동화된 빈 패킹(bin packing)
- 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시한다. 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 한다.
자동화된 복구(self-healing)
- 쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하며, '사용자 정의 상태 검사'에 응답하지 않는 컨테이너를 죽이고, 서비스 준비가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.
시크릿과 구성 관리
- 쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.
도커와 쿠버네티스의 차이
- 쿠버네티스는 컨테이너 런타임을 통해 컨테이너를 다루는 도구이다. 쿠버네티스가 하는 일은 여러 서버에 컨테이너를 분산해서 배치하거나 문제가 생긴 컨테이너를 교체하거나 컨테이너가 사용할 비밀번호나 환경 설정을 관리하고 주입해 주는 일이다. 이것을 컨테이너 오케스트레이션이라고 한다. 도커는 컨테이너를 다루는 도구(컨테이너 런타임)중 하나이다. 쿠버네티스는 컨테이너를 다루기 위해 도커 이외에도 다양한 컨테이너 런타임 소프트웨어를 사용할 수 있다.
Reference
opennaru
opennaru
docker docs
Kubernetes docs
SAMSUNG SDS