containers 도커 윈도우 - Docker와 가상 머신의 차이점은 무엇입니까?





9 Answers

좋은 대답. 컨테이너 대 VM의 이미지 표현을 얻으려면 아래를 살펴보십시오.

Source

docker란 단점 컨테이너

Docker와 전체 VM의 차이점을 이해하기 위해 Docker 설명서 를 계속 읽 습니다 . 무거워지지 않고 전체 파일 시스템, 고립 된 네트워킹 환경 등을 어떻게 제공 할 수 있습니까?

일관된 프로덕션 환경에 간단하게 배포하는 것보다 소프트웨어를 Docker 이미지에 배포하는 것이 왜 적합한 가라는 이유입니까?




나는 Ken Cochrane의 대답을 좋아합니다.

그러나 여기에 자세히 다루지 않은 관점을 추가하고 싶습니다. 내 의견으로는 Docker도 전체 프로세스가 다릅니다. VM과는 달리 Docker는 하드웨어의 최적의 리소스 공유에 관한 것은 아니며 패키징 응용 프로그램을위한 "시스템"을 제공합니다 (필수는 아니지만 일련의 마이크로 서비스로 제공).

나에게 rpm, Debian 패키지, Maven , npm + Git 등의 개발자 지향 도구와 Puppet , VMware, Xen과 같은 ops 도구 사이의 틈새에 맞습니다.

일관된 프로덕션 환경에 간단하게 배포하는 것보다 소프트웨어를 docker 이미지에 배포하는 것이 왜 적절한가?

귀하의 질문은 일관된 프로덕션 환경을 전제로합니다. 그러나 일관되게 유지하는 방법? 파이프 라인의 일부 단계 (> 10)의 서버 및 응용 프로그램을 고려하십시오.

이를 동기화하기 위해 꼭두각시, Chef 또는 자신의 프로비저닝 스크립트, 게시되지 않은 규칙 및 / 또는 많은 문서를 사용하기 시작합니다 ... 이론적으로 서버는 무기한으로 실행될 수 있으며 완전히 일관되고 최신 상태로 유지 될 수 있습니다. 실습은 서버 구성을 완전히 관리하지 못하기 때문에 구성 편차 및 실행중인 서버에 예기치 않은 변경 사항이있을 수 있습니다.

그래서 이것을 피하는 알려진 패턴, 불변의 불변의 서버가 있습니다. 그러나 불변의 서버 패턴은 사랑받지 못했습니다. 주로 Docker 이전에 사용 된 VM의 한계 때문입니다. 몇 기가 바이트의 큰 이미지를 다루고 큰 이미지를 움직이면서 애플리케이션의 일부 필드를 변경하는 것은 매우 힘들었습니다. 이해할 수 있는...

Docker 에코 시스템을 사용하면 "작은 변경 사항"(감사와 레지스트리)에 기가 바이트 단위로 이동할 필요가 없으며 런타임에 응용 프로그램을 Docker 컨테이너에 패키징하여 성능 손실을 걱정할 필요가 없습니다. 이미지의 버전에 대해 걱정할 필요가 없습니다.

그리고 마지막으로 Linux 랩탑에서도 복잡한 생산 환경을 재현 할 수 있습니다 (귀하의 경우 작동하지 않으면 나를 부르지 마십시오).)

물론 VM에서 Docker 컨테이너를 시작할 수 있습니다 (좋은 생각입니다). VM 수준에서 서버 프로비저닝을 줄입니다. 위의 모든 사항은 Docker가 관리 할 수 ​​있습니다.

PS Docker는 LXC 대신 자체 구현 "libcontainer"를 사용합니다. 그러나 LXC는 여전히 사용할 수 있습니다.




이 게시물을 통해 우리는 VM과 LXC 간의 몇 가지 차이점을 이끌어 낼 것입니다. 먼저 그것들을 정의합시다.

VM :

가상 컴퓨터는 물리적 컴퓨팅 환경을 에뮬레이트하지만 CPU, 메모리, 하드 디스크, 네트워크 및 기타 하드웨어 리소스에 대한 요청은 이러한 요청을 기본 물리적 하드웨어로 변환하는 가상화 계층에 의해 관리됩니다.

이 컨텍스트에서 VM은 게스트로 호출되며 실행되는 환경은 호스트라고합니다.

LXC s :

Linux Containers (LXC)는 하나의 제어 호스트 (LXC 호스트)에서 여러 격리 된 Linux 컨테이너를 실행할 수있는 운영 체제 수준의 기능입니다. 리눅스 컨테이너는 하이퍼 바이저가 필요 없기 때문에 VM에 대한 경량의 대체품입니다. Virtualbox, KVM, Xen 등

지금 당신이 Alan (Zach Galifianakis - 행 오버 시리즈에서)으로 마약을 쓴 적이없고 작년에 라스베가스에 있었다면 리눅스 컨테이너 기술에 대한 엄청난 관심에 대해 잘 알고있을 것입니다. 프로젝트는 클라우드 컴퓨팅 환경이 VM (Virtual Machine)을 포기하고 낮은 오버 헤드와 잠재적으로 더 나은 성능으로 인해 컨테이너로 대체해야한다는 몇 가지 의견을 이끌어내는 Docker입니다.

그러나 큰 문제는 실현 가능한가?, 그것은 합리적인가?

에이. LXC는 Linux 인스턴스로 범위가 지정됩니다. 그것은 Linux의 다른 맛 일 수 있습니다 (예 : CentOS 호스트의 Ubuntu 컨테이너이지만 여전히 Linux입니다). 마찬가지로 Windows 기반 컨테이너는 Windows의 인스턴스로 범위가 지정됩니다. 하이퍼 바이저는 운영 체제 Linux 또는 Windows에 국한되지 않습니다.

비. LXC는 오버 헤드가 적고 VM에 비해 성능이 좋습니다. 도구 즉. Docker는 LXC 기술을 기반으로 개발자가 응용 프로그램을 실행할 수있는 플랫폼을 제공함과 동시에 운영 서버 또는 데이터 센터에 동일한 컨테이너를 배포 할 수있는 도구를 운영자에게 제공합니다. DevOps의 모든 목적과 목적이 이러한 사일로를 무너 뜨리는 것이기 때문에 응용 프로그램을 실행하는 개발자와 응용 프로그램을 부팅하고 테스트하는 경험이있는 사용자와 해당 응용 프로그램을 원활하게 배포하는 운영자가 원활하게 작업하려고합니다.

따라서 최적의 접근 방식은 특정 인프라 스트럭처 및 시나리오를 처리하기에 적합하기 때문에 클라우드 인프라 제공자가 VM 및 LXC의 적절한 사용을 옹호해야한다는 것입니다.

VM을 버리는 것은 현재로서는 실용적이지 않습니다. 따라서 VM과 LXC 모두 개별적인 존재와 중요성을 가지고 있습니다.




Docker는 모든 종속성을 가진 응용 프로그램을 캡슐화합니다.

가상화 프로그램은 일반적으로 베어 메탈 머신에서 실행할 수있는 모든 응용 프로그램을 실행할 수있는 OS를 캡슐화합니다.




1. 경량

이것은 아마도 많은 docker 학습자들에게 첫인상 일 것입니다.

첫째, 도커 이미지는 일반적으로 VM 이미지보다 작기 때문에 쉽게 빌드, 복사, 공유 할 수 있습니다.

둘째, Docker 컨테이너는 몇 밀리 초 만에 시작할 수 있으며 VM은 몇 초 만에 시작할 수 있습니다.

2. 계층 파일 시스템

이것은 Docker의 또 다른 핵심 기능입니다. 이미지에는 레이어가 있으며 여러 이미지로 레이어를 공유 할 수 있으므로 훨씬 더 공간을 절약하고 더 빠르게 만들 수 있습니다.

모든 컨테이너가 기본 이미지로 우분투를 사용하는 경우 모든 이미지가 자체 파일 시스템을 가지고 있지는 않지만 동일한 밑줄 우분투 파일을 공유하며 자신의 응용 프로그램 데이터 만 다릅니다.

3. 공유 OS 커널

컨테이너를 프로세스라고 생각하십시오!

호스트에서 실행되는 모든 컨테이너는 사실 서로 다른 파일 시스템을 사용하는 일련의 프로세스입니다. 이들은 동일한 OS 커널을 공유하며 시스템 라이브러리와 종속성 만 캡슐화합니다.

이것은 대부분의 경우에 좋으며 (여분의 OS 커널은 유지하지 않음) 컨테이너간에 엄격한 격리가 필요한 경우 문제가 될 수 있습니다.

왜 중요한거야?

이 모든 것들은 혁명이 아니라 개선 된 것처럼 보입니다. 자, 양적 축적은 질적 인 변화로 이어진다 .

응용 프로그램 배포에 대해 생각해보십시오. 새로운 소프트웨어 (서비스)를 배포하거나 업그레이드하려는 경우 새 VM을 만드는 대신 구성 파일과 프로세스를 변경하는 것이 좋습니다. 업데이트 된 서비스로 VM을 생성하고이를 테스트 (개발 및 품질 보증간에 공유)하기 때문에 프로덕션에 배포하는 데 몇 시간이 걸릴 수 있습니다. 어떤 일이 잘못되면 다시 시작해야하며 더 많은 시간을 낭비하게됩니다. 그래서 구성 관리 도구 (인형, 소금 스택, 요리사 등)를 사용하여 새 소프트웨어를 설치하고 새 파일을 다운로드하는 것이 좋습니다.

도커에 관해서는 새로 만든 도커 컨테이너를 사용하여 기존 컨테이너를 교체하는 것은 불가능합니다. 유지 관리가 훨씬 쉽습니다! 새 이미지를 만들고 QA와 공유하고 테스트하고 배포하는 데 몇 분 (모든 것이 자동화 된 경우), 최악의 경우 몇 시간 만 걸립니다. 이를 불변 인프라 라고합니다 : 소프트웨어를 유지 보수 (업그레이드)하지 말고 새로 작성하십시오.

서비스가 전달되는 방식을 변형합니다. 우리는 애플리케이션을 원하지만 VM을 유지해야합니다 (이는 애플리케이션에 거의 도움이되지 않습니다). Docker는 응용 프로그램에 집중하고 모든 것을 부드럽게 만듭니다.




관련하여 : -

"왜 일관된 프로덕션 환경에 배포하는 것보다 소프트웨어를 도커 이미지에 쉽게 배포 할 수 있습니까?"

대부분의 소프트웨어는 일반적으로 다음 중 최소한 세 가지 환경에 배포됩니다.

  1. 개별 개발자 PC
  2. 공유 된 개발자 환경
  3. 개별 테스터 PC
  4. 공유 테스트 환경
  5. 품질 보증 환경
  6. UAT 환경
  7. 로드 / 성능 테스트
  8. 라이브 스테이징
  9. 생산
  10. 아카이브

고려해야 할 다음 요소도 있습니다.

  • 개발자와 실제로 테스터 모두 직업의 본질에 따라 미묘하거나 크게 다른 PC 구성을 갖게됩니다.
  • 개발자는 기업 또는 비즈니스 표준화 규칙 (예 : 자신의 컴퓨터에서 개발하는 프리랜서 (종종 원격))이나 PC를 특정 환경으로 설정하기 위해 '고용 된'또는 '계약 된'사람이 아닌 오픈 소스 프로젝트에 기여하는 사람을 통제하지 않고 PC로 개발할 수 있습니다 방법)
  • 일부 환경은로드 밸런싱 구성에서 고정 된 수의 여러 시스템으로 구성됩니다
  • 많은 프로덕션 환경에서 트래픽 수준에 따라 동적으로 (또는 '탄력적으로) 클라우드 기반 서버를 만들고 파괴합니다.

보시다시피 조직에 대한 외삽 된 총 서버 수는 단일 숫자로는 거의 없으며, 삼중 숫자로 표시되는 경우가 많으며 쉽게 상당히 높아질 수 있습니다.

이것은 처음부터 일관된 환경을 조성한다는 것은 엄청난 양 때문에 (심지어 그린 필드 시나리오에서도) 충분히 견디기는 어렵지만 일관성을 유지하는 것은 많은 수의 서버, 새 서버 추가 (동적 또는 수동으로), o / s 공급 업체, 안티 바이러스 공급 업체, 브라우저 공급 업체 등에서 자동 업데이트, 개발자 또는 서버 기술자가 수동으로 소프트웨어 설치 또는 구성 변경 등을 반복합니다. 환경을 일관성있게 유지하기 위해 (좋아, 순정 주의자에게는 할 수 있지만, 그것은 엄청나게 많은 시간과 노력과 훈련이 필요하며, VM과 컨테이너 (예 : Docker)가 처음에 고안된 이유이다).

그래서 더 같이 귀하의 질문에 생각 "일관성있는 모든 환경을 유지하는 극단적 인 어려움을 감안할 때, 그것은 계정으로 학습 곡선을 찍을 때조차하는 고정 표시기 이미지에 소프트웨어를 배포하는 것이 더 쉽습니다?" . 난 당신이 대답은 변함없이 "예"- 찾을 수있을 거라 생각하지만, 스택 오버플로에 대한이 새로운 질문을 게시 찾을 수있는 유일한 방법이 있습니다.




차이점에 대해 더 자세히 설명하는 답변이 많이 있지만 여기에 대한 간략한 설명이 있습니다.

한 가지 중요한 차이점은 VM이 별도의 커널을 사용하여 OS를 실행한다는 것 입니다. 그것이 무거 우며 부팅하는 데 시간이 걸리므로 더 많은 시스템 리소스를 필요로합니다.

Docker에서 컨테이너는 커널 을 호스트와 공유합니다 . 그러므로 그것은 가볍고 빨리 시작하고 멈출 수 있습니다.

가상화에서는 리소스가 설정 초기에 할당되므로 많은 시간 동안 가상 컴퓨터가 유휴 상태 일 때 리소스가 완전히 활용되지 않습니다. Docker에서 컨테이너는 고정 된 양의 하드웨어 리소스로 할당되지 않으며 요구 사항에 따라 리소스를 자유롭게 사용할 수 있으므로 확장 성이 뛰어납니다.

Docker는 UNION File system을 사용 합니다 . Docker는 컨테이너에 의해 소비되는 메모리 공간을 줄이기 위해 Copy-On-Write 기술을 사용합니다. 자세한 내용은 여기를 참조하십시오.




프로덕션 환경에서 Docker를 사용하고 준비 작업을 많이 해왔습니다. 익숙해지면 멀티 컨테이너 및 격리 된 환경을 구축하는 데 매우 유용합니다.

Docker는 LXC (Linux Container)를 기반으로 개발되었으며 많은 Linux 배포판, 특히 Ubuntu에서 완벽하게 작동합니다.

고정 컨테이너는 격리 된 환경입니다. topDocker 이미지에서 생성 된 Docker 컨테이너에서 명령 을 실행할 때이를 볼 수 있습니다 .

그 외에도 dockerFile 구성 덕분에 매우 가볍고 유연합니다.

예를 들어, Docker 이미지를 생성하고 DockerFile을 구성하여 실행중인 경우 'wget'this ', apt-get'that ','some shell script '를 실행하고 환경 변수를 설정하는 등의 작업을 수행 할 수 있습니다.

마이크로 서비스 프로젝트 및 아키텍처에서 Docker는 매우 실용적인 자산입니다. Docker, Docker swarm, Kubernetes 및 Docker Compose를 사용하여 확장 성, 탄력성 및 탄력성을 얻을 수 있습니다.

Docker에 관한 또 다른 중요한 문제는 Docker Hub와 그 커뮤니티입니다. 예를 들어, 나는 Prometheus, Grafana, Prometheus-JMX-Exporter 및 Dokcer를 사용하여 kafka 모니터링을위한 생태계를 구현했습니다.

그런 일을하기 위해 zookeeper, kafka, Prometheus, Grafana 및 jmx-collector 용 구성된 Docker 컨테이너를 다운로드 한 다음 yml 파일을 사용하여 일부 구성 요소를 마운트하거나 Docker 컨테이너에서 일부 파일 및 구성을 변경하고 전체를 빌드했습니다. 다중 컨테이너를 사용하여 카프카를 모니터링하는 시스템 격리 및 확장 성과 탄력성을 갖춘 단일 시스템의 Dockers는이 아키텍처를 여러 서버로 쉽게 이동할 수 있습니다.

Docker Hub 사이트 외에도 quay.io라는 또 다른 사이트가 있는데,이 사이트에서 Docker 이미지 대시 보드를 가져 와서 여기로 / 당겨받을 수 있습니다. Docker 이미지를 Docker Hub에서 가져 와서 자신의 컴퓨터에서 quay로 가져올 수도 있습니다.

참고 : 처음에는 Docker를 배우는 것이 복잡하고 어려워 보이지만 익숙해지면 Docker 없이는 작업 할 수 없습니다.

Docker로 작업 한 첫 번째 날에 잘못된 명령을 내거나 컨테이너와 모든 데이터 및 구성을 실수로 제거했을 때를 기억합니다.




Docker의 출처뿐만 아니라 VM과 컨테이너의 차이점을 명확하게 설명하는 멋진 기술 답변이 많이 있습니다.

나에게 VM과 Docker의 근본적인 차이점은 애플리케이션 홍보를 관리하는 방법이다.

VM을 사용하면 하나의 VM에서 다음 DEV까지 UAL에서 PRD로 응용 프로그램과 종속성을 승격시킬 수 있습니다.

  1. 종종 이러한 VM은 다른 패치 및 라이브러리를 갖습니다.
  2. 여러 응용 프로그램에서 VM을 공유하는 것은 흔한 일입니다. 이를 위해서는 모든 응용 프로그램의 구성 및 종속성을 관리해야합니다.
  3. Backout을 사용하려면 VM에서 변경 사항을 실행 취소해야합니다. 가능하다면 복원하십시오.

Docker를 사용하면 응용 프로그램을 필요한 라이브러리와 함께 자체 컨테이너에 묶은 다음 전체 컨테이너를 단일 단위로 승격시키는 것이 좋습니다.

  1. 커널을 제외하고 패치와 라이브러리는 동일합니다.
  2. 일반적으로 구성을 단순화하는 컨테이너 당 하나의 응용 프로그램 만 있습니다.
  3. 백 아웃은 컨테이너를 중지하고 삭제하는 것으로 구성됩니다.

따라서 VM과 함께 가장 근본적인 수준에서 응용 프로그램과 Docker로 디스크 종속성을 홍보하는 반면 Docker를 사용하면 모든 것을 한 번에 홍보 할 수 있습니다.

예, Kubernetes 또는 Docker Swarm과 같은 도구가 작업을 크게 단순화하더라도 컨테이너 관리 문제를 포함합니다.






Related