Docker와 일반 가상 머신의 차이점은 무엇입니까?



Answers

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

출처 : https://www.docker.com/what-container#/package_software

Question

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

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




관련하여 : -

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

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

  1. 개별 개발자 PC
  2. 공유 된 개발자 환경
  3. 개별 테스터 PC
  4. 공유 테스트 환경
  5. 품질 보증 환경
  6. UAT 환경
  7. Load / performance testing
  8. Live staging
  9. 생산
  10. 아카이브

There are also the following factors to consider:

  • Developers, and indeed testers, will all have either subtlely or vastly different PC configurations, by the very nature of the job
  • Developers can often develop on PCs beyond the control of corporate or business standardisation rules (eg freelancers who develop on their own machines (often remotely) or contributors to open source projects who are not 'employed' or 'contracted' to configure their PCs a certain way)
  • Some environments will consist of a fixed number of multiple machines in a load balanced configuration
  • Many production environments will have cloud-based servers dynamically (or 'elastically') created and destroyed depending on traffic levels

As you can see the extrapolated total number of servers for an organisation is rarely in single figures, is very often in triple figures and can easily be significantly higher still.

This all means that creating consistent environments in the first place is hard enough just because of sheer volume (even in a green field scenario), but keeping them consistent is all but impossible given the high number of servers, addition of new servers (dynamically or manually), automatic updates from o/s vendors, anti-virus vendors, browser vendors and the like, manual software installs or configuration changes performed by developers or server technicians, etc. Let me repeat that - it's virtually (no pun intended) impossible to keep environments consistent (okay, for the purist, it can be done, but it involves a huge amount of time, effort and discipline, which is precisely why VMs and containers (eg Docker) were devised in the first place).

So think of your question more like this "Given the extreme difficulty of keeping all environments consistent, is it easier to deploying software to a docker image, even when taking the learning curve into account ?" . I think you'll find the answer will invariably be "yes" - but there's only one way to find out, post this new question on .




이 게시물을 통해 우리는 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 모두 개별적인 존재와 중요성을 가지고 있습니다.




가상화와 컨테이너가 낮은 수준에서 어떻게 작동하는지 이해하는 것이 도움이 될 수 있습니다. 그것은 많은 것을 정리할 것입니다.

참고 : 아래에서 설명하는 부분을 단순화합니다. 자세한 내용은 참고 문헌을 참조하십시오.

낮은 수준의 가상화는 어떻게 작동합니까?

이 경우 VM 관리자는 CPU 링 0 (또는 최신 CPU에서는 "루트 모드")을 대신 받아 게스트 OS가 만든 모든 권한있는 호출을 가로 채어 게스트 OS에 자체 하드웨어가 있다는 환상을 만듭니다. 재미있는 사실 : 1998 년 이전에는 이런 종류의 가로 채기를 할 방법이 없었기 때문에 x86 아키텍처에서 이것을 달성하는 것이 불가능하다고 생각되었습니다. VMWare의 사람들은 이것을 달성하기 위해 게스트 OS의 권한있는 호출을 위해 메모리의 실행 가능한 바이트를 다시 작성하는 아이디어를 가진 사람이 처음 입니다.

실제 효과는 가상화를 사용하여 동일한 하드웨어에서 완전히 다른 두 개의 OS를 실행할 수 있다는 것입니다. 각 게스트 OS는 부트 스트랩, 커널로드 등의 모든 과정을 거칩니다. 예를 들어 게스트 OS가 호스트 OS 또는 다른 게스트에 대한 전체 액세스 권한을 얻지 못하고 일을 망칠 수없는 경우와 같이 매우 엄격한 보안을 유지할 수 있습니다.

컨테이너가 낮은 수준에서 작동하는 방법?

2006 경에 Google의 일부 직원을 포함한 사람들은 이름 공간 이라는 새로운 커널 수준 기능을 구현했습니다 (이전 에는 FreeBSD에 존재 했었지만 ). OS의 한 기능은 네트워크 및 디스크와 같은 글로벌 리소스를 프로세스에 공유 할 수있게하는 것입니다. 이러한 글로벌 리소스가 동일한 네임 스페이스에서 실행되는 프로세스에만 표시되도록 네임 스페이스에 래핑 된 경우 어떻게해야합니까? 예를 들어 디스크 덩어리를 가져 와서 네임 스페이스 X에 넣은 다음 Y 네임 스페이스에서 실행중인 프로세스는 볼 수 없거나 액세스 할 수 없습니다. 마찬가지로 네임 스페이스 X의 프로세스는 네임 스페이스 Y에 할당 된 메모리의 항목에 액세스 할 수 없습니다. 물론 X의 프로세스는 네임 스페이스 Y의 프로세스를 보거나 말할 수 없으므로 전역 리소스에 대한 가상화 및 격리를 제공합니다. 이것은 도커가 작동하는 방식입니다. 각 컨테이너는 자체 네임 스페이스에서 실행되지만 다른 모든 컨테이너 정확히 동일한 커널을 사용합니다. 고립은 커널이 프로세스에 할당 된 네임 스페이스를 알고 API 호출 중에 프로세스가 자체 네임 스페이스의 리소스에만 액세스 할 수 있도록하기 때문에 발생합니다.

컨테이너 대 VM의 한계가 분명해야합니다. VM과 같이 컨테이너에서 완전히 다른 OS를 실행할 수는 없습니다. 그러나 동일한 커널을 공유하기 때문에 Linux의 다른 배포판을 실행할 수 있습니다 . 격리 수준은 VM에서만큼 강력하지 않습니다. 사실 "게스트"컨테이너가 초기 구현에서 호스트를 대신 할 수있는 방법이있었습니다. 또한 새 컨테이너를로드 할 때 VM의 경우처럼 운영 체제의 전체 복사본이 시작되지 않음을 알 수 있습니다. 모든 컨테이너 는 동일한 커널을 공유합니다 . 이것이 컨테이너가 가벼운 이유입니다. 또한 VM과 달리 컨테이너의 메모리를 미리 할당 할 필요가 없습니다. 운영 체제의 새 복사본을 실행하지 않기 때문입니다. 이를 통해 하나의 OS에서 수천 개의 컨테이너를 실행하면서 샌드 박스화할 수 있습니다.이 컨테이너는 자체 VM에서 별도의 OS 사본을 실행하는 경우 불가능할 수도 있습니다.




Simple answer to your question is:-

You wanted to know, Difference between Virtual Machine and Docker

Basic Concept: Docker is a container based virtualization, with the help of which we can create containers and deploy our applications onto the containers. So the major key point to remember here is - Docker uses the same OS kernel for running "n" number of containers on that server host. whereas, If you use Virtualization you can create "n" number of virtual machines (based on capacity of your host) and install OS for that VM and then run/deploy your application on that VM.

Size & Capacity: If you create VM and install linux on that VM, its base setup would probably going to eat up around 8 to 16 Gb of your machine (Linux Image itself is 4 to 6Gb) If you install Docker on your hosts - you would be able to spin up Linux container in very few time and that would practically take 200-500 Mb of space of your host

Time Creating VM, Installing images and making the VM ready will take atleast 1 hrs (as per my experience) whereas Docker can make your linux container ready in 5 to 10 mins max; rather much less than that (considering you have good network speed)




There are three different setups that providing a stack to run an application on (This will help us to recognize what a container is and what makes it so much powerful than other solutions):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) Traditional server stack consist of a physical server that runs an operating system and your application.

Advantages:

  • Utilization of raw resources

  • Isolation

Disadvantages:

  • Very slow deployment time
  • 비싼
  • Wasted resources
  • Difficult to scale
  • Difficult to migrate
  • Complex configuration

2) The VM stack consist of a physical server which runs an operating system and a hypervisor that manages your virtual machine, shared resources, and networking interface. Each Vm runs a Guest Operating System, an application or set of applications.

Advantages:

  • Good use of resources
  • Easy to scale
  • Easy to backup and migrate
  • Cost efficiency
  • 적응성

Disadvantages:

  • Resource allocation is problematic
  • Vendor lockin
  • Complex configuration

3) The Container Setup , the key difference with other stack is container-based virtualization uses the kernel of the host OS to rum multiple isolated guest instances. These guest instances are called as containers. The host can be either a physical server or VM.

Advantages:

  • Isolation
  • Lightweight
  • Resource effective
  • Easy to migrate
  • 보안
  • Low overhead
  • Mirror production and development environment

Disadvantages:

  • Same Architecture
  • Resource heavy apps
  • Networking and security issues.

By comparing the container setup with its predecessors, we can conclude that containerization is the fastest, most resource effective, and most secure setup we know to date. Containers are isolated instances that run your application. Docker spin up the container in a way, layers get run time memory with default storage drivers(Overlay drivers) those run within seconds and copy-on-write layer created on top of it once we commit into the container, that powers the execution of containers. In case of VM's that will take around a minute to load everything into the virtualize environment. These lightweight instances can be replaced, rebuild, and moved around easily. This allows us to mirror the production and development environment and is tremendous help in CI/CD processes. The advantages containers can provide are so compelling that they're definitely here to stay.




Docker는 응용 프로그램을 모든 종속성으로 캡슐화하고 가상화 도구는 베어 메탈 시스템에서 정상적으로 실행할 수있는 모든 응용 프로그램을 실행할 수있는 운영 체제를 캡슐화합니다.




There are many answers which explain more detailed on the differences, but here is my very brief explanation.

One important difference is that VMs use a separate kernel to run the OS . That's the reason it is heavy and takes time to boot, consuming more system resources.

In Docker, the containers share the kernel with the host; hence it is lightweight and can start and stop quickly.

In Virtualization, the resources are allocated in the beginning of set up and hence the resources are not fully utilized when the virtual machine is idle during many of the times. In Docker, the containers are not allocated with fixed amount of hardware resources and is free to use the resources depending on the requirements and hence it is highly scalable.

Docker uses UNION File system .. Docker uses a copy-on-write technology to reduce the memory space consumed by containers. Read more here




Links