반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

/var/log/messages

컨테이너와 도커란? 본문

Rancher

컨테이너와 도커란?

로만로만 2023. 4. 29. 22:06
반응형

컨테이너란 무엇입니까?

컨테이너는 애플리케이션과 해당 종속성을 패키징하고 격리된 환경에서 실행하는 데 사용되는 운영 체제 가상화 기술입니다. 다양한 유형의 인프라에서 표준화된 방식으로 애플리케이션을 패키징하고 배포하는 간단한 방법을 제공합니다.

이러한 목표 때문에 컨테이너는 개발자와 운영 전문가 모두에게 매력적인 옵션입니다. 컨테이너는 모든 컨테이너 가능 호스트에서 일관되게 실행되므로 개발자는 나중에 전체 프로덕션 환경에 배포할 동일한 소프트웨어를 로컬에서 테스트할 수 있습니다. 컨테이너 형식은 또한 애플리케이션 종속성이 이미지 자체에 구워지도록 하여 전달 및 릴리스 프로세스를 단순화합니다. 컨테이너를 실행하는 호스트와 플랫폼은 일반적이기 때문에 컨테이너 기반 시스템의 인프라 관리를 표준화할 수 있습니다.

컨테이너는 컨테이너 이미지 (컨테이너의 시스템, 애플리케이션 및 환경을 나타내는 번들) 에서 생성됩니다 . 컨테이너 이미지는 특정 컨테이너를 생성하기 위한 템플릿처럼 작동하며 동일한 이미지를 사용하여 실행 중인 컨테이너를 여러 개 생성할 수 있습니다.

이는 개체 지향 프로그래밍에서 클래스  인스턴스가 작동하는 방식과 유사합니다. 단일 컨테이너 이미지를 사용하여 여러 컨테이너를 만들 수 있는 것처럼 단일 클래스를 사용하여 여러 인스턴스를 만들 수 있습니다. 이 유추는 컨테이너 이미지가 다른 보다 사용자 지정된 컨테이너 이미지의 부모 역할을 할 수 있으므로 상속과 관련하여도 적용됩니다. 사용자는 외부 소스에서 사전 구축된 컨테이너를 다운로드하거나 필요에 따라 사용자 정의된 자체 이미지를 구축할 수 있습니다.

도커란 무엇입니까?

Linux 컨테이너는 다양한 방식으로 구현 및 관리할 수 있는 다소 일반적인 기술이지만 Docker 는 컨테이너 구축 및 실행을 실행하는 가장 일반적인 방법입니다. Docker 는 사용자가 컨테이너 이미지를 만들고, 외부 레지스트리에서 이미지를 푸시하거나 가져오고, 다양한 환경에서 컨테이너를 실행 및 관리할 수 있는 도구 모음입니다. Linux에서 컨테이너의 인기가 급증한 것은 2013년 출시 이후 Docker의 노력에 직접적으로 기인할 수 있습니다.

명령줄 도구 docker는 많은 역할을 합니다. 컨테이너 워크로드에 대한 프로세스 관리자 역할을 하면서 컨테이너를 실행 및 관리합니다. Dockerfile이미 실행 중인 컨테이너의 스냅샷을 생성하거나 명령을 읽고 실행하여 새 컨테이너 이미지를 생성할 수 있습니다 . 이 명령은 컨테이너 이미지 레지스트리인 Docker Hub 와 상호 작용하여 새 컨테이너 이미지를 풀다운하거나 로컬 이미지를 푸시하여 저장하거나 게시할 수도 있습니다.

Docker는 Linux에서 많은 컨테이너 구현 중 하나만 제공하지만 컨테이너 세계에 대한 가장 일반적인 진입점이자 가장 일반적으로 배포되는 솔루션이라는 특징이 있습니다. 상호 운용성을 보장하기 위해 컨테이너에 대한 개방형 표준이 개발 되었지만 대부분의 컨테이너 관련 플랫폼 및 도구는 소프트웨어를 테스트하고 릴리스할 때 Docker를 주요 대상으로 취급합니다. Docker는 주어진 환경에서 항상 가장 성능이 뛰어난 솔루션은 아니지만 가장 잘 테스트된 옵션 중 하나일 가능성이 높습니다.

실질적으로 말하자면, Linux에는 컨테이너에 대한 대안이 있지만 일반적으로 도커는 어디에나 있고 생태계의 용어, 표준 및 도구에 미치는 영향 때문에 먼저 도커를 배우는 것이 좋습니다.

컨테이너는 어떻게 작동합니까?

컨테이너가 작동하는 방식을 이해하려면 컨테이너가 가상 머신과 어떻게 다른지 논의하는 것이 도움이 되는 경우가 있습니다.

가상 머신과 컨테이너

가상 머신 또는 VM은 컴퓨터의 하드웨어와 리소스를 완전히 가상화할 수 있는 하드웨어 가상화 기술입니다. 별도의 게스트 운영 체제는 호스트 시스템에서 실행되는 OS와 완전히 별개로 가상 머신을 관리합니다. 호스트 시스템에서 하이퍼바이저 라고 하는 소프트웨어는 가상 머신의 시작, 중지 및 관리를 담당합니다.

VM은 정상적인 작동 조건에서 호스트 시스템이나 다른 VM에 영향을 미칠 수 없는 완전히 별개의 컴퓨터로 작동하기 때문에 가상 머신은 뛰어난 격리 및 보안을 제공합니다. 그러나 단점이 있습니다. 예를 들어 전체 컴퓨터를 가상화하려면 VM에서 상당한 양의 리소스를 사용해야 합니다. 가상 머신은 완전한 게스트 운영 체제에서 작동하기 때문에 가상 머신 프로비저닝 및 부팅 시간이 상당히 느릴 수 있습니다. 마찬가지로 VM이 독립적인 시스템으로 작동하기 때문에 관리자는 개별 환경을 업데이트하고 실행하기 위해 인프라와 유사한 관리 도구 및 프로세스를 채택해야 하는 경우가 많습니다.

일반적으로 가상 머신을 사용하면 머신의 리소스를 더 작은 개별 컴퓨터로 세분화할 수 있지만 최종 결과는 물리적 컴퓨터 집합을 관리하는 것과 크게 다르지 않습니다. 플릿 구성원이 확장되고 각 호스트의 책임이 더 집중될 수 있지만 사용하는 도구, 전략 및 프로세스와 시스템 기능은 눈에 띄게 변경되지 않을 것입니다.

컨테이너는 다른 접근 방식을 취합니다. 전체 컴퓨터를 가상화하는 대신 컨테이너는 운영 체제를 직접 가상화합니다. 이들은 호스트 운영 체제의 커널에 의해 관리되는 특수 프로세스로 실행되지만 시스템의 프로세스, 리소스 및 환경에 대한 제한적이고 심하게 조작된 보기가 있습니다. 컨테이너는 자신이 공유 시스템에 존재한다는 사실을 인식하지 못하고 컴퓨터를 완전히 제어하는 ​​것처럼 작동합니다.

컨테이너를 가상 머신과 같이 완전한 컴퓨터인 것처럼 취급하는 대신 컨테이너를 애플리케이션과 더 유사하게 관리하는 것이 더 일반적입니다. 예를 들어 SSH 서버를 컨테이너에 번들로 묶을 수 있지만 이는 권장되는 패턴이 아닙니다. 대신 디버깅은 일반적으로 로깅 인터페이스를 통해 수행되고 업데이트는 새 이미지를 롤링하여 적용되며 서비스 관리는 덜 강조되고 전체 컨테이너를 관리합니다.

이러한 특성은 컨테이너가 가상 머신의 강력한 격리와 기존 프로세스의 기본 관리 사이에 있는 공간을 차지한다는 것을 의미합니다. 컨테이너는 제한, 유연성 및 속도의 적절한 균형을 제공하는 구획화 및 프로세스 중심 가상화를 제공합니다.

Linux cgroup 및 네임스페이스

Linux 커널에는 이를 가능하게 하는 몇 가지 기능이 있습니다. Linux 컨트롤 그룹 또는 cgroups 는 프로세스와 해당 리소스를 하나의 단위로 그룹화, 격리 및 관리할 수 있는 커널 기능입니다. cgroup은 프로세스를 함께 묶고, 액세스할 수 있는 리소스를 결정하고, 동작을 관리하고 모니터링하기 위한 메커니즘을 제공합니다. 하위 프로세스가 상위 프로세스의 조건을 상속하고 잠재적으로 추가 제약 조건을 채택할 수 있도록 허용하는 계층적 시스템을 따릅니다. cgroup은 프로세스를 하나의 그룹으로 묶고 액세스할 수 있는 리소스를 제한하는 데 필요한 기능을 제공합니다.

컨테이너가 의존하는 다른 주요 커널 기능은 Linux 네임스페이스 입니다 . 네임스페이스는 나머지 시스템에서 볼 수 있는 프로세스를 제한합니다. 네임스페이스 내에서 실행되는 프로세스는 네임스페이스 외부에서 실행되는 것을 인식하지 못합니다. 네임스페이스는 시스템의 나머지 부분과 별개인 고유한 컨텍스트를 정의하므로 네임스페이스의 프로세스 트리는 해당 컨텍스트를 반영해야 합니다. 네임스페이스 내에서 기본 프로세스는 PID 1(프로세스 ID 1)이 됩니다. 이 PID는 전통적으로 OS의 초기화 시스템용으로 예약되어 있습니다. 네임스페이스 내에 구성된 이 심하게 조작된 가상 프로세스 트리를 통해 컨테이너 내에서 실행되는 프로세스는 마치 정상적이고 제한 없는 환경에서 작동하는 것처럼 작동할 수 있습니다.

컨테이너화의 이점

지금까지 컨테이너를 가능하게 하는 몇 가지 기술에 대해 논의했으므로 가장 중요한 몇 가지 특성을 살펴보겠습니다.

가벼운 가상화

가상 머신을 사용한 하드웨어 가상화와 비교할 때 컨테이너는 매우 가볍습니다. 모든 하드웨어 리소스를 가상화하고 해당 환경 내에서 완전히 독립적인 운영 체제를 실행하는 대신 컨테이너는 호스트 시스템의 커널을 사용하고 해당 OS 내에서 구획화된 프로세스로 실행됩니다.

호스트의 관점에서 볼 때 컨테이너는 다른 프로세스와 마찬가지로 실행되므로 빠르게 시작 및 중지하고 제한된 양의 리소스를 사용할 수 있습니다. 컨테이너는 호스트 프로세스 공간 및 리소스의 하위 집합만 보고 액세스할 수 있지만 대부분의 상황에서 완전히 독립된 운영 체제인 것처럼 작동할 수 있습니다.

컨테이너 이미지 자체도 매우 작을 수 있습니다. 최소 이미지 크기를 사용하면 상당한 지연 없이 런타임에 최신 이미지를 가져오는 작업 흐름이 가능합니다. 이는 많은 내결함성 자가 치유 분산 시스템의 요구 사항입니다.

환경 격리

cgroup 및 네임스페이스와 같은 Linux 커널 기능을 사용하여 컨테이너는 호스트 환경과 서로 격리됩니다. 이는 컨테이너 환경이 서로 간섭하지 않도록 방지하는 기능 제한 수준을 제공합니다.

완전한 보안 샌드박싱으로 간주될 만큼 강력하지는 않지만 이러한 격리에는 이점이 있습니다. 호스트와 각 컨테이너가 별도의 파일 시스템에서 소프트웨어를 유지 관리하므로 종속성 및 라이브러리 충돌을 피하기가 더 쉽습니다. 네트워킹 환경을 분리할 수 있으므로 컨테이너 내의 애플리케이션은 호스트 시스템 또는 다른 컨테이너의 소프트웨어와 충돌할 염려 없이 네이티브 포트에 바인딩할 수 있습니다. 그런 다음 관리자는 요구 사항에 따라 컨테이너의 네트워킹을 호스트 네트워크에 매핑하는 방법을 선택할 수 있습니다.

표준화된 패키징 형식 및 런타임 대상

컨테이너의 가장 강력한 이점 중 하나는 소프트웨어 패키징 및 배포 프로세스를 통합하고 단순화하는 기능입니다. 컨테이너 이미지를 사용하면 애플리케이션과 모든 런타임 요구 사항을 다양한 인프라에 배포할 수 있는 단일 단위로 묶을 수 있습니다.

컨테이너 내부에서 개발자는 호스트 시스템 라이브러리를 방해할 염려 없이 애플리케이션에 필요한 모든 라이브러리를 설치하고 사용할 수 있습니다. 종속성은 이미지가 생성될 때 버전이 잠깁니다. 컨테이너 런타임은 안정적인 표준 배포 플랫폼 역할을 하므로 개발자는 컨테이너가 실행될 특정 시스템에 대해 많이 알 필요가 없습니다. 컨테이너 런타임이 작동하고 적절한 시스템 리소스를 사용할 수 있는 한 컨테이너는 개발 환경에서와 동일하게 실행되어야 합니다.

마찬가지로 운영 관점에서 컨테이너화는 배포 환경의 요구 사항을 표준화하는 데 도움이 됩니다. 애플리케이션 언어, 런타임 및 종속성을 기반으로 고유한 환경을 프로비저닝하고 유지 관리할 필요 없이 관리자는 컨테이너 플랫폼으로 작동하는 일반 호스트를 유지 관리하고 이러한 시스템이 액세스할 수 있는 리소스 풀을 할당하는 데 집중할 수 있습니다. 컨테이너 내의 모든 특정 애플리케이션 특성을 번들로 묶으면 애플리케이션의 관심사와 플랫폼의 관심사 사이에 자연스러운 경계가 만들어집니다.

확장성

컨테이너 패러다임을 사용하면 상대적으로 간단한 메커니즘을 사용하여 애플리케이션을 확장할 수도 있습니다. 가벼운 이미지 크기, 빠른 시작 시간, "골든 이미지"를 생성, 테스트 및 배포하는 기능, 표준화된 런타임 환경은 모두 확장성이 뛰어난 시스템을 구축하는 데 사용할 수 있는 기능입니다.

시스템의 확장성은 애플리케이션 아키텍처와 컨테이너 이미지 자체가 구성되는 방식에 따라 크게 달라집니다. 컨테이너 패러다임과 잘 작동하는 디자인은 컨테이너 형식의 강점을 인식하여 속도, 가용성 및 관리 용이성의 적절한 균형을 달성합니다. 서비스 지향 아키텍처 , 특히 마이크로서비스 는 애플리케이션을 집중된 목적을 가진 개별 구성 요소로 분해하면 개발, 확장 및 업데이트가 더 간단해지기 때문에 컨테이너화된 환경에서 매우 인기가 있습니다.

컨테이너 용어

마무리하기 전에 이 가이드에서 소개한 몇 가지 주요 용어와 학습을 계속하면서 접할 수 있는 몇 가지 새로운 용어를 검토해 보겠습니다.

  • 컨테이너: Linux에서 컨테이너는 애플리케이션과 해당 종속성을 패키징하고 격리된 환경에서 실행하는 데 사용되는 운영 체제 가상화 기술입니다.
  • 컨테이너 이미지: 컨테이너 이미지는 파일 시스템과 특정 컨테이너 구성의 동작을 정의하는 정적 파일입니다. 컨테이너 이미지는 컨테이너를 생성하기 위한 템플릿으로 사용됩니다.
  • 컨테이너 오케스트레이션: 컨테이너 오케스트레이션은 여러 호스트에서 컨테이너 플릿을 관리하는 데 필요한 프로세스 및 도구를 설명하는 데 사용되는 용어입니다. 컨테이너 오케스트레이션은 일반적으로 컨테이너 플랫폼을 사용하여 확장, 내결함성, 리소스 할당 및 스케줄링을 제어합니다.
  • 컨테이너 런타임: 컨테이너 런타임은 실제로 호스트에서 컨테이너를 실행하고 관리하는 구성 요소입니다. 최소 요구 사항은 일반적으로 지정된 이미지에서 컨테이너를 프로비저닝할 수 있어야 하지만 많은 런타임은 프로세스 관리, 모니터링 및 이미지 관리와 같은 다른 기능을 번들로 제공합니다. Docker는 명령 내에 컨테이너 런타임을 포함 docker하지만 다양한 사용 사례에 사용할 수 있는 다른 많은 대안이 있습니다.
  • Docker: Docker는 아이디어 Linux 컨테이너를 성공적으로 대중화한 최초의 기술입니다. 그 중에서도 Docker의 도구 에코시스템에는 docker광범위한 컨테이너 및 이미지 관리 기능을 갖춘 컨테이너 런타임, docker-compose다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 시스템, 컨테이너 이미지 레지스트리인 Docker Hub가 포함됩니다.
  • Dockerfile: Dockerfile은 컨테이너 이미지를 빌드하는 방법을 설명하는 텍스트 파일입니다. 기본 이미지, 시스템 내에서 실행할 명령, 런타임이 컨테이너 내에서 프로세스를 시작하고 관리하는 방법을 정의합니다. 유일한 옵션은 아니지만 Dockerfile은 Docker의 이미지 빌드 기능을 사용하지 않는 경우에도 컨테이너 이미지를 정의하는 가장 일반적인 형식입니다.
  • Kata 컨테이너: Kata 컨테이너는 컨테이너 작업 경험을 복제하는 모델, 워크플로 및 도구를 사용하여 경량 가상 머신을 관리하는 접근 방식입니다. Kata 컨테이너는 보다 강력한 격리 및 보안을 제공하면서 컨테이너의 이점을 포착하려고 합니다.
  • Kubernetes: Kubernetes는 컨테이너 호스트의 클러스터와 여기에서 실행되는 워크로드를 관리하는 강력한 컨테이너 오케스트레이션 플랫폼입니다. Kubernetes는 고가용성 프로덕션 환경에서 컨테이너를 배포, 확장, 모니터링 및 관리하기 위한 도구 및 추상화를 제공합니다.
  • Linux cgroup: Linux cgroup 또는 제어 그룹은 프로세스를 함께 묶고 리소스에 대한 액세스 권한을 결정하는 커널 기능입니다. Linux의 컨테이너는 리소스와 별도의 프로세스를 관리하기 위해 cgroup을 사용하여 구현됩니다.
  • Linux 네임스페이스: Linux 네임스페이스는 시스템의 나머지 부분에 대한 프로세스 또는 cgroup의 가시성을 제한하도록 설계된 커널 기능입니다. Linux의 컨테이너는 네임스페이스를 사용하여 워크로드와 해당 리소스를 시스템에서 실행 중인 다른 프로세스로부터 격리합니다.
  • LXC: LXC는 많은 동일한 커널 기술에 의존하면서 Docker 및 기타 여러 기술보다 앞서는 Linux 컨테이너화의 한 형태입니다. Docker와 비교하여 LXC는 일반적으로 애플리케이션을 실행하는 데 필요한 프로세스가 아닌 전체 운영 체제를 가상화합니다. 이는 가상 머신과 더 유사해 보일 수 있습니다.
  • 가상 머신: 가상 머신 또는 VM은 전체 컴퓨터를 에뮬레이트하는 하드웨어 가상화 기술입니다. 내부 구성 요소를 관리하고 가상 머신의 컴퓨팅 리소스에 액세스하기 위해 전체 운영 체제가 가상 머신 내에 설치됩니다.
  • 가상화: 가상화는 가상 환경 또는 컴퓨팅 리소스를 생성, 실행 및 관리하는 프로세스입니다. 가상화는 물리적 리소스를 추상화하는 방법이며 종종 다양한 목적을 위해 리소스 풀을 분할하는 데 사용됩니다.

결론

컨테이너는 마법의 총알은 아니지만 베어 메탈에서 소프트웨어를 실행하거나 다른 가상화 기술을 사용하는 것보다 몇 가지 매력적인 이점을 제공합니다. 가볍고 기능적인 격리를 제공하고 복잡성을 관리하는 데 도움이 되는 도구의 풍부한 에코시스템을 개발함으로써 컨테이너는 개발 중 및 운영 수명 주기 전체에서 뛰어난 유연성과 제어 기능을 제공합니다.