
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上执行,是无法正常启动的。
持续更新。。。。




