cgroup和命名空间在容器生态系统中扮演着重要角色。
命名空间提供了一个隔离层。每个容器在一个单独的命名空间中运行,其访问权限仅限于该命名空间。cgroup控制每个容器的资源利用率,而namespace控制进程可以看到和访问相应资源的内容。
以下是您对解决方案方法的基本理解,
使用网络命名空间
当容器从映像中派生时,将定义并创建网络接口。这将为容器提供唯一的IP地址和接口。
$ docker run -it alpine ifconfig
通过将名称空间更改为主机,cotainers网络不会与其接口保持隔离,进程将可以访问主机网络接口。
$ docker run -it --net=host alpine ifconfig
如果进程侦听端口,它们将在主机接口上侦听并映射到容器。
使用PID命名空间
通过更改pid名称空间,容器可以与超出其正常范围的其他进程交互。
此容器将在其自己的命名空间中运行。
$ docker run -it alpine ps aux
通过将命名空间更改为主机,容器还可以看到系统上运行的所有其他进程。
$ docker run -it --pid=host alpine ps aux
共享命名空间
在生产环境中这样做是一种不好的做法,因为您正在打破容器安全模型,这可能会打开漏洞,并且容易访问窃听器。这仅仅是为了调试工具和理解容器安全中的漏洞。
第一个容器是nginx服务器。这将创建一个新的网络和进程命名空间。此容器将自身绑定到新创建的网络接口的端口80。
$ docker run -d --name http nginx:alpine
另一个容器现在可以重用这个名称空间,
$ docker run --net=container:http mohan08p/curl curl -s localhost
此外,此容器可以看到与共享容器中的进程的接口。
$ docker run --pid=container:http alpine ps aux
这将允许您授予容器更多权限,而无需更改或重新启动应用程序。以类似的方式,您可以连接到主机上的mysql,运行并调试您的应用程序。但是,不建议这样走。希望有帮助。