Docker 란 무엇입니까? 컨테이너 혁명의 불꽃

Docker는 컨테이너를 기반으로 애플리케이션을 구축하기위한 소프트웨어 플랫폼 입니다. 운영 체제 커널을 공유하지만 서로 격리하여 실행하는 작고 가벼운 실행 환경입니다. 개념으로 컨테이너가 몇 시간 동안 주변되었습니다 있지만, 부두 노동자, 2013 년 출시 오픈 소스 프로젝트는 기술을 대중화 도움 및 추세 드라이브를 도왔다 컨테이너 수송microservices  클라우드 네이티브로 알려왔다 소프트웨어 개발 개발.

컨테이너 란?

현대 소프트웨어 개발의 목표 중 하나는 동일한 호스트 또는 클러스터에있는 애플리케이션을 서로 격리하여 서로의 운영 또는 유지 관리를 과도하게 방해하지 않도록하는 것입니다. 실행하는 데 필요한 패키지, 라이브러리 및 기타 소프트웨어 구성 요소 덕분에 어려울 수 있습니다. 이 문제에 대한 한 가지 해결책 은 동일한 하드웨어에 애플리케이션을 완전히 분리하고 소프트웨어 구성 요소 간의 충돌과 하드웨어 리소스 경쟁을 최소화하는 가상 머신 입니다. 그러나 가상 머신은 부피가 커서 각각 자체 OS가 필요하므로 일반적으로 크기가 기가 바이트이며 유지 관리 및 업그레이드가 어렵습니다.

반면 컨테이너 는 애플리케이션의 실행 환경을 서로 격리하지만 기본 OS 커널을 공유합니다. 일반적으로 메가 바이트 단위로 측정되며 VM보다 훨씬 적은 리소스를 사용하며 거의 즉시 시작됩니다. 동일한 하드웨어에 훨씬 더 조밀하게 패킹 할 수 있으며 훨씬 적은 노력과 오버 헤드로 한꺼번에 위아래로 회전 할 수 있습니다 . 컨테이너는 소프트웨어 구성 요소를 현대 기업에 필요한 종류의 애플리케이션 및 서비스 스택에 결합하고 이러한 소프트웨어 구성 요소를 업데이트 및 유지 관리하기위한 매우 효율적이고 세분화 된 메커니즘을 제공합니다.

Docker

Docker 란 무엇입니까?

Docker는 컨테이너 및 컨테이너 기반 앱을 쉽게 만들 수있는 오픈 소스 프로젝트입니다. 원래 Linux 용으로 구축 된 Docker는 이제 Windows 및 MacOS에서도 실행됩니다. Docker가 작동하는 방식을 이해하기 위해 Docker 컨테이너화 된 애플리케이션을 만드는 데 사용할 일부 구성 요소를 살펴 보겠습니다.

Dockerfile

각 Docker 컨테이너는 Dockerfile로 시작합니다 . Dockerfile은 이해하기 쉬운 구문으로 작성된 텍스트 파일로 Docker 이미지 를 빌드하는 지침이 포함되어 있습니다 (자세한 내용은 잠시 후). Dockerfile은 언어, 환경 변수, 파일 위치, 네트워크 포트 및 필요한 기타 구성 요소와 함께 컨테이너의 기반이되는 운영 체제를 지정합니다. 물론 컨테이너를 실행하면 컨테이너가 실제로 수행 할 작업을 지정합니다.

ITNext의 Paige Niedringhaus는 Dockerfile의 구문을 잘 분석했습니다.

Docker 이미지

Dockerfile을 작성했으면 Docker build유틸리티를 호출하여 해당 Dockerfile을 기반으로 이미지 를 만듭니다 . Dockerfile은 build이미지를 만드는 방법을 알려주는 지침 집합 인 반면, Docker 이미지는 컨테이너가 실행할 소프트웨어 구성 요소와 방법에 대한 사양이 포함 된 이식 가능한 파일입니다. Dockerfile에는 온라인 리포지토리에서 일부 소프트웨어 패키지를 가져 오는 방법에 대한 지침이 포함될 수 있으므로 적절한 버전을 명시 적으로 지정해야합니다. 그렇지 않으면 Dockerfile이 호출되는시기에 따라 일관성없는 이미지가 생성 될 수 있습니다. 그러나 이미지가 생성되면 정적입니다. Codefresh는 이미지를 빌드하는 방법에 대해 자세히 설명합니다.

Docker 실행

Docker의 run유틸리티는 실제로 컨테이너를 시작하는 명령입니다. 각 컨테이너는 이미지 의 인스턴스 입니다. 컨테이너는 일시적이고 일시적으로 설계되었지만 중지했다가 다시 시작할 수 있습니다. 이렇게하면 컨테이너가 중지되었을 때와 동일한 상태로 시작됩니다. 또한 동일한 이미지의 여러 컨테이너 인스턴스를 동시에 실행할 수 있습니다 (각 컨테이너에 고유 한 이름이있는 경우). 코드 리뷰에는 run명령 에 대한 다양한 옵션이 크게 분류 되어 작동 방식을 알 수 있습니다.

Docker 허브

컨테이너를 구축하는 것은 쉽지만 처음부터 모든 이미지를 구축해야한다는 생각은하지 마십시오. Docker Hub는 컨테이너 공유 및 관리를위한 SaaS 리포지토리로, 오픈 소스 프로젝트 및 소프트웨어 공급 업체의 공식 Docker 이미지와 일반 대중의 비공식 이미지를 찾을 수 있습니다. 유용한 코드가 포함 된 컨테이너 이미지를 다운로드하거나 직접 업로드하거나 공개적으로 공유하거나 대신 비공개로 설정할 수 있습니다. 원하는 경우 로컬 Docker 레지스트리를 만들 수도 있습니다. (Docker Hub는 이전에 백도어가 내장 된 이미지를 업로드하는 데 문제가있었습니다.)

Docker 엔진

Docker Engine은 컨테이너를 만들고 실행하는 기본 클라이언트-서버 기술인 Docker의 핵심입니다. 일반적으로 누군가 Docker를 일반적으로 말하고 회사 또는 전체 프로젝트에 대해 이야기하지 않는 경우 Docker Engine을 의미합니다. 제공되는 Docker Engine에는 Docker Engine Enterprise 및 Docker Engine Community의 두 가지 버전이 있습니다.

Docker 커뮤니티 에디션

Docker 는 2017 년에 Enterprise Edition 을 출시 했지만 Docker Community Edition으로 이름이 변경된 원래 제품은 오픈 소스로 무료로 유지되며 그 과정에서 어떤 기능도 잃지 않았습니다. 대신 노드 당 연간 $ 1,500의 비용이 드는 Enterprise Edition은 클러스터 및 이미지 관리 제어, 취약성 모니터링을 포함한 고급 관리 기능을 추가했습니다. BoxBoat 블로그에는 에디션 간의 차이점에 대한 개요가 있습니다.

Docker가 컨테이너 세계를 정복 한 방법

주어진 프로세스가 나머지 운영 환경과 어느 정도 분리되어 실행될 수 있다는 생각은 수십 년 동안 BSD 및 Solaris와 같은 Unix 운영 체제에 구축되었습니다. 원래 Linux 컨테이너 기술인 LXC는 단일 호스트에서 여러 개의 격리 된 Linux 시스템을 실행하기위한 OS 수준 가상화 방법입니다. LXC는 두 가지 Linux 기능에 의해 가능해졌습니다. 네임 스페이스는 시스템 리소스 집합을 래핑하고 프로세스에 제공하여 해당 프로세스 전용 인 것처럼 보이게합니다. 프로세스 그룹에 대한 CPU 및 메모리와 같은 시스템 리소스의 격리 및 사용을 제어하는 ​​cgroups.

컨테이너는 애플리케이션을 운영 체제에서 분리합니다. 즉, 사용자는 깔끔하고 최소한의 Linux 운영 체제를 사용하고 하나 이상의 격리 된 컨테이너에서 다른 모든 것을 실행할 수 있습니다. 그리고 운영 체제가 컨테이너에서 추상화 되었기 때문에 컨테이너 런타임 환경을 지원하는 모든 Linux 서버에서 컨테이너를 이동할 수 있습니다.

Docker는 LXC에 몇 가지 중요한 변경 사항을 도입하여 컨테이너를보다 이식 가능하고 유연하게 사용할 수 있도록했습니다. Docker 컨테이너를 사용하면 가상 머신을 사용하는 것보다 훨씬 빠르고 쉽게 워크로드를 배포, 복제, 이동 및 백업 할 수 있습니다. Docker는 컨테이너를 실행할 수있는 모든 인프라에 클라우드와 같은 유연성을 제공합니다. Docker의 컨테이너 이미지 도구는 LXC를 능가하는 발전으로 개발자가 이미지 라이브러리를 빌드하고 여러 이미지에서 애플리케이션을 구성하고 해당 컨테이너와 애플리케이션을 로컬 또는 원격 인프라에서 실행할 수 있도록합니다.

Docker Compose, Docker Swarm 및 Kubernetes

또한 Docker를 사용하면 컨테이너 간의 동작을 더 쉽게 조정할 수 있으므로 컨테이너를 함께 연결하여 애플리케이션 스택을 빌드 할 수 있습니다. Docker Compose는 다중 컨테이너 애플리케이션 개발 및 테스트 프로세스를 단순화하기 위해 Docker에서 만들었습니다. Docker 클라이언트를 연상시키는 명령 줄 도구로, 특수 형식의 설명자 파일을 가져와 여러 컨테이너에서 애플리케이션을 어셈블하고 단일 호스트에서 함께 실행합니다. (자세한 내용은의 Docker Compose 자습서를 확인하십시오.)

이러한 동작의 고급 버전 ( 컨테이너 오케스트레이션 이라고 함) 은 Docker Swarm 및 Kubernetes와 같은 다른 제품에서 제공됩니다. 그러나 Docker는 기본을 제공합니다. Swarm은 Docker 프로젝트에서 성장했지만 Kubernetes는 사실상의 Docker 오케스트레이션 플랫폼이되었습니다.

Docker 장점

Docker 컨테이너는 기존의 컨테이너보다 조립, 유지 관리 및 이동하기 쉬운 엔터프라이즈 및 기간 업무 애플리케이션을 빌드하는 방법을 제공합니다. 

Docker 컨테이너를 통해 격리 및 조절 가능

Docker 컨테이너는 앱을 서로 격리 할뿐만 아니라 기본 시스템과도 격리합니다. 이를 통해 더 깨끗한 소프트웨어 스택을 만들 수있을뿐만 아니라 특정 컨테이너화 된 애플리케이션이 CPU, GPU, 메모리, I / O, 네트워킹 등의 시스템 리소스를 사용하는 방식을 더 쉽게 지정할 수 있습니다. 또한 데이터와 코드를 별도로 보관하는 것이 더 쉽습니다. (아래의 "Docker 컨테이너는 상태 비 저장 및 불변"을 참조하십시오.)

Docker 컨테이너는 이식성을 지원합니다.

Docker 컨테이너는 컨테이너의 런타임 환경을 지원하는 모든 머신에서 실행됩니다. 애플리케이션을 호스트 운영 체제에 묶을 필요가 없으므로 애플리케이션 환경과 기본 운영 환경을 깨끗하고 최소화 할 수 있습니다.

예를 들어 Linux 용 MySQL 컨테이너는 컨테이너를 지원하는 대부분의 Linux 시스템에서 실행됩니다. 앱에 대한 모든 종속성은 일반적으로 동일한 컨테이너에서 제공됩니다.

컨테이너 기반 앱은 대상 시스템이 Docker 및 이와 함께 사용할 수있는 타사 도구를 지원하는 한 온 프레미스 시스템에서 클라우드 환경으로 또는 개발자의 노트북에서 서버로 쉽게 이동할 수 있습니다. Kubernetes (아래의 "Docker 컨테이너가 조정 및 확장을 용이하게 함"참조)

일반적으로 Docker 컨테이너 이미지는 특정 플랫폼 용으로 빌드해야합니다. 예를 들어 Windows 컨테이너는 Linux에서 실행되지 않으며 그 반대의 경우도 마찬가지입니다. 이전에는이 ​​제한을 해결하는 한 가지 방법은 필요한 운영 체제의 인스턴스를 실행하는 가상 머신을 시작하고 가상 머신에서 컨테이너를 실행하는 것이 었습니다.

그러나 Docker 팀은 이후 여러 운영 체제의 이미지를 동일한 이미지에 나란히 패킹 할 수있는 manifests 라는보다 우아한 솔루션을 고안했습니다  . 매니페스트는 여전히 실험적인 것으로 간주되지만 컨테이너가 교차 환경 솔루션뿐만 아니라 교차 플랫폼 애플리케이션 솔루션이 될 수있는 방법을 암시합니다. 

Docker 컨테이너를 통해 구성 가능

대부분의 비즈니스 애플리케이션은 웹 서버, 데이터베이스, 인 메모리 캐시와 같이 스택으로 구성된 몇 가지 개별 구성 요소로 구성됩니다. 컨테이너를 사용하면 쉽게 변경할 수있는 기능 단위로 이러한 조각을 구성 할 수 있습니다. 각 조각은 다른 컨테이너에서 제공되며 다른 컨테이너와 독립적으로 유지, 업데이트, 교체 및 수정할 수 있습니다.

이것은 본질적으로 애플리케이션 설계의 마이크로 서비스 모델입니다. 애플리케이션 기능을 별도의 자체 포함 서비스로 분할함으로써 마이크로 서비스 모델은 기존 개발 프로세스의 속도를 늦추고 유연하지 않은 모 놀리 식 앱에 대한 해결책을 제공합니다. 가볍고 휴대 가능한 컨테이너를 사용하면 마이크로 서비스 기반 애플리케이션을보다 쉽게 ​​구축하고 유지할 수 있습니다.

Docker 컨테이너는 오케스트레이션 및 확장을 용이하게합니다.

컨테이너는 가볍고 오버 헤드가 적기 때문에 주어진 시스템에서 더 많은 컨테이너를 시작할 수 있습니다. 그러나 컨테이너를 사용하여 시스템 클러스터 전체에서 애플리케이션을 확장하고 수요 급증을 충족하거나 리소스를 절약하기 위해 서비스를 늘리거나 줄일 수도 있습니다.

컨테이너 배포, 관리 및 확장을위한 가장 엔터프라이즈 급 버전의 도구는 타사 프로젝트를 통해 제공됩니다. 그중 가장 중요한 것은 컨테이너 배포 및 확장 방법과 함께 연결, 부하 분산 및 관리 방법을 자동화하는 시스템 인 Google의 Kubernetes입니다. Kubernetes는 또한 다중 컨테이너 애플리케이션 정의 또는 "Helm 차트"를 만들고 재사용하는 방법을 제공하여 복잡한 앱 스택을 필요에 따라 구축하고 관리 할 수 ​​있습니다.

Docker에는 자체 내장 오케스트레이션 시스템 인 Swarm 모드도 포함되어 있으며 덜 까다로운 경우에도 여전히 사용됩니다. 즉, Kubernetes는 기본 선택이되었습니다. 실제로 Kubernetes는 Docker Enterprise Edition과 함께 번들로 제공됩니다.

Docker주의 사항

컨테이너는 많은 문제를 해결하지만 모든 것을 치료할 수는 없습니다. 그들의 단점 중 일부는 의도적으로 설계된 반면 다른 일부는 설계의 부산물입니다.

Docker 컨테이너는 가상 머신이 아닙니다.

사람들이 컨테이너에 대해 저지르는 가장 일반적인 개념적 실수는 컨테이너를 가상 머신과 동일시하는 것입니다. 그러나 컨테이너와 가상 머신은 서로 다른 격리 메커니즘을 사용하기 때문에 서로 다른 장점과 단점이 있습니다.

가상 머신은 자체 운영 체제 인스턴스에서 실행되기 때문에 프로세스에 대해 높은 수준의 격리를 제공합니다. 해당 운영 체제는 호스트에서 실행되는 운영 체제와 동일하지 않아도됩니다. Windows 가상 머신은 Linux 하이퍼 바이저에서 실행될 수 있으며 그 반대의 경우도 마찬가지입니다.

대조적으로 컨테이너는 호스트 운영 체제 리소스의 제어 된 부분을 사용합니다. 많은 애플리케이션이 고도로 관리되는 방식으로 동일한 OS 커널을 공유합니다. 결과적으로 컨테이너화 된 앱은 가상 머신만큼 완전히 격리되지는 않지만 대부분의 워크로드에 대해 충분한 격리를 제공합니다.

Docker 컨테이너는 베어 메탈 속도를 제공하지 않습니다.