Light Blue Pointer
본문 바로가기
Developing/TIL(Develop)

Docker vs Kubernetes / Docker Compose vs Docker Swarm vs Kubernetes

by Greedy 2024. 5. 28.

Docker vs Kubernetes

구분 도커 (Docker) 쿠버네티스 (Kubernetes)
주요 목적    
Primary Purpose 컨테이너 생성 및 관리 컨테이너 오케스트레이션
기능    
Functionality 컨테이너 이미지 빌드, 배포, 실행 컨테이너 배포, 확장, 자가 치유, 로드 밸런싱
자동 확장    
Auto-Scaling 기본적으로 제공되지 않음 기본적으로 자동 확장 기능 제공
서비스 디스커버리 제공되지 않음 네이티브 서비스 디스커버리 및 로드 밸런싱 지원
자가 치유    
Self-Healing 제공되지 않음 컨테이너 재시작, 복구 및 대체 기능 제공
롤링 업데이트    
Rolling Updates 수동으로 수행 네이티브 롤링 업데이트 및 롤백 지원
스토리지 관리    
Storage Management 외부 도구 필요 다양한 스토리지 시스템과 통합
복잡성    
Complexity 비교적 간단 비교적 복잡

도커(Docker)와 쿠버네티스(Kubernetes)는 모두 컨테이너 기술과 관련이 있지만, 서로 다른 목적과 기능을 가지고 있다.

도커

컨테이너 생성, 관리 플랫폼

쿠버네티스

컨테이너화된 애플리케이션의 배포, 확장, 관리 및 조정을 자동화하는 오케스트레이션 도구

도커는 컨테이너를 생성하고 관리하는 데 중점을 두며, 개발 및 테스트 환경에서 일관된 실행 환경을 제공하는 데 유용하다. 쿠버네티스는 도커 컨테이너를 대규모로 배포하고 관리하기 위한 오케스트레이션 도구로, 대규모 애플리케이션의 배포, 확장 및 관리를 자동화하는 데 적합하다.

두 기술은 함께 사용되며, 도커는 컨테이너 생성 및 관리를, 쿠버네티스는 그 컨테이너들을 효율적으로 운영하는 역할을 담당하게 된다.

컨테이너 오케스트레이션(Container Orchestration)
여러 개의 컨테이너를 배포, 관리, 확장, 모니터링하는 작업을 자동화하는 것

Docker

애플리케이션과 그 종속성을 컨테이너로 패키징하여 일관된 실행 환경을 제공하는 플랫폼

Docker의 주요 기능

컨테이너 생성 Container Creation

애플리케이션을 컨테이너 이미지로 패키징하고, 이를 기반으로 컨테이너를 생성

이미지 관리 Image Management

Docker Hub와 같은 레지스트리를 통해 컨테이너 이미지를 저장하고 배포할 수 있다

환경 일관성 Environment Consistency

개발, 테스트, 프로덕션 환경에서 동일한 컨테이너 이미지를 사용하여 환경 일관성을 보장한다

경량 가상화 Lightweight Virtualization

하이퍼바이저 기반 가상 머신보다 경량이며, 더 빠른 시작 시간을 제공한다

하이퍼바이저 기반 가상 머신 Hypervisor-based Virtual Machine
물리적 컴퓨터 시스템에서 여러 개의 가상 컴퓨터(VM)를 실행할 수 있도록 하는 소프트웨어
물리적 하드웨어 자원을 가상화하여 각 가상 머신이 독립적으로 운영 체제와 애플리케이션을 실행할 수 있도록 해준다
예시 : VMware ESXi, Oracle VirtualBox

컨테이너 가상화가 하이퍼바이저 기반 가상 머신보다 빠른 이유
컨테이너는 호스트 OS와 커널을 공유하고 VM은 각 인스턴스마다 OS가 별개로 동작해서 컨테이너 가상화가 더 가벼워진다.
1. 아키텍처의 차이
👿VM : OS위에 OS가 또 올라가서 오버헤드 발생
😇컨테이너 : 애플리케이션과 그 종속성만을 포함, 별도의 OS 인스턴스 실행X
2. 성능 오버헤드
👿VM : 자원 접근시 하이퍼바이저→하드웨어 추상화 레이어 → 자원 : 오버헤드!!
😇컨테이너 : 하드웨어 추상화 레이어X → 오버헤드가 적어진다
3. 시작 시간
👿VM : OS로드→ OS부팅→애플리케이션 실행
😇컨테이너 : 커널 공유 → 커널 로드 시간 X
4. 자원 효율성
👿VM : 각각의 OS 인스턴스 → 각각 추가적인 메모리, CPU 소모
😇컨테이너 : 커널 공유 → 추가 메모리, CPU소모 X → 자원 사용 효율 up

Docker 사용 예시

단일 컨테이너 애플리케이션 실행 (Running single-container applications)

개발 환경 설정 (Setting up development environments)

애플리케이션 테스트 자동화 (Automating application testing)

Kubernetes

쿠버네티스는 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 오픈 소스 컨테이너 오케스트레이션 플랫폼

Kubernetes의 주요 기능

컨테이너 오케스트레이션 Container Orchestration

여러 노드(인스턴스)에 걸쳐 컨테이너의 배포와 관리를 자동화

자동 확장 Auto-Scaling

애플리케이션 부하에 따라 자동으로 컨테이너 수를 조정

자가 치유 Self-Healing

실패한 컨테이너를 자동으로 재시작하고, 실패한 노드를 대체

서비스 디스커버리 및 로드 밸런싱 Service Discovery and Load Balancing

클러스터 내의 컨테이너 간 통신을 위한 서비스 디스커버리와 로드 밸런싱을 제공

Service Discovery
클러스터 내의 여러 서비스가 서로를 찾고 통신할 수 있도록 하는 기능
클러스터 내부 및 외부에서 서비스 간의 통신을 가능하게 한다

DNS 기반 서비스 디스커버리
각 서비스는 DNS 이름을 통해 다른 서비스에 의해 발견된다
Kubernetes는 클러스터 내의 서비스에 대해 DNS 레코드를 자동으로 생성한다
환경 변수 기반 서비스 디스커버리
해당 서비스의 클러스터 IP와 포트 정보가 관련된 파드의 환경 변수로 자동 설정됨
현재는 일반적으로 DNS 기반 디스커버리를 사용

롤링 업데이트 및 롤백 Rolling Updates and Rollbacks

애플리케이션의 새로운 버전을 배포하면서 서비스 중단 없이 업데이트를 수행하고, 문제가 발생하면 롤백

스토리지 오케스트레이션 Storage Orchestration

로컬 및 클라우드 스토리지 시스템과 통합하여 데이터를 관리

Kubernetes 사용 예시

대규모 마이크로서비스 애플리케이션 관리

다양한 환경(온프레미스, 클라우드)에서의 컨테이너화된 애플리케이션 운영

자가 치유 및 고가용성 애플리케이션 배포

Kubernetes의 구조

쿠버네티스는 여러 노드(Node)로 구성된 클러스터(Cluster)를 통해 컨테이너화된 애플리케이션을 관리

각 노드에는 도커(Docker)와 같은 컨테이너 런타임이 설치되어 있다.

마스터 노드(Master Node)

API 서버

쿠버네티스 클러스터와의 모든 상호작용을 처리

컨트롤러 매니저

클러스터의 상태를 관리하고, 필요 시 조치를 취함

스케줄러

새로운 컨테이너를 실행할 노드를 결정한다

etcd

클러스터의 모든 상태 정보를 저장하는 분산 키-값 저장소

워커 노드(Worker Node)

컨테이너를 실행하는 실제 머신이나 VM

각 노드에는 도커와 같은 컨테이너 런타임이 설치되어있다

Kubelet

각 노드에서 실행되며, 컨테이너가 정상적으로 동작하는지 모니터링

컨테이너 런타임

실제로 컨테이너를 실행하는 역할

도커(Docker) 또는 컨테이너d(containerd)가 사용될 수 있다

Kube-Proxy

네트워크 프록시로, 네트워크 규칙을 적용하고 노드 간의 네트워크 트래픽을 관리한다

쿠버네티스 클러스터
├── 마스터 노드
│   ├── API 서버
│   ├── 컨트롤러 매니저
│   ├── 스케줄러
│   └── etcd
└── 워커 노드
    ├── Kubelet
    ├── Kube-Proxy
    └── 컨테이너 런타임 (도커 등)
        ├── 컨테이너 1
        ├── 컨테이너 2
        └── 컨테이너 3

Docker Compose

Docker Compose 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구

Docker Compose 파일(docker-compose.yml)을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨을 정의

다중 컨테이너 정의

단일 YAML 파일에서 다중 컨테이너 애플리케이션을 정의

간단한 설정

개발 환경에서 로컬로 다중 컨테이너 애플리케이션을 쉽게 설정하고 실

종속성 관리

컨테이너 간의 종속성을 정의하고, 필요한 순서대로 컨테이너를 시작

환경 변수 지원

환경 변수를 통해 구성 가능한 설정을 쉽게 관리

사용 사례

  • 로컬 개발 환경에서 다중 컨테이너 애플리케이션을 설정하고 테스트할 때
  • 간단한 개발 및 테스트 환경을 신속하게 구축할 때
  • CI/CD 파이프라인에서 통합 테스트를 수행할 때

Docker swarm

Docker Swarm은 Docker가 제공하는 네이티브 컨테이너 오케스트레이션 도구로, 여러 Docker 엔진을 하나의 클러스터로 묶어 관리할 수 있게 해준다

Docker Swarm을 사용하면 여러 노드에 걸쳐 컨테이너를 배포, 확장, 관리할 수 있으며, Kubernetes와 유사한 기능을 제공

Docker Swarm의 주요 특징

네이티브 Docker 통합

Docker Swarm은 Docker 엔진에 네이티브로 통합되어 있어, 기존의 Docker CLI와 Docker Compose 파일을 그대로 사용할 수 있다

간편한 설정

Swarm 모드를 활성화하여 간편하게 클러스터를 구성할 수 있습니다. 새로운 노드를 클러스터에 쉽게 추가하거나 제거할 수 있다

서비스 정의

Docker Compose 파일(docker-compose.yml)을 사용하여 애플리케이션 스택을 정의하고, Swarm 클러스터에서 이를 배포할 수 있다

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

각 서비스는 DNS 이름을 통해 자동으로 디스커버리되고, 내장된 로드 밸런서를 통해 트래픽이 분산된다

고가용성

Swarm 모드는 복제(replicas)를 통해 서비스의 고가용성을 보장한다

노드 장애 시 자동으로 다른 노드에서 서비스를 재배포한다

롤링 업데이트

Swarm 모드는 롤링 업데이트를 지원하여, 서비스 중단 없이 애플리케이션을 업데이트할 수 있다

필요 시 이전 버전으로 롤백할 수 있다

보안

노드 간 통신을 위한 자동 TLS 암호화, 비밀 관리(secret management) 등을 제공하여 보안을 강화한다

Docker Compose vs Docker Swarm vs Kubernetes

특성 Docker Compose Docker Swarm Kubernetes
주요 목적 다중 컨테이너 애플리케이션의 로컬 관리 컨테이너 오케스트레이션 컨테이너 오케스트레이션 및 관리
설정 파일 docker-compose.yml docker-compose.yml 및 CLI 명령어 다양한 YAML 파일 (Deployment, Service 등)
설정 및 사용 간편하고 빠름 비교적 간편하고 빠름 비교적 복잡하지만 강력한 기능 제공
배포 환경 주로 로컬 개발 및 테스트 환경 로컬 및 중소규모 프로덕션 환경 로컬 및 대규모 프로덕션 환경
자동 확장 수동 설정 필요 자동 확장 지원 네이티브 자동 확장 지원
자가 치유 기본 제공되지 않음 실패한 컨테이너 자동 재시작 자동화된 자가 치유 기능 제공
서비스 디스커버리 기본 제공되지 않음 내장 DNS를 통한 자동 서비스 디스커버리 네이티브 서비스 디스커버리 제공
로드 밸런싱 기본 제공되지 않음 내장 로드 밸런서 제공 네이티브 로드 밸런싱 제공
롤링 업데이트 수동 설정 필요 네이티브 롤링 업데이트 및 롤백 지원 네이티브 롤링 업데이트 및 롤백 지원
스토리지 관리 수동 설정 필요 기본 스토리지 관리 다양한 스토리지 시스템과 네이티브 통합
보안 기본적인 설정 자동 TLS 설정, 비밀 관리 제공 네이티브 보안 기능 및 네트워크 정책 제공
커뮤니티 및 생태계 상대적으로 작은 커뮤니티 중간 규모의 커뮤니티 큰 커뮤니티와 생태계, 다양한 추가 도구 지원
복잡성 상대적으로 단순 중간 정도의 복잡성 상대적으로 복잡
사용 사례 로컬 개발, 테스트 환경 중소규모 애플리케이션의 프로덕션 환경 대규모 애플리케이션의 프로덕션 환경
확장성 제한적 중간 규모의 확장성 높은 확장성

'Developing > TIL(Develop)' 카테고리의 다른 글

JavaBean  (1) 2024.05.31
Java의 다형성(Polymorphism)  (0) 2024.05.31
Java가 다중 상속을 지원하지 않는 이유  (0) 2024.05.24
Collection Framework  (0) 2024.05.24
추상클래스와 인터페이스 정의와 차이점  (0) 2024.05.24