Kubernetes와 Docker 비교: 함께 사용하면 안되나요?

엔지니어 팀과 IBM® Spectrum Fusion RF 테스트 챔버

Kubernetes와 Docker 중 어느 것이 더 나은 선택일까요(아니면 아예 선택의 여지가 없을까요?)?

컨테이너 기술에 관해서는 Kubernetes와 Docker라는 두 가지 이름이 오픈 소스 리더로 부상하고 있습니다. 이 두 기술은 사용자의 컨테이너 관리를 지원하는 근본적으로 다른 기술이지만, 서로 보완적이며 함께 사용하면 강력한 효과를 발휘할 수 있습니다. 이 점에서 Kubernetes와 Docker 중 어느 것이 더 나은지 결정하는 것은 문제가 아니며, 실제로는 서로 경쟁 관계가 아니며 실제로 함께 사용할 수 있습니다. 따라서 Kubernetes와 Docker 중 어느 것이 더 나은 선택인지에 대한 질문에 대한 답은 둘 다 아닙니다.

Kubernetes와 Docker가 상호 보완적인 컨테이너 기술이라는 사실은 또 다른 자주 묻는 질문을 명확하게 합니다. Kubernetes가 Docker를 대체하나요?

한마디로 '아니요'입니다. Kubernetes는 경쟁 기술이 아니기 때문에, 이 질문은 2021년에 Kubernetes가 컨테이너 런타임 옵션(즉, 컨테이너화 프로세스 전반에 걸쳐 운영 체제(OS) 커널과 통신하는 컨테이너 구성 요소)으로서 더 이상 Docker를 지원하지 않을 것이라는 뉴스에서 비롯된 것 같습니다. 그러나 이 글의 뒷부분에서 자세히 살펴보겠지만, Kubernetes와 Docker는 여전히 호환되며 함께 사용할 때 분명한 이점을 제공합니다. 먼저, Kubernetes와 Docker를 연결하는 기본 기술인 컨테이너부터 시작하는 것이 중요합니다.

 

컨테이너란 무엇인가요?

컨테이너는 애플리케이션 코드를 종속성과 함께 패키징하여 모든 IT 인프라에서 실행할 수 있도록 하는 실행 가능한 소프트웨어 단위입니다. 컨테이너는 독립형입니다. 호스트 OS(일반적으로 Linux)에서 분리되어 IT 환경 전반에서 이식 가능합니다.

컨테이너의 개념을 이해하는 한 가지 방법은 컨테이너를 가상 머신(VM)과 비교하는 것입니다. 둘 다 가상화 기술을 기반으로 하지만, 컨테이너가 OS를 가상화하는 반면, VM은 하이퍼바이저(VM과 컴퓨터 하드웨어 사이의 가벼운 소프트웨어 계층)를 활용하여 물리적 하드웨어를 가상화합니다. 

기존 가상화에서는 각 VM에 게스트 운영 체제(OS)의 전체 사본, OS를 실행하는 데 필요한 하드웨어의 가상 사본, 애플리케이션(및 관련 라이브러리와 종속성)이 포함됩니다. 컨테이너에는 애플리케이션과 해당 라이브러리 및 종속성 만 포함됩니다. 게스트 호스트가 없기 때문에 컨테이너의 크기가 크게 줄어들어 가볍고 빠르며 휴대가 간편합니다. 또한 컨테이너는 호스트의 DNS 설정을 자동으로 사용합니다.

엔지니어는 컨테이너를 사용하여 수많은 분산 시스템과 크로스 플랫폼 환경에서 일관되게 실행되는 애플리케이션을 신속하게 개발할 수 있습니다. 컨테이너의 이식성은 기능 팀 간의 도구와 소프트웨어의 차이로 인해 발생하는 많은 충돌을 제거합니다. 

따라서 DevOps 워크플로에 특히 적합하며, 개발자와 IT 운영팀이 여러 환경에서 쉽게 협업할 수 있습니다. 작고 가벼운 컨테이너는 애플리케이션이 느슨하게 결합된 소규모 서비스로 구성된 마이크로서비스 아키텍처에도 적합합니다. 그리고 컨테이너화는 온프레미스 애플리케이션을 현대화하고 클라우드 서비스와 통합하는 첫 번째 단계입니다.

Docker란?

Docker는 오픈소스 컨테이너화 플랫폼입니다. 기본적으로 개발자가 컨테이너를 더 쉽고, 안전하고, 빠르게 구축, 배포 및 관리할 수 있는 툴킷입니다. 이 툴킷을 Containerd고도 합니다.

오픈 소스 프로젝트로 시작되었지만 오늘날의 Docker는 상용 Docker 제품을 생산하는 회사인 Docker, Inc.를 의미하기도 합니다. 현재 개발자가 Windows, Linux 또는 MacOS를 사용하든 관계없이 컨테이너를 생성하는 데 가장 많이 사용되는 도구입니다.

실제로 컨테이너 기술은 2013년 Docker가 출시되기 수십 년 전부터 사용할 수 있었습니다. 초창기에는 Linux 컨테이너(또는 LXC)가 가장 널리 사용되었습니다. Docker는 LXC를 기반으로 구축되었지만 Docker의 맞춤형 기술은 LXC를 빠르게 추월하여 가장 인기 있는 컨테이너화 플랫폼으로 자리 잡았습니다. 

Docker의 주요 속성 중 하나는 이식성입니다. Docker 컨테이너는 모든 데스크톱, 데이터 센터 또는 클라우드 환경에서 실행할 수 있습니다. 각 컨테이너에서는 하나의 프로세스만 실행할 수 있으므로 애플리케이션의 한 부분이 업데이트되거나 복구되는 동안 애플리케이션을 지속적으로 실행할 수 있습니다.

Docker에서 일반적으로 사용되는 일부 도구 및 용어는 다음과 같습니다.

  • Docker 엔진: 개발자가 컨테이너를 빌드하고 실행할 수 있는 런타임 환경입니다.
  • Dockerfile: OS 네트워크 사양 및 파일 위치 등 Docker 컨테이너 이미지를 빌드하는 데 필요한 모든 것을 정의하는 간단한 텍스트 파일입니다. 기본적으로 Docker 엔진이 이미지를 어셈블하기 위해 실행할 명령 목록입니다.
  • Docker Compose: 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구입니다. 애플리케이션에 포함되는 서비스를 지정하기 위해 YAML 파일을 생성하고 Docker CLI를 통해 단일 명령으로 컨테이너를 배포하고 실행할 수 있습니다.

이제 Kubernetes가 컨테이너 런타임으로 Docker 지원을 중단한 이유를 다시 살펴보겠습니다. 이 섹션의 상단에서 언급했듯이 Docker는 컨테이너 런타임이 아닌 Containerd입니다. 즉, Docker는 기본 컨테이너 런타임 위에 위치하여 사용자 인터페이스를 통해 사용자에게 기능과 도구를 제공합니다. Docker를 런타임으로 지원하기 위해 Kubernetes는 기본적으로 두 기술 사이에 위치하여 통신을 지원하는 Docker Shim이라는 별도의 런타임을 지원하고 구현해야 했습니다.

이는 사용 가능한 컨테이너 런타임이 많지 않았던 시기에 이루어졌습니다. 그러나 이제 CRI-O를 사용하여 이러한 컨테이너 런타임의 예가 있으므로 Kubernetes는 사용자에게 다양한 컨테이너 런타임 옵션을 제공할 수 있으며, 그 중 다수는 중간 계층 역할을 하지 않고도 Kubernetes와 컨테이너 런타임이 안정적으로 통신할 수 있는 방법인 표준 CRI(Container Runtime Interface)를 사용합니다.

그러나 Kubernetes는 더 이상 런타임으로서 Docker에 대한 특별한 지원을 제공하지 않지만, Dockerfile을 사용하고 Docker 이미지를 빌드할 수 있는 Docker의 자체 이미지 형식인 OCI(Open Container Initiative)로 빌드한 컨테이너를 실행 및 관리할 수 있습니다. 다시 말해, Dockers는 여전히 Kubernetes 에코시스템에 많은 것을 제공할 수 있습니다.

Docker의 장점은 무엇인가요?

Docker 컨테이너화 플랫폼은 다음을 포함하여 앞서 언급한 컨테이너의 모든 이점을 제공합니다.

  • 가벼운 휴대성: 컨테이너화된 애플리케이션은 어떤 환경(Docker가 운영되는 곳)에서든 다른 환경으로 이동할 수 있으며, OS에 관계없이 작동합니다.
  • 민첩한 애플리케이션 개발: 컨테이너화를 통해 CI/CD 프로세스를 더 쉽게 도입하고 DevOps와 같은 민첩한 방법론을 활용할 수 있습니다. 예를 들어, 컨테이너화된 앱을 한 환경에서 테스트하고 빠르게 변화하는 비즈니스 요구에 대응하여 다른 환경에 배포할 수 있습니다.
  • 확장성: Docker 컨테이너를 빠르게 생성할 수 있으며 여러 컨테이너를 효율적이고 동시에 관리할 수 있습니다.

다른 Docker API 기능으로는 컨테이너 이미지를 자동으로 추적 및 롤백하고, 기존 컨테이너를 새 컨테이너 빌드를 위한 기본 이미지로 사용하고, 애플리케이션 소스 코드를 기반으로 컨테이너를 빌드하는 기능이 있습니다. Docker는 Docker Hub를 통해 인터넷을 공유하기 수천 개의 컨테이너를 공유하는 활발한 개발자 커뮤니티의 지원을 받습니다.

하지만 소규모 애플리케이션에서는 Docker가 잘 작동하지만, 대규모 엔터프라이즈 애플리케이션에는 수백, 수천 개의 컨테이너가 포함될 수 있어 이를 관리해야 하는 IT 팀에게는 부담이 될 수 있습니다. 이것이 바로 컨테이너 오케스트레이션 이 필요한 이유입니다. Docker에는 자체 오케스트레이션 도구인 Docker Swarm이 있지만, 지금까지 가장 인기 있고 강력한 옵션은 Kubernetes입니다.

Docker에는 컨테이너를 생성하고 실행하는 데 사용되는 여러 명령어가 있습니다.

  • docker build : 이 명령은 소스 코드에서(즉, Dockerfile 및 필요한 파일에서) 새 Docker 이미지를 빌드합니다.
  • docker create : 이 명령은 이미지를 시작하지 않고 이미지에서 새 Docker 이미지를 만듭니다. 여기에는 이미지 위에 쓰기 가능한 컨테이너 계층을 만들고 준비하는 작업이 포함됩니다.
  • docker run : 이 명령은 docker create  명령과 똑같이 작동합니다. 단, 생성 후 실행하는 추가 단계가 필요합니다.
  • docker exec : 이 명령은 이미 실행 중인 컨테이너 내에서 새 명령을 실행하는 데 사용됩니다.

쿠버네티스란 무엇인가요?

Kubernetes는 컨테이너화된 애플리케이션의 배포, 관리 및 확장을 예약하고 자동화하기 위한 오픈 소스 컨테이너 오케스트레이션 플랫폼입니다. 컨테이너는 '클러스터'라는 다중 컨테이너 아키텍처에서 작동합니다. Kubernetes 클러스터에는 클러스터의 나머지 컨테이너(또는 작업자 노드)에 대한 워크로드를 예약하는 컨트롤 플레인으로 지정된 컨테이너가 포함됩니다.

마스터 노드는 애플리케이션(또는 Docker 컨테이너)을 호스팅할 위치를 결정하고, 애플리케이션을 통합하는 방법을 결정하고, 오케스트레이션을 관리합니다. 애플리케이션을 구성하는 컨테이너를 클러스터로 그룹화함으로써 Kubernetes는 서비스 검색을 용이하게 하고 수명 주기 전반에 걸쳐 대량의 컨테이너를 관리할 수 있습니다. 

Google은 2014년에 Kubernetes를 오픈소스 프로젝트로 소개했습니다. 현재는 CNCF(Cloud Native Computing Foundation)라는 오픈 소스 소프트웨어 재단에서 관리하고 있습니다. 프로덕션 환경의 컨테이너 오케스트레이션을 위해 설계된 Kubernetes는 강력한 기능, 수천 명의 기여자가 있는 활발한 오픈 소스 커뮤니티, 주요 퍼블릭 클라우드 제공업체(예: IBM Cloud, Google, Azure 및 AWS)에 걸친 지원 및 이식성으로 인해 부분적으로 인기가 있습니다.

Kubernetes의 장점은 무엇인가요?

  • 자동화된 배포: Kubernetes는 VM이나 Bare Metal Server 등 여러 노드에 걸쳐 컨테이너 배포를 예약하고 자동화합니다. 
  • 서비스 검색 및 로드 밸런싱: 인터넷에 컨테이너를 노출하고 트래픽이 급증할 때 로드 밸런싱을 사용하여 안정성을 유지합니다.
  • 자동 확장 기능: CPU 사용량, 메모리 임계값 또는 지표에 따라 새 컨테이너를 자동으로 시작하여 과부하를 처리합니다.
  • 자가 치료 기능: 컨테이너가 장애가 발생하거나 노드가 죽으면 컨테이너를 재시작, 교체 또는 재스케줄링하고 사용자 지정 상황 검사에 응답하지 않는 컨테이너를 종료합니다.
  • 자동화된 롤아웃 및 롤백: 애플리케이션 변경 사항을 롤아웃하고 애플리케이션 건강을 모니터링하여 문제가 있는지 확인하고 문제가 발생하면 변경 사항을 롤백합니다.
  • 스토리지 오케스트레이션: 필요에 따라 선택한 영구 로컬 또는 클라우드 스토리지 시스템을 자동으로 마운트하여 지연 시간을 줄이고 사용자 환경을 개선합니다.
  • 동적 볼륨 프로비저닝: 클러스터 관리자가 스토리지 공급업체를 수동으로 호출하거나 개체를 생성할 필요 없이 스토리지 볼륨을 생성할 수 있습니다.

Kubernetes 및 Docker: 최적의 컨테이너 솔루션 찾기

Kubernetes와 Docker는 별개의 기술이지만, 상호 보완적이며 강력한 조합입니다. Docker는 컨테이너화 기능을 제공하여 개발자가 명령줄을 통해 애플리케이션을 작고 격리된 컨테이너로 쉽게 패키징할 수 있도록 합니다. 그러면 개발자는 호환성 문제에 대해 걱정할 필요 없이 IT 환경 전반에서 해당 애플리케이션을 실행할 수 있습니다. 테스트 중에 애플리케이션이 단일 노드에서 실행되는 경우 어디서나 실행됩니다.

수요가 급증하는 경우, Kubernetes는 Docker 컨테이너의 오케스트레이션을 제공하여 IT 환경 전체에 컨테이너를 예약하고 자동으로 배포하여 고가용성을 보장합니다. 컨테이너 실행 외에도 Kubernetes는 로드 밸런싱, 자가 치료, 자동화된 롤아웃 및 롤백의 이점을 제공합니다. 게다가 사용하기 편리한 그래픽 사용자 인터페이스도 갖추고 있습니다.

향후 인프라를 확장할 계획이 있는 기업이라면 처음부터 Kubernetes를 사용하는 것이 합리적일 수 있습니다. 또한 이미 Docker를 사용하고 있는 사람들의 경우, Kubernetes는 기존 컨테이너와 워크로드를 활용하면서 확장을 위해 복잡한 문제를 해결합니다. 

통합을 통한 애플리케이션 자동화 및 관리 개선

이후 버전의 Docker에는 Kubernetes와의 통합 기능이 기본으로 제공됩니다. 이 기능을 통해 개발팀은 Docker가 구축하는 데 도움을 준 모든 컨테이너화된 애플리케이션을 보다 효과적으로 자동화하고 관리할 수 있습니다.

결국 팀의 비즈니스 목표를 달성하는 데 필요한 도구의 조합이 무엇인지에 대한 문제입니다. 이 Kubernetes 튜토리얼을 시작하는 방법을 확인하고 IBM Cloud Kubernetes Service를 자세히 살펴보세요.

IBM® CloudLabs의 무료 브라우저 기반 Kubernetes 튜토리얼을 통해 배지를 획득하세요.

작성자

다음 단계 안내

완전 관리형 Red Hat OpenShift 플랫폼으로 시작하거나, IBM Cloud Kubernetes 에코시스템의 유연성을 살펴보세요. 요구 사항에 맞게 조정되는 확장 가능하고 안전한 솔루션으로 개발 및 배포 프로세스를 가속화하세요.

Red Hat OpenShift 살펴보기 Kubernetes 살펴보기