Docker 容器不需要操作系统和虚拟机管理程序,因为它们使用主机内核。那么为什么所有的官方镜像(例如:php、nginx 等)都在其镜像中使用操作系统:
示例:PHP 7 官方镜像(来自 Docker Hub)正在使用 Debian:
FROM debian:jessie
应用程序容器不是虚拟机,并且提供进程隔离,而不是操作系统隔离。
我的理解中是否遗漏了一些重要的东西?
答案1
操作系统不仅仅是一个内核;它还不仅仅是一个内核。它是一个内核加上用户空间中的大量文件。所以像/bin
and/etc
和/usr/bin
and中的文件/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/)