CGroups和Namespaces在容器生态系统中发挥着重要作用。
命名空间提供了一层隔离。每个容器都在一个单独的命名空间中运行,其访问权限仅限于该命名空间。Cgroups控制每个容器的资源利用率,而Namespace控制进程可以看到和访问相应资源的内容。
以下是您可以遵循的解决方案方法的基本理解,
使用网络命名空间
当容器从图像中产生时,将定义并创建网络接口。这为容器提供了唯一的IP地址和接口。
$ docker run -it alpine ifconfig
通过将名称空间更改为主机,陪护者网络不会与其接口保持隔离,进程将可以访问主机网络接口。
$ 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,运行并调试应用程序。但是,不建议这样做。希望有帮助。