docker依赖的linux内核特性,docker镜像能跨平台运行吗?不一定

首先有一个前提:

docker在各平台上的运行机制
LINUX:docker在linux上共享内核,无需虚拟化,完全支持native功能。所以只能创建linux类docker。

Windows:docker在windows上,启用Hyper-V或者虚拟化技术(通过虚拟机来实现,不共享windows内核)。可以创建linux类docker和Windows类docker。

Mac:docker在mac os上,同样用虚拟化技术xhyve或者virtualbox来实现,不共享mac os内核。只能创建linux类docker,不能创建Mac OSX的docker。

只要系统架构一样,是可以使用相同的镜像的 ,比如x86的镜像只能x86的系统使用,arm的镜像只能arm系统使用。docker镜像对容器而言只是模拟了一个环境,跟宿主机没多大关系
有些程序依赖于系统内核,比如说sh,这就会导致依赖系统内核的程序在不同的linux环境中可能运行不起来
常考一下网友的观点:
https://www.nuomiphp.com/t/61b9600957f4a154cc7bebea.html
https://www.cnblogs.com/kumata/p/14108646.html
centos6.0的sh没法在centos7.0运行,这就会导致在6.0打的镜像在7.0运行时启动不起来

docker依赖的内核特性
docker依赖于Linux的四个内核特性:

Namespaces:命名空间
Control groups(cgroups):控制组
unionFS:联合文件系统
rootfs:系统根目录文件

Namespaces

命名空间提供了一种系统资源的隔离,包括了文件系统、网络、进程等。docker有5种命名空间:

PID:进程隔离
NET:网络管理接口
IPC:管理跨进程通信访问
MNT:管理挂载点
UTS:隔离内核和版本标识

Control groups

这是Linux内核提供的一种可以限制,记录,隔离物理进程组的机制。他提供了以下功能:

资源限制
优先级设定
资源计量
资源控制
docker容器能力
Namespaces和Control groups带给了容器下面的能力:

文件系统的隔离:每个容器都有自己的root文件系统
进程隔离:每个容器都运行在自己的进程环境中
网络隔离:每个容器间虚拟网络接口和ip地址都是分开的
资源隔离和分组:Control groups可以将CPU和内存之类的资源独立分配给每个docker容器

Union File System

2004年由纽约州立大学石溪分校开发,它可以把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的

rootfs

rootfs 是Docker 容器在启动时内部进程可见的文件系统,即Docker容器的根目录。rootfs通常包含一个操作系统运行所需的文件系统,例如可能包含经典的类Unix操作系统中的目录系统,如/dev、/proc、/bin、/etc、/lib、/usr、/tmp及运行Docker容器所需的配置文件、工具等。
在传统的linux操作系统内核启动时,首先挂载一个只读(read-only)的rootfs,当系统检测器完整性之后,再将其切换为读写(read-write)模式。而在Docker架构中,当Docker daemon 为Docker容器挂载rootfs时,沿用的Linux内核启动时的方法,即将rootfs设为只读模式。在挂载完毕之后,利用联合挂载(union mount)技术在已有的只读rootfs上再挂载一个读写层。这样,可读写层处于Docker容器文件系统的最顶层,其下可能联合挂载了多个只读层,只有在Docker容器运行过程中文件系统发生变化是,才会把变化的文件内容写到可读写层,并且隐藏只读层中的老版本文件。
rootfs只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在Linux操作系统中,这两部分是分开存放的,操作系统只有在开机启动时才会加载指定版本的内核镜像。正是由于rootfs的存在,容器才有了一个被反复宣传至今的重要特性:一致性。由于rootfs里打包的不只是应用,而是整个操作系统的文件和目录,也就意味着,应用以及它运行所需要的所有依赖,都被封装在了一起。
有了容器镜像“打包操作系统”的能力,这个最基础的依赖环境也终于变成了应用沙盒的一部分。这就赋予了容器所谓的一致性:无论在本地、云端,还是在一台任何地方的机器上,用户只需要解压打包好的容器镜像,那么这个应用运行所需要的完整的执行环境就被重现出来了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这可能是因为您在Windows上构建了Docker映像,并在Linux上尝试运行它。由于Windows和Linux有不同的文件系统和内核,因此可能会导致某些问题。 在使用Docker构建映像时,请注意以下几点: 1. 确保您使用的基础映像与您的操作系统兼容。例如,如果您正在运行Linux,应使用Linux基础映像。 2. 如果您使用的是Windows主机,请确保在构建映像时使用Windows容器而不是Linux容器。您可以在Dockerfile中使用以下指令来指定容器类型: ``` # 使用Windows容器 FROM mcr.microsoft.com/windows/servercore:ltsc2019 # 使用Linux容器 FROM ubuntu:18.04 ``` 3. 如果您在Windows主机上构建Docker映像,并想要在Linux运行它,请确保在构建Docker映像时使用正确的行尾符。Windows使用回车符(CR)和换行符(LF)作为行尾符,而Linux只使用换行符(LF)作为行尾符。因此,在Dockerfile中,您应该使用LF作为行尾符,否则可能会导致在Linux运行时出现问题。 4. 确保在构建映像时使用与目标平台相同的CPU架构。例如,如果您的Linux服务器是基于ARM的,则应使用ARM架构构建映像。 希望这些提示可以帮助您解决问题。 ### 回答2: Windows打包的Docker镜像无法直接在Linux系统中运行,这是因为Windows和Linux有不同的操作系统架构和运行环境。 首先,Windows和Linux使用的是不同的操作系统内核。Windows使用NT内核,而Linux使用Linux内核。这两种内核的架构和功能有很大的区别,导致两者无法直接互通。 其次,在Docker镜像中,容器内运行的应用程序需要与宿主机的操作系统相兼容。因为Windows和Linux的操作系统架构和API接口不同,Docker镜像在Windows上构建的时候,使用的是针对Windows操作系统的API接口和依赖库,而在Linux运行时,无法找到这些对应的接口和库,导致无法正确运行。 要在Linux系统中运行Windows打包的Docker镜像,可以考虑以下几种解决方案: 1. 使用基于Linux的容器运行时(如Docker CE),运行一个Windows虚拟机,并在其中运行Windows打包的Docker镜像。这样可以在Linux系统中运行Windows应用程序,但性能和资源消耗可能会受到一定的影响。 2. 重新构建Docker镜像,使其适配Linux操作系统。这意味着需要重新编译和调整应用程序的代码,以兼容Linux操作系统的API接口和依赖库。 3. 在Linux系统上使用Wine等工具,来运行Windows应用程序。Wine是一个开源的Windows兼容层,可以在Linux系统上运行一些Windows应用程序。不过,由于Wine的兼容性有限,无法保证Windows应用程序在Linux上的正常运行。 总之,由于Windows和Linux的操作系统差异,Windows打包的Docker镜像Linux中不能直接运行,需要根据实际情况选择合适的解决方案。 ### 回答3: Windows打包的Docker镜像无法在Linux运行的原因是两个操作系统的核心结构不同。 首先,Windows和Linux使用不同的内核,即Windows使用Windows NT内核,而Linux使用Linux内核。这是两个完全不同的操作系统架构,因此它们在系统调用、进程管理和资源分配等方面存在显著差异。因此,Windows上构建的Docker镜像无法直接在基于Linux的主机上运行,因为两个内核不兼容,无法正确解释和处理像执行文件、系统调用等基本操作的方式。 其次,Windows和Linux使用不同的文件系统。Windows使用NTFS(New Technology File System),而Linux则使用不同的文件系统,例如EXT4。因此,Windows上构建的Docker镜像中的文件和目录路径是基于Windows文件系统结构的,而Linux主机无法正确解释和访问这些路径。 为了解决这个问题,开发人员可以使用跨平台Docker镜像构建工具,例如Docker Compose,来构建在Windows和Linux上均可运行镜像。另外,还可以在Windows上使用Linux子系统进行开发和测试,以确保镜像Linux环境中正常运行。 总而言之,由于Windows和Linux的核心结构、系统调用和文件系统的差异,导致Windows打包的Docker镜像无法在Linux运行,而需要使用适应Linux环境的构建工具和开发环境进行适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值