애플리케이션을 패키징하고 배포하기 쉽게 도와주는 컨테이너 기반 가상화 플랫폼
-> 컨테이너라는 작은 소프트웨어 유닛 안에 애플리케이션과 필요한 시스템 도구, 환경 설정 등을 하나로 묶어서 다른 서버나 환경에 쉽게 배포하고 구동할 수 있게 해준다.
기술이 발전함에 따라 애플리케이션을 구동하는 데 필요한 요소 증가
-> 예를 들어, Node.js를 사용한다면 외부 라이브러리와 환경 설정, 환경 변수 등을 모두 설정해야 한다. 이를 모든 서버나 개발자의 개인 컴퓨터에 일일이 설치하고 설정하는 것은 번거롭고 오류 발생 가능성이 높다. 도커는 이러한 문제를 해결하기 위해 탄생하였다.
도커 컨테이너 안에는 애플리케이션 뿐만 아니라 필요한 모든 리소스와 환경이 포함
-> 따라서 도커 컨테이너를 사용하면 애플리케이션을 구동하는 데 필요한 모든 것을 어떤 환경에서든 일관되게 구동할 수 있다. 이를 통해 설정과 준비 과정을 간편하게 해결해준다.
VM(Virtual Machine)
하드웨어 인프라스트럭처 위에 VMware나 VirtualBox와 같은 하이퍼바이저 소프트웨어를 사용하여 각각의 가상 머신을 생성할 수 있다. 이는 각각의 가상 머신이 독립적인 환경에서 실행될 수 있게 한다.
이전에는 동일한 애플리케이션을 여러 운영 체제 환경에서 실행하기 위해 가상 머신을 사용해야 했다. 가상 머신은 개별 운영 체제를 포함하기 때문에 Mac OS 위에서 가상 머신을 사용하면 Windows나 Linux를 동시에 실행할 수 있었다.
그러나 애플리케이션을 실행하기 위해 가상 머신을 사용하면 운영 체제를 포함하기 때문에 매우 무겁고, 시작하는 데 오랜 시간이 걸리며 컴퓨터의 리소스를 많이 소모한다. 이러한 가상 머신에서 더 경량화된 개념이 컨테이너이다.
Docker Container
하드웨어에 설치된 호스트 운영 체제에서 컨테이너 엔진이라는 소프트웨어를 설치하면, 개별적인 컨테이너를 생성하여 각각의 애플리케이션을 고립된 환경에서 실행할 수 있다.가상 머신과는 달리 컨테이너는 호스트 운영 체제를 공유하며, 운영 체제를 가상화하지 않고 컨테이너 엔진을 통해 필요한 리소스를 처리한다. 도커와 같은 컨테이너 엔진은 이러한 기능을 제공하는데, 현재 가장 널리 사용되고 있다.
컨테이너는 운영 체제를 가상화하지 않고 애플리케이션을 실행하는 데 필요한 모든 것을 포함한다. 따라서 컨테이너는 가상 머신보다 빠르고 가벼우며, 시작 시간이 빠르고 시스템 리소스를 적게 사용한다. 이를 통해 컨테이너는 빠르고 효율적인 애플리케이션 실행 환경을 제공한다.
도커는 컨테이너를 만들고 배포하고 구동하며, 이 프로세스를 이해하기 위해서는 세 가지 구성 요소를 알아야 한다.
도커파일(Dockerfile)
이미지(Image)
컨테이너(Container)
컨테이너는 클래스와 인스턴스의 개념과 유사하다. 이미지는 클래스로 볼 수 있으며, 각 컨테이너는 해당 이미지를 기반으로 생성된 인스턴스이다. 따라서 각 컨테이너는 독립적으로 실행되며 파일을 생성, 수정할 수 있지만, 이러한 변경 사항은 이미지에 영향을 주지 않는다. 이러한 프로세스를 통해 도커를 사용하여 애플리케이션을 쉽게 패키징하고 배포할 수 있으며, 이를 통해 개발 및 운영 환경의 일관성과 효율성을 유지할 수 있다.
볼륨(Volume)
Docker 컨테이너에 쓰여진 데이터는 기본적으로 컨테이너가 삭제될 때 함께 사라진다. Docker에서 돌아가는 많은 애플리케이션은 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장해야하고, 여러 개의 Docker 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야하는 경우가 빈번하다.
이렇게 Docker 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장할 수 있도록 별개의 공간인 Volume이 필요하다.
볼륨의 종류에는 크게 세 가지가 있다.
컨테이너를 배포하는 과정은 아래와 같다.
많은 경우, 로컬에서 이미지를 빌드하고 푸시한 후 서버에서 해당 이미지를 pull하여 실행하는 방식으로 애플리케이션을 배포한다. 이러한 프로세스를 통해 개발 환경과 운영 환경 간의 일관성을 유지하고 애플리케이션을 효율적으로 관리할 수 있다.
다른 방법
1. 로컬 머신에서 Dockerfile작성
2. 서버나 다른 개발자의 PC에서 이미지 생성
3. 생성된 이미지를 사용하여 컨테이너를 실행
컨테이너 오케스트레이션은 여러 대의 컴퓨터에서 동시에 실행되는 컨테이너들을 자동으로 관리하는 기술이다.
개발자가 만든 애플리케이션을 컨테이너로 포장하고, 이를 여러 대의 컴퓨터에 배포할 때, 오케스트레이션 시스템은 컨테이너의 배포와 관리를 자동화한다.
예를 들어, 컴퓨터가 다운되면 오케스트레이션 시스템은 해당 컨테이너를 다른 컴퓨터로 옮겨 서비스 중단을 방지한다. 이를 통해 애플리케이션의 확장성과 안정성을 높이고, 개발자는 더 많은 시간을 애플리케이션 개발에 집중할 수 있다.
컨테이너 오케스트레이션 툴에는 대표적으로 세 가지가 있다.
Docker Swarm
도커 컨테이너 플랫폼에 통합된 컨테이너 오케스트레이션 툴
최초의 도커 스웜은 도커와 별개로 개발되었으나 도커 1.12 버전부터 도커 스웜 모드라는 이름으로 합쳐짐
장점
단점
Kubernetes
컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고 확장 가능한 오픈소스 플랫폼
장점
단점
Apache Mesos
Twitter, Apple, Uber, Netflix 등 대형 서비스를 운영하고 있는 기업에서 다수 채택
마이크로 서비스와 빅데이터, 실시간 분석, 엘라스틱 스케일링 기능 등 제공
장점
단점
Docker Swarm: 중소형 프로젝트, 관리할 노드가 적고 많은 기능을 필요로하지 않을 경우
Kubernetes: 대형 프로젝트, 세밀하고 다양한 설정 기능이 필요한 경우
Apache Mesos: 대형 프로젝트, 검증된 오케스트레이션 툴이 필요한 경우
[참고자료]