웹사이트 검색

Docker 생태계: 공통 구성 요소 소개


소개

컨테이너화는 이식 가능하고 예측 가능한 방식으로 애플리케이션을 배포하고 배포하는 프로세스입니다. 구성 요소와 해당 종속성을 컨테이너라고 하는 표준화되고 격리된 경량 프로세스 환경으로 패키징하여 이를 수행합니다. 이제 많은 조직이 분산 시스템에 쉽게 배포할 수 있는 응용 프로그램 및 서비스를 설계하여 시스템을 쉽게 확장하고 기계 및 응용 프로그램 오류를 견딜 수 있도록 하는 데 관심을 갖고 있습니다. 다양한 환경에서 배포를 단순화하고 표준화하기 위해 개발된 컨테이너화 플랫폼인 Docker는 이러한 스타일의 서비스 설계 및 관리를 채택하는 데 크게 기여했습니다. 이 분산 컨테이너 관리 생태계를 구축하기 위해 많은 양의 소프트웨어가 만들어졌습니다.

Docker 및 컨테이너화

Docker는 오늘날 사용되는 가장 일반적인 컨테이너화 소프트웨어입니다. 다른 컨테이너화 시스템이 존재하지만 Docker는 컨테이너 생성 및 관리를 간단하게 만들고 많은 오픈 소스 프로젝트와 통합합니다.

이 이미지에서 컨테이너가 호스트 시스템과 어떻게 관련되어 있는지 (간단한 보기로) 볼 수 있습니다. 컨테이너는 개별 애플리케이션을 격리하고 Docker에 의해 추상화된 운영 체제 리소스를 사용합니다. 오른쪽의 분해도에서 여러 컨테이너가 기본 계층을 공유하여 리소스 사용량을 줄이는 \계층화\로 컨테이너를 구축할 수 있음을 볼 수 있습니다.

Docker의 주요 이점은 다음과 같습니다.

  • 가벼운 리소스 활용: 전체 운영 체제를 가상화하는 대신 컨테이너가 프로세스 수준에서 격리되고 호스트의 커널을 사용합니다.
  • 이동성: 컨테이너화된 애플리케이션의 모든 종속성은 컨테이너 내부에 번들되어 모든 Docker 호스트에서 실행할 수 있습니다.
  • 예측 가능성: 호스트는 컨테이너 내부에서 무엇이 실행되고 있는지 신경 쓰지 않으며 컨테이너는 실행 중인 호스트에 대해 신경 쓰지 않습니다. 인터페이스가 표준화되고 상호 작용을 예측할 수 있습니다.

일반적으로 Docker를 사용하도록 애플리케이션이나 서비스를 설계할 때 서비스 지향 아키텍처로 알려진 설계 결정인 개별 컨테이너로 기능을 분리하는 것이 가장 효과적입니다. 이를 통해 향후 구성 요소를 독립적으로 쉽게 확장하거나 업데이트할 수 있습니다. 이러한 유연성은 사람들이 개발 및 배포를 위해 Docker에 관심을 갖는 많은 이유 중 하나입니다.

Docker로 애플리케이션을 컨테이너화하는 방법에 대해 자세히 알아보려면 여기를 클릭하십시오.

서비스 검색 및 전역 구성 저장소

서비스 검색은 컨테이너 배포를 확장 가능하고 유연하게 만드는 것을 목표로 하는 전체 전략의 한 구성 요소입니다. 컨테이너가 관리자 개입 없이 도입된 환경에 대해 찾을 수 있도록 서비스 검색이 사용됩니다. 상호 작용해야 하는 구성 요소에 대한 연결 정보를 찾을 수 있으며 다른 도구가 사용 가능함을 알 수 있도록 스스로 등록할 수 있습니다. 또한 이러한 도구는 일반적으로 인프라에서 작동하는 서비스에 대해 임의의 구성 설정을 설정할 수 있는 전역적으로 분산된 구성 저장소로 작동합니다.

위 이미지에서 하나의 애플리케이션이 Discovery 서비스 시스템에 연결 정보를 등록하는 흐름의 예를 볼 수 있습니다. 일단 등록되면 다른 응용 프로그램은 검색 서비스를 쿼리하여 응용 프로그램에 연결하는 방법을 찾을 수 있습니다.

이러한 도구는 클러스터 환경의 호스트 간에 분산되는 간단한 키-값 저장소로 구현되는 경우가 많습니다. 일반적으로 키-값 저장소는 값 액세스 및 설정을 위한 HTTP API를 제공합니다. 일부는 암호화된 항목 또는 액세스 제어 메커니즘과 같은 추가 보안 조치를 포함합니다. 분산 저장소는 새 컨테이너에 대한 자체 구성 세부 정보를 제공하는 기본 기능 외에도 클러스터된 Docker 호스트를 관리하는 데 필수적입니다.

서비스 검색 저장소의 일부 책임은 다음과 같습니다.

  • 애플리케이션이 의존하는 서비스에 연결하는 데 필요한 데이터를 얻을 수 있도록 합니다.
  • 위 목적을 위해 서비스가 연결 정보를 등록하도록 허용
  • 임의의 구성 데이터를 저장하기 위해 전역적으로 액세스 가능한 위치를 제공합니다.
  • 클러스터 관리 소프트웨어에서 필요에 따라 클러스터 구성원에 대한 정보를 저장합니다.

일부 인기 있는 서비스 검색 도구 및 관련 프로젝트는 다음과 같습니다.

  • etcd: 서비스 검색/글로벌 분산 키-값 저장소
  • consul: 서비스 검색/글로벌 분산 키-값 저장소
  • 주키퍼: 서비스 검색/전역적으로 분산된 키-값 저장소
  • crypt: etcd 항목을 암호화하는 프로젝트
  • confd: 키-값 저장소에서 변경 사항을 감시하고 새 값으로 서비스 재구성을 트리거합니다.

Docker를 사용한 서비스 검색에 대한 자세한 내용은 여기에서 가이드를 참조하십시오.

네트워킹 도구

컨테이너화된 애플리케이션은 기능을 개별 구성 요소로 분리하도록 권장하는 서비스 지향 설계에 적합합니다. 이렇게 하면 관리 및 확장이 쉬워지지만 구성 요소 간 네트워킹의 기능 및 안정성에 대해 훨씬 더 많은 확신이 필요합니다. Docker 자체는 컨테이너 대 컨테이너 및 컨테이너 대 호스트 통신에 필요한 기본 네트워킹 구조를 제공합니다.

Docker의 기본 네트워킹 기능은 컨테이너를 연결하는 두 가지 메커니즘을 제공합니다. 첫 번째는 컨테이너의 포트를 노출하고 선택적으로 외부 라우팅을 위해 호스트 시스템에 매핑하는 것입니다. 매핑할 호스트 포트를 선택하거나 Docker가 사용하지 않는 상위 포트를 임의로 선택하도록 허용할 수 있습니다. 이는 대부분의 목적에 잘 맞는 컨테이너에 대한 액세스를 제공하는 일반적인 방법입니다.

다른 방법은 컨테이너가 Docker "링크\를 사용하여 통신할 수 있도록 하는 것입니다. 연결된 컨테이너는 상대방에 대한 연결 정보를 가져오므로 해당 변수에 주의하도록 구성된 경우 자동으로 연결할 수 있습니다. 서비스가 위치할 포트나 주소를 미리 알 필요 없이 동일한 호스트.

이 기본 수준의 네트워킹은 단일 호스트 또는 밀접하게 관리되는 환경에 적합합니다. 그러나 Docker 에코시스템은 운영자와 개발자가 사용할 수 있는 네트워킹 기능을 확장하는 데 중점을 둔 다양한 프로젝트를 생성했습니다. 추가 도구를 통해 사용할 수 있는 일부 추가 네트워킹 기능은 다음과 같습니다.

  • 오버레이 네트워킹을 통해 여러 호스트에서 주소 공간을 단순화하고 통합합니다.
  • 다양한 구성 요소 간에 안전한 통신을 제공하도록 조정된 가상 사설망
  • 호스트별 또는 애플리케이션별 서브넷 지정
  • 통신을 위한 macvlan 인터페이스 구축
  • 컨테이너에 대한 사용자 지정 MAC 주소, 게이트웨이 등 구성

Docker 네트워킹 개선과 관련된 일부 프로젝트는 다음과 같습니다.

  • flannel: 각 호스트에 별도의 서브넷을 제공하는 오버레이 네트워크.
  • weave: 단일 네트워크의 모든 컨테이너를 나타내는 오버레이 네트워크.
  • pipework: 임의의 고급 네트워킹 구성을 위한 고급 네트워킹 툴킷.

Docker를 사용한 네트워킹에 대한 다양한 접근 방식을 자세히 살펴보려면 여기를 클릭하세요.

스케줄링, 클러스터 관리 및 오케스트레이션

클러스터링된 컨테이너 환경을 구축할 때 필요한 또 다른 구성 요소는 스케줄러입니다. 스케줄러는 사용 가능한 호스트에서 컨테이너 시작을 담당합니다.

위의 이미지는 간소화된 일정 결정을 보여줍니다. 요청은 API 또는 관리 도구를 통해 제공됩니다. 여기에서 스케줄러는 요청 조건과 사용 가능한 호스트의 상태를 평가합니다. 이 예에서는 가장 사용량이 적은 호스트에 새 애플리케이션을 배치할 수 있도록 분산 데이터 저장소/검색 서비스(위에서 설명한 대로)에서 컨테이너 밀도에 대한 정보를 가져옵니다.

이 호스트 선택 프로세스는 스케줄러의 핵심 책임 중 하나입니다. 일반적으로 관리자가 특정 제약 조건을 지정할 수 있는 옵션을 사용하여 이 프로세스를 자동화하는 기능이 있습니다. 이러한 제약 중 일부는 다음과 같습니다.

  • 다른 주어진 컨테이너와 동일한 호스트에서 컨테이너를 예약합니다.
  • 컨테이너가 다른 주어진 컨테이너와 동일한 호스트에 배치되지 않았는지 확인하십시오.
  • 레이블 또는 메타데이터가 일치하는 호스트에 컨테이너를 배치합니다.
  • 가장 사용량이 적은 호스트에 컨테이너를 배치합니다.
  • 클러스터의 모든 호스트에서 컨테이너를 실행합니다.

스케줄러는 컨테이너를 관련 호스트에 로드하고 프로세스의 수명 주기를 시작, 중지 및 관리합니다.

스케줄러는 그룹의 각 호스트와 상호 작용해야 하므로 일반적으로 클러스터 관리 기능도 포함됩니다. 이를 통해 스케줄러는 구성원에 대한 정보를 얻고 관리 작업을 수행할 수 있습니다. 이 맥락에서 오케스트레이션은 일반적으로 컨테이너 스케줄링과 호스트 관리의 조합을 의미합니다.

스케줄러 및 차량 관리 도구로 작동하는 인기 있는 프로젝트는 다음과 같습니다.

  • 플릿: 스케줄러 및 클러스터 관리 도구.
  • 마라톤: 스케줄러 및 서비스 관리 도구.
  • Swarm: 스케줄러 및 서비스 관리 도구
  • mesos: 스케줄러를 위해 호스트 리소스를 통합하는 호스트 추상화 서비스.
  • kubernetes: 컨테이너 그룹을 관리할 수 있는 고급 스케줄러
  • compose: 컨테이너 그룹 생성을 위한 컨테이너 오케스트레이션 도구

Docker용 기본 스케줄링, 컨테이너 그룹화 및 클러스터 관리 소프트웨어에 대한 자세한 내용을 보려면 여기를 클릭하십시오.

결론

지금쯤이면 Docker 생태계와 관련된 대부분의 소프트웨어의 일반적인 기능에 익숙해졌을 것입니다. Docker 자체는 모든 지원 프로젝트와 함께 대규모 확장성을 가능하게 하는 소프트웨어 관리, 디자인 및 배포 전략을 제공합니다. 다양한 프로젝트의 기능을 이해하고 활용함으로써 가변적인 운영 요구 사항을 처리할 수 있을 만큼 충분히 유연한 복잡한 애플리케이션 배포를 실행할 수 있습니다.