容器把进程隔离机制与共享 Linux 内核结合起来
常规 Linux 容器通过守护进程所在宿主的 Linux 内核运行进程,并利用命名空间提供选定的隔离视图。镜像文件提供用户态环境,不会给每个容器单独启动一个内核。在 macOS 的 Docker Desktop 中,守护进程和 Linux 容器位于 Linux 虚拟机里,所以容器共享的是该虚拟机内核,而不是 macOS 内核。讨论“宿主”时必须说清楚这一层。 图示普通独立命名空间配置,容器共享守护进程一侧的 Linux 内核;命名空间、资源限制与安全策略解决不同问题。 坏掉的样子 假定每个容器都有独立操作系统内核,会导致错误诊断。如果守护进程所在 Linux 环境缺少某个内核能力,仅换成包含另一发行版用户态文件的镜像,并不会让该能力出现。反过来,升级镜像内的软件包,也不会升级宿主内核。这个区别影响系统调用、内核模块、安全边界和资源统计,不能用容器里显示的发行版名字代替判断。 命名空间隔离可以配置,不是每次部署都完全相同的固定组合。容器可以加入其他网络命名空间、使用宿主网络、共享卷,或者采用不同的用户命名空间映射。看到容器内 UID 为零,也不能直接判断容器外权限;必须结合能力集合、用户映射、安全策略和暴露资源分析。一个数字或名称不足以描述完整安全边界。 localhost 也是常见误区。在独立网络命名空间下,127.0.0.1 指向调用容器自己的回环空间,不会自动到达兄弟服务或开发者电脑。同样,在一个普通容器的可写层创建文件,不会自动出现在使用同一镜像的另一个容器里。排查访问失败时,应先分清地址和文件究竟属于哪一个视图。 快速验证 取得固定的 Python 镜像后,使用宿主 Python 和 Docker 守护进程运行脚本。实测 Docker 为 29.3.1,Docker Desktop 虚拟机内 Linux 为 6.12.76,镜像内 Python 为 arm64 的 3.11.16。两个容器使用相同镜像、不同主机名,并设置无外部网络。结束时只删除这两个临时容器: ...