我试图理解 Docker 概念,但我无法理解一件事:
据我了解,镜像(即容器)可以从不同的 Linux 发行版实例化,例如 Ubuntu、CentOS 等。
假设我在主机上运行标准 Ubuntu 14.04,
- What happens if I use container that is not instantiated from same distributive?
- 不是14.04?
- 不是 Ubuntu(或任何其他基于 Debian 的系统)?
- 使用您使用的图像的不同基础图像有什么缺点? (假设我使用使用Ubuntu作为基础镜像的镜像A,使用Debian作为基础镜像的镜像B以及使用CentOS作为基础镜像的镜像C)?
额外问题:如果开发人员未在 Docker 中心描述中指定镜像,我如何判断镜像使用的基础镜像?
先感谢您!
Docker 确实not使用 LXC(不自 Docker 0.9 起 https://blog.docker.com/2014/03/docker-0-9-introducing-execution-drivers-and-libcontainer/)但是 libcontainer (现在runc https://github.com/opencontainers/runc),一个内置的执行驱动程序,用于操作命名空间、控制组、功能、apparmor 配置文件、网络接口和防火墙规则 - 所有这些都以一致且可预测的方式进行,并且不依赖于 LXC 或任何其他用户层包。
docker 镜像代表一组文件,winch 将作为容器在自己的内存、磁盘和用户空间中运行,同时访问主机内核。
这与 VM 不同,VM 不访问主机内核,而是通过其自身的硬件/软件堆栈包含自己的硬件/软件堆栈。管理程序 https://en.wikipedia.org/wiki/Hypervisor.
容器只需在主机中设置限制(磁盘、内存、CPU)。实际的虚拟机必须构建一个全新的主机。
该 docker 镜像(文件组)可以是任何东西,只要:
- 它不依赖于主机库(因为它被隔离在自己的磁盘空间中,因此它无法访问主机文件,除非已安装卷 https://docs.docker.com/engine/tutorials/dockervolumes/#/mount-a-host-directory-as-a-data-volume)
- 它只执行系统调用:请参阅“Docker 中的共享内核是什么意思? https://stackoverflow.com/a/32757109/6309"
这意味着图像可以是anything:另一个 Linux 发行版,甚至是单个可执行文件。任何可执行文件在 go 中编译(https://golang.org/ https://golang.org/)例如,可以打包在自己的 docker 镜像中,无需任何 Linux 发行版:
FROM scratch
COPY my_go_exe /
ENTRYPOINT /my_go_exe
scratch
是“空”映像,并且 go 可执行文件是静态链接的,因此它是独立的,仅依赖于对内核的系统调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)