[docker] Docker, 그것은 무엇이며 목적은 무엇입니까

며칠 전에 Docker에 대해 들었고 건너보고 싶었습니다.

하지만 사실이 “컨테이너”의 목적이 무엇인지 모르겠습니다.

컨테이너 란?

개발 전용 가상 머신을 대체 할 수 있습니까?

간단히 말해서 회사에서 Docker를 사용하는 목적은 무엇입니까? 가장 큰 장점은?



답변

VM : VM 소프트웨어를 사용하여 예를 들어 Ubuntu를 Windows 내부에 설치할 수 있습니다. 그리고 둘 다 동시에 실행됩니다. CPU, RAM, 디스크, 네트워크 카드 등과 같은 핵심 구성 요소를 운영 체제 내에서 PC를 구축하고 조립하여 마치 실제 PC처럼 작동하는 것과 같습니다. 이런 식으로 가상 PC는 호스트라고하는 운영 체제가있는 실제 PC 내에서 “게스트”가됩니다.

컨테이너: 위와 동일하지만 전체 운영 체제를 사용하는 대신 가상 OS의 “불필요한”구성 요소를 줄여 최소 버전을 만듭니다. 이로 인해 LXC (Linux 컨테이너)가 생성되며 VM 머신보다 빠릅니다.

Docker : 가상 머신 및 컨테이너와 달리 Docker 컨테이너는 별도의 운영 체제를 필요로하지 않거나 포함하지 않습니다. 대신 Linux 커널의 기능 에 의존 하고 리소스 격리를 사용합니다.
Docker의 목적 : 주요 초점은 소프트웨어 컨테이너 내부의 애플리케이션 배포를 자동화하고 Linux에서 운영 체제 수준 가상화를 자동화하는 것입니다. 표준 컨테이너보다 가볍고 몇 초 만에 부팅됩니다.
ggg

(Docker의 경우 게스트 OS가 필요하지 않습니다.)


답변

[참고,이 답변은 Linux 컨테이너에 중점을두고 있으며 다른 운영 체제에는 완전히 적용되지 않을 수 있습니다. ]

컨테이너 란?

앱입니다 . 컨테이너는 서로 격리 된 애플리케이션을 실행하는 방법입니다. 컨테이너는 여러 운영 체제를 실행하기 위해 하드웨어를 가상화하는 대신 여러 애플리케이션을 실행하기 위해 운영 체제 가상화에 의존합니다. 즉, 실행중인 OS 사본이 하나만 있고 앱의 각 인스턴스에 대해 메모리 및 CPU 코어를 사전 할당 할 필요가 없기 때문에 VM보다 동일한 하드웨어에서 더 많은 컨테이너를 실행할 수 있습니다. 다른 앱과 마찬가지로 컨테이너에 CPU 또는 메모리가 필요할 때이를 할당 한 다음 완료되면 해제하여 나중에 다른 앱이 동일한 제한된 리소스를 사용할 수 있도록합니다.

커널 네임 스페이스를 활용합니다 . 기본적으로 각 컨테이너는 다음과 같은 네임 스페이스가있는 환경을받습니다.

  • 마운트 : /컨테이너의 파일 시스템 /은 호스트 와 다릅니다 .
  • PID : 프로세스 ID, 컨테이너의 pid 1은 시작된 애플리케이션입니다.이 pid는 호스트에서 볼 때 달라집니다.
  • 네트워크 : 컨테이너는 기본적으로 자체 루프백 인터페이스 (127.0.0.1) 및 개인 IP로 실행됩니다. Docker는 Linux 브리지 네트워크와 같은 기술을 사용하여 자체 사설 LAN에서 여러 컨테이너를 함께 연결합니다.
  • IPC : 프로세스 간 통신
  • UTS : 여기에는 호스트 이름이 포함됩니다.
  • 사용자 : 선택적으로 모든 사용자 ID를 호스트의 ID에서 오프셋되도록 이동할 수 있습니다.

또한 이러한 각 네임 스페이스는 해당 격리를 명시 적으로 제거하지 않는 한 컨테이너가 호스트 또는 다른 컨테이너의 파일 시스템 또는 프로세스와 같은 것을 보지 못하게합니다.

기타 Linux 보안 도구 : 컨테이너는 SELinux, AppArmor, Capabilities 및 Seccomp와 같은 다른 보안 기능을 활용하여 루트 사용자를 포함한 컨테이너 내부의 사용자가 컨테이너를 탈출하거나 호스트에 부정적인 영향을 미치지 못하도록 제한합니다.

이식성을 위해 종속성과 함께 앱 패키징 : 애플리케이션을 컨테이너로 패키징하려면 애플리케이션 자체뿐만 아니라 해당 애플리케이션을 실행하는 데 필요한 모든 종속성을 이식 가능한 이미지로 조립해야합니다. 이 이미지는 컨테이너를 만드는 데 사용되는 기본 파일 시스템입니다. 응용 프로그램 만 격리하고 있기 때문에이 파일 시스템에는 전체 운영 체제를 가상화하는 데 필요한 커널 및 기타 OS 유틸리티가 포함되어 있지 않습니다. 따라서 컨테이너의 이미지는 동등한 가상 머신의 이미지보다 훨씬 작아야 네트워크를 통해 노드에 더 빠르게 배포 할 수 있습니다. 그 결과 컨테이너는 클라우드 및 원격 데이터 센터에 애플리케이션을 배포하는 데 널리 사용되는 옵션이되었습니다.

개발 전용 가상 머신을 대체 할 수 있습니까?

그것은 의존 : 개발 환경은 리눅스를 실행하고, 당신도 하드웨어 장치에 대한 액세스를 필요로하지 않는, 또는 물리적 하드웨어에 직접 액세스 할 수 있도록 허용하는 경우, 당신은 꽤 똑바로 앞으로 리눅스 컨테이너에 마이그레이션을 찾을 수 있습니다. Docker 컨테이너의 이상적인 대상은 네트워크를 통해 액세스하는 웹 기반 API (예 : REST 앱)와 같은 애플리케이션입니다.

간단히 말해서 회사에서 Docker를 사용하는 목적은 무엇입니까? 주요 장점은?

Dev 또는 Ops : Docker는 일반적으로 두 경로 중 하나를 통해 환경으로 가져옵니다. 애플리케이션을보다 신속하게 개발하고 로컬에서 테스트 할 방법을 찾고있는 개발자와 가상 머신에서 가능한 것보다 적은 하드웨어에서 더 많은 워크로드를 실행하려는 작업.

또는 Devops : 이상적인 대상 중 하나는 CI / CD 배포 도구에서 Docker를 즉시 활용하여 애플리케이션을 컴파일하고 개발, CI, 제품 등에 배포되는 이미지를 즉시 구축하는 것입니다. 컨테이너는 종종 애플리케이션 이동 시간을 줄여줍니다. 코드 체크인부터 테스트에 사용할 수있을 때까지 개발자의 효율성을 높일 수 있습니다. 제대로 디자인되면 개발자와 CI 도구가 테스트하고 승인 한 동일한 이미지를 프로덕션에 배포 할 수 있습니다. 이 이미지에는 모든 응용 프로그램 종속성이 포함되어 있기 때문에 개발 과정에서 작동하던 작업이 중단 될 위험이 크게 줄어 듭니다.

확장 성 : 제가 언급 할 컨테이너의 마지막 주요 이점 중 하나는 수평 확장 성을 염두에두고 설계되었다는 것입니다. 부하가 높은 상태 비 저장 앱이있는 경우 컨테이너는 이미지 크기가 더 작고 오버 헤드가 줄어들 기 때문에 훨씬 쉽고 빠르게 확장 할 수 있습니다. 이러한 이유로 Google 및 Netflix와 같은 많은 대규모 웹 기반 회사에서 컨테이너를 사용하고 있습니다.


답변

며칠 전에 같은 질문이 내 머리를 때렸고 그것에 들어가서 찾은 것을 아주 간단한 단어로 이해합시다.

애플리케이션 아키텍처 및 개발의 현재 프로세스에서 모든 것이 잘 보일 때 왜 도커와 컨테이너를 생각할까요!

nodeJs, MongoDB, Redis, RabbitMQ 등의 서비스를 사용하여 애플리케이션을 개발하는 예를 들어 보겠습니다 [다른 서비스를 생각할 수 있습니다].

이제 우리 는 Docker 또는 컨테이너화 응용 프로그램의 다른 대안의 존재를 잊으면 응용 프로그램 개발 및 배송 프로세스의 문제로 다음과 같은 문제에 직면 합니다.

  1. 서비스 (nodeJs, mongoDB, Redis, RabbitMQ 등) 와 OS의 호환성 (OS와 호환되는 버전을 찾은 후에도 버전과 관련하여 예기치 않은 일이 발생하면 호환성을 다시 검토하고 수정해야합니다).

  2. 두 시스템 구성 요소가 OS의 응용 프로그램에서 서로 다른 버전라이브러리 / 종속성을 필요로하는 경우 (라이브러리 및 종속성 버전 문제로 인해 응용 프로그램의 예기치 않은 동작이 발생할 경우 매번 재검토해야 함).

  3. 가장 중요한 것은 새로운 사람이 팀에 합류하면 새로운 환경을 설정하는 것이 매우 어렵다는 것을 알게되며 사람은 많은 지침을 따라야합니다. 최종적으로 수백 개의 명령을 실행해야하며 시간과 노력이 필요합니다.

    사람들은 올바른 버전의 OS를 사용하고 있는지 확인하고 OS와 서비스의 호환성을 확인해야하며 각 개발자는 설정할 때마다이를 따라야합니다.

  4. 또한 개발, 테스트 및 프로덕션과 같은 다른 환경이 있습니다. . 한 개발자는 하나의 OS를 사용하는 것이 편하고 다른 개발자는 다른 OS를 사용하는 것이 편하다면이 두 가지 상황에서 우리의 애플리케이션이 동일한 방식으로 작동 할 것이라고 보장 할 수 없습니다. .

이 모든 것이 개발 , 테스트 과정에서 우리의 삶을 어렵게 만듭니다. 애플리케이션 및 배송 하는 .

그래서 우리는 호환성 문제 처리 하고 다른 구성 요소에 영향을주지 않고 시스템 구성 요소를 변경하고 수정할 수 .

이제 Docker에 대해 생각하는 이유는 응용 프로그램을 컨테이너화하고 응용 프로그램 배포를 자동화하고 매우 쉽게 제공하는 것이기 때문입니다.

여기에 이미지 설명 입력

도 커가 위의 문제를 해결하는 방법-

  1. 각 서비스 구성 요소 (nodeJs, MongoDB, Redis, RabbitMQ)를 동일한 OS에서 다른 환경에서 자체 종속성라이브러리 를 사용하여 다른 컨테이너 에서 실행할 수 있습니다.

  2. Docker 구성을 한 번만 실행하면 모든 팀 개발자가 간단한 docker run 명령으로 시작할 수 있습니다 . 여기에서 많은 시간과 노력을 절약했습니다 .

따라서 컨테이너 는 모든 종속성 및 라이브러리가 자체 프로세스네트워킹 인터페이스 와 함께 번들로 제공되는 격리 된 환경입니다.마운트 .

모든 컨테이너는 동일한 OS 리소스를 사용하므로 부팅하는 데 시간이 덜 걸리며 하드웨어 비용을 줄이면서 CPU를 효율적으로 활용합니다.

도움이 되셨기를 바랍니다.


답변

가능한 한 간단한 답변을 드리겠습니다.

하지만 사실이 “컨테이너”의 목적이 무엇인지 모르겠습니다.

컨테이너 란?

간단히 말해서 : 소프트웨어가 포함패키지 . 더 구체적으로, 애플리케이션과 모든 종속 항목이 함께 번들로 제공됩니다. Docker 컨테이너는 OS 추상화 계층 인 반면 일반적인 비 독립 애플리케이션 환경은 OS에 직접 연결됩니다.

그리고 컨테이너는 이미지의 런타임 인스턴스 라는 점에서 이미지와 다릅니다 . OOP에 익숙한 경우 객체가 클래스의 런타임 인스턴스 인 방식과 유사합니다.

개발 전용 가상 머신을 대체 할 수 있습니까?

VM과 Docker 컨테이너는 모두 시스템 인프라 위에 추상화를 제공한다는 점에서 가상화 기술입니다.

VM은 하이퍼 바이저를 통해 호스트 리소스에 가상으로 액세스 할 수있는 완전한 “게스트”운영 체제를 실행합니다. 이는 VM이 ​​실제로 필요한 것보다 더 많은 리소스를 환경에 제공한다는 것을 의미합니다. 일반적으로 VM은 대부분의 애플리케이션에 필요한 것보다 더 많은 리소스가있는 환경을 제공합니다. 따라서 컨테이너는 더 가벼운 기술입니다. 이 두 가지는 다른 문제를 해결합니다.

간단히 말해서 회사에서 Docker를 사용하는 목적은 무엇입니까? 가장 큰 장점은?

컨테이너화는 마이크로 서비스와 함께 진행됩니다. 더 큰 애플리케이션을 구성하는 더 작은 서비스는 종종 Docker 컨테이너에서 테스트되고 실행됩니다. 따라서 지속적인 테스트가 더 쉬워집니다.

또한 Docker 컨테이너는 읽기 전용이므로 핵심 DevOps 원칙을 적용합니다. 프로덕션 서비스는 변경되지 않아야합니다.

이를 사용하여 얻을 수있는 몇 가지 일반적인 이점 :

  • 서비스의 큰 격리
  • 컨테이너에는 앱에 필요한 모든 것이 포함되어있어 관리 용이성
  • 구현 기술 캡슐화 (컨테이너 내)
  • VM에 비해 효율적인 리소스 활용 (경량 OS 가상화로 인한)
  • 빠른 배포

답변