컨테이너에 게스트 OS가없는 경우 Docker와 함께 OS 기본 이미지를 사용하는 이유는 무엇입니까?


83

방금 Docker를 공부하기 시작했으며 꽤 혼란 스럽습니다. Docker의 웹 사이트에서 읽은 것처럼 컨테이너는 가상 컴퓨터와 다릅니다. 알다시피 컨테이너는 샌드 박스 일 뿐이며 격리 된 전체 파일 시스템이 실행됩니다.

또한 컨테이너에 게스트 OS가 설치되어 있지 않다는 것을 읽었습니다. 대신 기본 OS 커널에 의존합니다.

이 모든 것이 좋습니다. 내가 혼란스럽게하는 것은 운영 체제의 이름을 딴 Docker 이미지가 있다는 것입니다. 우분투, 데비안, 페도라, CentOS 등과 같은 이미지가 있습니다.

내 요점은 : 그 이미지는 무엇입니까? 가상 머신을 생성하고 데비안을 설치하는 것과 데비안 이미지를 기반으로 컨테이너를 생성하는 것은 어떻게 다른가요?

컨테이너에는 게스트 OS가 설치되어 있지 않다고 생각했지만 이미지를 만들 때 하나의 OS 이름을 가진 이미지를 기반으로합니다.

또한 내가 할 때 본 예제에서 docker run ubuntu echo "hello world"우분투로 VM을 회전시켜 명령을 실행시키는 것처럼 보입니다 echo "hello world".

우리가 할 때와 같은 방식 docker run -it ubuntu /bin/bash으로 우분투로 VM을 회전시키고 명령 줄을 사용하여 VM에 액세스하는 것 같습니다.

어쨌든 운영 체제의 이름을 따서 명명 된 이미지는 무엇입니까? 해당 이미지 중 하나를 사용하여 컨테이너를 실행하고 해당 게스트 OS로 VM을 회전시키는 것이 얼마나 다른가?

우리는 아이디어가 바로 호스트 OS와 커널을 공유 (결과적으로 우리는 하드웨어를 가상화 할 필요없이, 기본 시스템 하드웨어 리소스에 액세스 할 수 있습니다)하지만, 여전히 위해 용기에 각각 다른 시스템의 파일과 바이너리를 사용 우리가 실행하려는 응용 프로그램을 지원하기 위해?


2
제 생각에는 가상화의 목표가 핵심입니다. OS에서 라이브러리, 언어 등이 필요한 경우 OS 컨테이너가 필요에 적합합니다. 그러나 구성 요소로 응용 프로그램 만 필요한 경우 OS를 기본 이미지로 사용할 필요는 없습니다. 나는이 기사가 그것을 명확하게 설명 할 수 있다고 생각한다. blog.risingstack.com/…
변태

답변:


68

모든 Linux 배포판은 동일한 (아주 약간 단순화 된) Linux 커널을 실행하고 사용자 소프트웨어에서만 차이가 있기 때문에 해당 사용자 소프트웨어를 설치하고 다른 배포본을 가장하여 다른 배포 환경을 시뮬레이트하는 것은 매우 쉽습니다. 구체적으로 Ubuntu OS에 CentOS 컨테이너를 설치한다는 것은 다른 커널 인스턴스가 아니라 동일한 커널을 계속 실행하면서 CentOS에서 사용자 영역을 얻는다는 것을 의미합니다.

따라서 가벼운 가상화는 동일한 OS 내에 격리 된 구획이있는 것과 같습니다. Au contraire real virtualization은 호스트 OS 내부에 또 다른 본격적인 OS를 보유하고 있습니다. 따라서 docker는 Linux 내에서 FreeBSD 또는 Windows를 실행할 수 없습니다.

그것이 더 쉽다면, docker는 일종의 매우 정교하고 진보 된 chroot 환경이라고 생각할 수 있습니다.


3
그래서 컴파일 된 코드가 커널 만 필요하기 때문에 컴파일 된 golang 코드를 빈 스크래치 컨테이너에 호스팅 할 수있는 이유는 무엇입니까?
Francis Norton

그렇다면 게스트 OS는 어떻게 호스트 OS의 커널을 사용하는지 어떻게 알 수 있습니까? 도커 이미지베이스 인 AFAIK는 표준 OS 이미지를 사용합니다. 귀하의 예에서, 그것은 부모의 커널을 사용하는 것을 알고있는 사용자 정의 CentOS 빌드와 같지 않습니까? 또는 Docker가 손님 (CentOS ') 읽기를 / boot를 호스트 (Ubuntu)로 리디렉션하는 파일 시스템 (aufs) 트릭만큼 간단합니까? 이 경우 게스트 (CentOS)는 자체 / boot 복사본을 설치하지만 읽지 못했습니까?
James S

나는 당신의 설명을 좋아하지만 Windows에서 Linux 컨테이너를 실행하는 방법을 어떻게 설명합니까? Docker를 사용할 수 있도록 Server 2016 및 Windows 10에 Linux 커널이 포함되어 있습니까? 그 버전이 필요한 이유입니까?
duct_tape_coder

이것은 간단합니다. 기본 Linux VM에서 docs.microsoft.com/en-us/virtualization/windowscontainers/… 와 같은 Hyper-V의 완전한 가상화 스택에서 실행됩니다 .
drookie

1

컨테이너는 단일 커널에서 실행됩니다. 즉, 모든 컨테이너에는 단일 커널 (호스트 OS)이 있습니다. 반면 하이퍼 바이저에는 여러 개의 커널이 있습니다. 각 가상 머신은 다른 커널에서 실행됩니다.

"docker run ubuntu"는 chroot 환경을 만드는 것과 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.