컨테이너(Container)

컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 배포하는 경량 패키지이다.

컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 쉽게 공유할 수 있게 해주며 컨테이너가 실제로 실행되는 환경에서 애플리케이션을 추상화 할 수 있는 논리 패키징 메커니즘을 제공한다.

배포 혁명

컨테이너 사용 이점

책임 분리

컨테이너화를 통해 책임을 깔끔하게 분리할 수 있다. 애플리케이션의 로직과 종속 항목에 집중하고, 운영팀은 특정 소프트웨어 버전 및 구성과 같은 애플리케이션의 세부 요소 대신 배포 및 관리에 집중할 수 있다.

워크로드 이동성

컨테이너는 Linux, Windows, Mac등의 운영체제를 가리지 않고, 어느 환경에서나 구동되므로 개발 및 배포가 쉬워진다.

애플리케이션 격리

컨테이너는 운영체제 수준에서 CPU, 메모리, 스토리지, 네트워크 리소스를 가상화하므로 개발자에게 다른 애플리케이션으로부터 논리적으로 격리된 OS 환경을 제공한다.

  • 기민한 애플리케이션 생성과 배포: VM 이미지를 사용하는 것에 비해 컨테이너 이미지 생성이 보다 쉽고 효율적임.
  • 지속적인 개발, 통합 및 배포: 안정적이고 주기적으로 컨테이너 이미지를 빌드해서 배포할 수 있고 (이미지의 불변성 덕에) 빠르고 효율적으로 롤백할 수 있다.
  • 개발과 운영의 관심사 분리: 배포 시점이 아닌 빌드/릴리스 시점에 애플리케이션 컨테이너 이미지를 만들기 때문에, 애플리케이션이 인프라스트럭처에서 분리된다.
  • 가시성(observability): OS 수준의 정보와 메트릭에 머무르지 않고, 애플리케이션의 헬스와 그 밖의 시그널을 볼 수 있다.
  • 개발, 테스팅 및 운영 환경에 걸친 일관성: 랩탑에서도 클라우드에서와 동일하게 구동된다.
  • 클라우드 및 OS 배포판 간 이식성: Ubuntu, RHEL, CoreOS, 온-프레미스, 주요 퍼블릭 클라우드와 어디에서든 구동된다.
  • 애플리케이션 중심 관리: 가상 하드웨어 상에서 OS를 실행하는 수준에서 논리적인 리소스를 사용하는 OS 상에서 애플리케이션을 실행하는 수준으로 추상화 수준이 높아진다.
  • 느슨하게 커플되고, 분산되고, 유연하며, 자유로운 마이크로서비스: 애플리케이션은 단일 목적의 머신에서 모놀리식 스택으로 구동되지 않고 보다 작고 독립적인 단위로 쪼개져서 동적으로 배포되고 관리될 수 있다.
  • 리소스 격리: 애플리케이션 성능을 예측할 수 있다.
  • 자원 사용량: 리소스 사용량: 고효율 고집적

VM과 차이

컨테이너는 가상머신과 마찬가지로 애플리케이션을 관련 라이브러리 및 종속 항목과 함께 패키지로 묶어 소프트웨어 서비스 구동을 위한 격리 환경을 마련해 준다. 그러나 컨테이너가 더 이점이 많다.

  • 컨테이너는 VM보다 경량이다.
  • 컨테이너는 OS 수준에서 가상화되고 VM은 하드웨어 수준에서 가상화 된다.
  • 컨테이너는 OS 커널을 공유하며 VM에 필요한 것보다 훨씬 적은 메모리로 사용한다.

컨테이너 용도

민첩한 개발

컨테이너를 사용하면 개발자가 종속 항목과 환경에 미치는 영향을 신경 쓰지 않고 훨씬 더 빠르게 개발을 진행할 수 있다.

효율적인 운영

컨테이너는 경량이며 필요한 컴퓨팅 리소스만 사용하면 된다. 따라서 애플리케이션을 효율적으로 구동할 수 있다.

폭넓은 구동 환경

컨테이너는 거의 모든 곳에서 구동할 수 있습니다. 소프트웨어 구동 환경이 무엇이든 컨테이너를 사용할 수 있다.

도커(Docker)

컨테이너 기술을 활용하는 앱의 개발, 제공 및 실행을 위해 설계된 소프트웨어 컨테이너 플랫폼이다.

도커 컨테이너

Docker 컨테이너는 애플리케이션의 모든 코드 및 종속성을 표준 형식으로 패키징할 수 있게 해주는 컨테이너다. 이를 통해 애플리케이션이 컴퓨팅 환경 전반에서 빠르고 안정적으로 실행될 수 있다. 라이브러리, 시스템 도구, 코드 런타임 등 애플리케이션 실행에 필요한 모든 것을 담고 있는 경량의 독립형 실행 컨테이너다.

도커 엔진

컨테이너를 구축 및 실행하는 오픈소스 호스트 소프트웨어다. oracle linux, centos, fedora, RHEL, SUSE, Ubuntu 등 Windows 서버 및 Linux 운영체제에서 컨테이너를 지원하는 클라이언트 서버 애플리케이션의 역할을 한다.

도커 이미지

컨테이너로 실행될 소프트웨어 모음이다. 이미지는 변경할 수 없으며, 이미지를 변경하려면 새로운 이미지를 생성해야한다.

도커 레지스트리

이미지를 저장 및 다운로드 할 수 있는 공간이다. 레지스트리는 무상태성을 갖춘 확장 가능한 서버측 애플리케이션으로 Docker 이미지를 저장 및 배포한다.

도커 기본사항

핵심 개념은 이미지와 컨테이너이다. 도커 이미지에는 소프트웨어 실행에 필요한 모든 것, 코드, JVM 드라이버 도구 스크립트 등이 있다. Docker 컨테이너는 실행중인 Docker 이미지 인스턴스를 의미한다. VM과 달리 하이퍼바이저를 사용하지 않고 호스트 운영체제의 커널에서 실행된다.

격리

모든 도커 컨테이너는 자체 파일 시스템, 자체 네트워크 스택, 자체 프로세스 공간, CPU 및 메모리를 위해 정의된 리소스 제한이 있다. Docker 컨테이너는 운영체제를 부팅할 필요가 없기 때문에 즉시 실행된다. Docker의 주요 기능은 호스트 운영체제의 리소스를 분리하는 것이다.

증분 파일 시스템

Docker 이미지의 파일 시스템은 쓰기 시 복사구문을 통해 계층화된다. 이를 통해 상속 및 재사용이 가능해지고 디스크 리소스가 절약되고 증분 이미지의 다운로드가 가능해진다.

증분 파일 시스템 이미지

위의 그림과 같이 이미지 기반의 이미지를 만들 수가 있다.

쿠버네티스(Kubernetes)

쿠버네티스 구성 요소

컨테이트화된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼이다. 확장이 가능하고 이식성이 존재한다.

등장 과정

  • 전통적인 배포 시대: 초기에는 애플리케이션을 물리서버에서 실행했다. 한 물리 서버에서 여러 애플리케이션의 리소스 한계를 정의할 방법이 없기에, 리소스 할당의 문제가 발생했다. 한 서버에 애플리케이션을 전부 밀어넣으면 특정 인스턴스에서 리소스를 전부 잡아먹을 수도 있고, 확장이 편하지 않다.
  • 가상화된 배포 시대: 단일 물리서버에 CPU 여러 가상 시스템을 실행할 수 있게 한다. 가상화를 사용하면 VM간에 애플리케이션을 격리하고 애플리케이션의 정보를 다른 애플리케이션에서 자유롭게 액세스 할 수 없으며 일정 수준의 보안성을 제공할 수 있다.
  • 컨테이너 개발 시대: 컨테이너는 VM과 유사하지만 격리 속성을 완화해 애플리케이션 간 OS를 공유한다. 그래서 가볍다고 여겨진다. VM과 마찬가지로 자체 파일 시스템, CPU 점유율, 메모리, 프로세스 공간 등이 있다.

쿠버네티스의 역할

컨테이너는 애플리케이션을 포장하고 실행하는 좋은 방법이다.

애플리케이션을 실행하는 컨테이너를 관리하고 가동 중지 시간이 없는지 확인해야한다. 이러한 문제를 시스템에 의해 처리한다면 더 쉽지 않을까해서 등장한게 쿠버네티스다.

쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임 워크를 제공한다. 애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.

쿠버네티스 기능

  • 서비스 디스커버리와 로드 밸런싱

    쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너를 노출할 수 있다. 컨테이너에 대한 트래픽이 많으면 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 배포가 안정적으로 이루어질 수 있다.

  • 스토리지 오케스트레이션

    로컬 저장소, 공용 클라우드 공금자 등과 같이 원하는 저장소 시스템을 자동으로 탑재할수있다.

  • 자동화된 롤아웃과 롤백

    컨테이너의 현재 상태 원하는 상태로 변경할 수 있다. 예를들어 쿠버네티스를 자동화해서 배포용 새 컨테이너를 만들고, 기존 컨테이너를 제거하고 모든 리소스를 새 컨테이너에 적용할 수 있다.

  • 자동화된 빈 패킹

    쿠버네티스 클러스터 노드를 제공한다. 각 컨테이너가 필요로 하는 CPU와 메모리를 쿠버네티스에게 지시하여 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 한다.

  • 자동화된 복구

    쿠버네티스는 실패한 컨테이너를 다시 시작하고, 컨테이너를 교체하고 사용자 정의 상태 검사에 응하지 않는 컨테이너를 죽이고 서비스가 끝날 때까지 그러한 과정을 클라이언트에 보여주지 않는다.

  • 시크릿과 구성 관리

    쿠버네티스를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리 할 수 있다. 컨테이너 이미지를 재구성하지 않고 스택 구성에 시클릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 할 수 있다.

참고

[컨테이너란? Google Cloud](https://cloud.google.com/learn/what-are-containers?hl=ko)
[Docker란 무엇인가? Oracle 대한민국](https://www.oracle.com/kr/cloud/cloud-native/container-registry/what-is-docker/)
[쿠버네티스란 무엇인가? Kubernetes](https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/)