我试图了解Docker的概念,但有一点我无法理解:
据我所知,图像(因此 - 容器)可以从不同的Linux发行版中实例化,例如Ubuntu,CentOS等。
让我们在主机上说我运行标准的Ubuntu 14.04,
额外问题:如果开发人员未在Docker集线器描述中指定图像,如何判断用于图像的基本图像?
提前谢谢!
答案 0 :(得分:6)
Docker 不使用LXC(不是since Docker 0.9)而是使用libcontainer(现在 runc
),这是一个操作命名空间的内置执行驱动程序,控制组,功能,apparmor配置文件,网络接口和防火墙规则 - 所有这些都以一致且可预测的方式进行,并且不依赖于LXC或任何其他用户空间包。
docker镜像表示winch将在访问主机内核时作为自己的内存,磁盘和用户空间中的容器运行的一组文件。
这与VM不同,VM不访问主机内核,但通过其hypervisor包含自己的硬件/软件堆栈。
容器只需在主机中设置限制(磁盘,内存,CPU)。实际的VM必须构建一个全新的主机。
该docker镜像(文件组)可以是任何东西,只要:
这意味着图像可以是任何:另一个Linux发行版,甚至是一个可执行文件。例如,go(https://golang.org/)中的任何可执行编译都可以打包在自己的docker镜像中,而不需要任何Linux发行版:
$( "div img:last-child" )
FROM scratch
COPY my_go_exe /
ENTRYPOINT /my_go_exe
是“空”图像,go可执行文件是静态链接的,因此它是自包含的,只依赖于对内核的系统调用。
答案 1 :(得分:5)
主机操作系统和docker容器之间共享的主要内容是内核。从不同的发行版/版本运行docker容器的主要风险是它们可能依赖于主机系统上不存在的内核功能,例如,如果容器需要比主机安装的更新的内核。
理论上,Linux内核是向后兼容的。只要主机内核比容器内核更新,它就应该工作。
从操作角度来看,每次开始依赖于不同的基本映像,这是您需要监视更新和安全问题的另一个依赖项。在发现下一个大漏洞时,对一个分发进行标准化可以减少运营团队的工作量。
答案 2 :(得分:1)
Docker使用LXC,这是一种操作系统级虚拟化方法,用于使用单个Linux内核在控制主机上运行多个隔离的Linux系统(容器)。
您可以将其与计算机上的VM进行比较,然后启动另一个Linux发行版,该发行版不必与主机操作系统相同。因此,如果您的主机操作系统与容器的基本映像相同,则无关紧要。
在Docker中,容器是从图层构建的。 Dockerfile中的每个步骤(命令)代表一个层,它们一个接一个地应用。第一步是应用基础OS层,由FROM
表示。
因此,要回答您的红利问题,您可以查看您正在使用的容器的Dockerfile
(这是DockerHub上的第三个选项卡),并在第一个语句中看到,这是基本图像( OS)。