Docker 컨테이너는 호스트 커널을 사용하므로 운영 체제와 하이퍼바이저가 필요하지 않습니다. 그렇다면 모든 공식 이미지(예: php, nginx 등)가 이미지에 운영 체제를 사용하는 이유는 무엇입니까?
예: Debian을 사용하는 PHP 7 공식 이미지(Docker Hub에서):
FROM debian:jessie
애플리케이션 컨테이너는 가상 머신이 아니며 운영 체제 격리가 아닌 프로세스 격리를 제공합니다.
내 이해에서 중요한 것을 놓치고 있습니까?
답변1
운영 체제는 단순한 커널 그 이상입니다. 이는 커널과 사용자 공간에 있는 파일 묶음입니다. 따라서 /bin
and /etc
및 /usr/bin
in 및 같은 파일은/lib
컨테이너를 실행할 때 일반적으로 프로그램을 실행하려면 지원 코드(공유 라이브러리, 스크립트)가 필요합니다.
항상 필요한 것은 아닙니다. 예를 들어, 프로그램을 작성하는 데 사용하는 경우 go
단일 파일 외에는 아무것도 없습니다.
$ cat hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World")
}
$ go build hello.go
$ strip hello
이제 dockerfile은 다음과 같습니다.
FROM scratch
COPY hello /
CMD ["/hello"]
사소한 경우입니다. 이는 단지 하나의 예일 뿐입니다.
하지만 을 실행하려고 하면 php
모든 종속성을 알고 있습니까? 때로는 공통 운영 체제의 최소한의 복사본을 도입하는 것이 더 쉽습니다. 그러나 일부 보안 위험이 있습니다.
(당신은 또한 볼 수 있습니다https://www.sweharris.org/post/2016-06-04-small-container/)