暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

容器技术原理:从原理层面解释Docker日常使用中遇到的问题

一叶扁舟 2021-10-22
1187

image.png

1、为什么实际占用空间比每个镜像的总和要小?

【现象复现】

当我安装了2个镜像,查看镜像,累积14.75G

[root@ora ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE oracle_18c latest 652ea48864d4 8 hours ago 8.74GB container-registry.oracle.com/database/express latest 364598d20118 18 months ago 6.01GB

查看磁盘占用:却只有9G

[root@ora ~]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/vda1 99G 9G 90G 9% /

【原理解释】

rootfs 的基础上,Docker 公司结合UnionFS创新性地提出了使用多个增量 rootfs 联合挂载一个完整 rootfs 的方案,这就是容器镜像中“层”的概念。而共享层的存在,可以使得所有这些容器镜像需要的总空间,也比每个镜像的总和要小。


2、为什么在写DockerFile的时候不能有两个CMD?

【现象复现】

我想做一个镜像,既有mysql的功能,又能用ssh连接,那么我第一想法就是使用两个CMD,分别启动mysql进程和ssh进程

FROM biarms/mysql:5.7.33-beta-circleci # 略一堆命令 CMD ["mysqld"] CMD ["sh", "ssh.sh"] # 这里由于编写了一个启动脚本所以直接执行该脚本

很遗憾,并不能实现我所想,因为只能同时又1个CMD,后面的会覆盖掉前面的

【原理解释】

由于我们从容器技术原理: Linux 容器最基本的实现原理可以了解到,容器实际上就是一个进程,然后对该进程进行各种限制隔离,从而形成容器,也就是说整个容器中主进程只能有1个,其他进程都是主进程的子进程,因此,Docker也采用了"单进程模型",而CMD是容器的主进程,因此不能多个。


3、为什么要做资源限制?

【原理解释】

容器技术原理:隔离与限制文中对为何做资源限制描述可知:由于容器是宿主机上的一个进程,那么其与宿主机上其他所有进程之间依然是平等的竞争关系,因此为了避免容器消耗过多的宿主机资源,我们可以使用Cgroups对容器进行cpu、内存等限制。


4、为什么在arm上打的镜像在x86上不能用

【现象描述】

在arm的服务器执行docker build命令构建了一个镜像,通过docker save打包镜像,在另外一台arm内核的服务器上执行docker load,再执行docker run,是可以正常启动的,但是我在一台x86的服务器上执行docker load,再执行docker run,无法正常启动。

【原理解释】

容器技术原理:隔离与限制文中对隔离的局限性的描述可知:既然容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。尽管,你在Linux的宿主机上,通过 Mount Namespace 单独挂载其他不同版本的操作系统文件,比如 CentOS 或者 Ubuntu,形成与宿主机不同的操作系统,但是,这并不能改变共享宿主机内核的事实。也就是说,我在arm上构建的镜像,他是要依赖arm的内核的,我放在x86上执行,是无法正常启动的。






持续更新。。。。
最后修改时间:2021-10-22 21:39:43
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论