在同一台主机上安全使用多个docker容器,就像隔离的实例一样

我知道,多个Docker容器可以在同一个主机中使用,但是它们可以像隔离的实例一样安全地使用吗? 我想运行多个安全和沙箱容器,以便容器不会影响或访问其他容器。

例如,我可以服务nginx和Apache的容器,听不同的端口,完全相信每个容器只能访问自己的文件,资源等?

文件系统隔离(以及内存和进程隔离)是Docker容器的核心function,基于Linux内核function 。

但是如果您想完全确定,则可以将容器部署到不同的节点上(每个节点都由自己的docker守护进程pipe理),每个节点都是主机上的VM(虚拟机),以确保完整的沙箱。
然后,一个docker群或Kubernetes将能够编排这些节点和它们的容器,并使它们进行通信。

当你只有几个链接的容器时,这通常是不需要的:它们应该能够被一个docker守护进程隔离pipe理。 您可以使用用户名称空间进行额外的隔离。

另外,使用节点来分离容器意味着不同的机器或同一台机器内的不同虚拟机。
与虚拟机和容器最大的区别是虚拟机会抢占资源(分配一个固定的最小数量的磁盘/内存/ CPU),这意味着你不能启动一个虚拟机,每个容器一个虚拟机。 与单个docker实例相反,如果一个容器没有任何操作,那么根本不会消耗太多的磁盘空间/内存/ CPU。

从某种意义上讲,你是用集装箱来问百万美元的问题,而且很清楚,恕我直言,对于“平台/技术足够安全”这个问题,没有黑白的答案。 关于集装箱安全的创业公司名单(更不用说他们收到的资金数额)是一个相当大的(也是重要的)问题!

正如另一个答案所指出的那样,容器的隔离是通过各种各样的Linux内核function(名称空间和cgroups)来实现的,为这些function增加更多的安全性是seccomp,apparmor(或SELinux),用户命名空间或它安装在容器运行时间和节点上的一般强化(例如,通过CIS基准指南 )。 开箱即用的默认安装和默认运行时参数可能不足以一般信任Linux的内核隔离原语。 但是,这很大程度上取决于您在容器工作负载中运行的信任级别 。 例如,这是否在一个组织内? 工作量是否可以从外部来源提交? 显然,可能性的范围可能会大大影响你的信任度。

如果您的用例可能很窄(例如,您提到了来自nginx或apache的web服务内容),并且您愿意做一些工作来处理基本映像创build,最小化和强化; 添加到一个 – --readonly根文件系统和限制apparmor和seccompconfiguration文件的function,绑定安装在内容服务+可写区域,没有可执行的用户的可执行文件和所有权 – 所有这些东西在一起可能足够用于特定用途案件。

但是,不能保证当前未知的安全转义将来会成为Linux容器的“0day”,从而导致轻量化虚拟化的推广,通过hyper.sh中的垫片将容器隔离与实际的硬件级虚拟化结合起来。 英特尔清除容器 ,作为两个例子。 在完全虚拟化的操作系统与另一个容器运行时间之间运行,以及在单个节点上使用单个守护进程信任内核隔离,这是一个愉快的过程。 添加这个隔离层仍然存在性能成本和内存开销,但是它远远低于完全虚拟化的操作系统,并且工作继续使性能影响降低。

有关调整容器安全性的所有“旋钮”的更深层次的信息,去年我多次提交的演示文稿都可以在slideshare上获得 ,也可以通过 Skillsmatter的video获得。

Aaron Grattafiori的令人难以置信的彻底“ 理解和加强Linux容器 ”也是一个很好的资源,详细的许多相同的主题。