容器化已成为无条件的行业标准,使我们的应用程序更易于配置和部署。Docker作为最流行的软件,尽管有podman等选项,却成为容器的代名词。但是如果你想在另一个容器中启动一个容器呢?是不是一个很好的选择,如果你根本没有其他方法怎么办?
在本文中,我将介绍我们在本地处理会话的方式。运行这样的会话使开发比在生产中通过计算API更简单。我们可以监控工作人员创建的进程和文件,而无需通过SSH连接到云。此外,使用“tail-f /dev/null”运行容器允许我们更仔细地查看stdout和stderr,而无需检查日志,从而进一步改进调试方式。此外,我们还获得了一些IDE的杀手级功能,例如PyCharm容器调试器。但它的公式可以用一句话来描述。
我们将docker安装在带有主Web应用程序的容器中,并为其提供对域套接字的访问权限,该域套接字默认由docker守护程序侦听。由带有已安装套接字的dockercli 运行:
在 docker-compose.yaml中:
让我们更深入地了解一下这个公式守护进程和套接字的组成部分。
让我们从守护进程开始。这个名字是怎么来的?
在 Unix SystemAdministraTIon Handbook 中,EviNemeth 对守护进程进行了如下说明:
许多人将“daemon”这个词等同于“demon”这个词,暗示着UNIX和黑社会之间存在某种邪恶的联系。这是一个严重的误解。“恶魔”实际上是“恶魔”的一种更古老的形式。守护进程对善恶没有特别的偏见,而是用来帮助定义一个人的性格或个性。古希腊人对“个人守护神”的概念就像现代的“守护天使”概念——eudaemonia是一种被善良的精神帮助或保护的状态。通常,UNIX系统似乎同时充满了守护进程和恶魔。
守护进程通常是在后台观察操作以等待状态、服务于特定子系统并确定整个系统的操作规则的实用程序。例如,一个守护进程被配置为监控打印服务的状态;网络守护进程管理网络连接并监控它们的状态,或者docker 守护进程在您的操作系统上操作容器和图像。顺便说一句,展望未来,dockerd设计是在容器内运行容器的问题。您可以使用终端中的pstree、top或 htop查看终端当前正在运行的守护进程。通常,他们的名字以“d”字母结尾。
我们用来与 dockerd通信的域套接字呢?Unix域套接字,又名 UDS或 IPC套接字(进程间通信套接字),是用于在同一主机操作系统中执行的进程之间交换数据的数据通信端点。它也被它的地址族AF_UNIX 引用。UNIX域中的有效套接字类型是:
SOCK_STREAM(与 TCP相比)——用于面向流的套接字。
SOCK_DGRAM(与 UDP相比)——用于保留消息边界的面向数据报的套接字(与大多数UNIX 实现一样,UNIX域数据报套接字始终可靠且不会重新排序数据报)。
SOCK_SEQPACKET(与 SCTP相比)——用于面向连接的顺序数据包套接字,保留消息边界并按发送顺序传递消息。
Unix 域套接字工具是POSIX 操作系统的标准组件。
Unix 域套接字的 API类似于 Internet套接字的API,但不是使用底层网络协议,所有通信都完全发生在操作系统内核中。Unix域套接字可以使用文件系统作为它们的地址命名空间。(一些操作系统,如Linux,提供额外的命名空间)。进程将Unix 域套接字作为文件系统的阳极,因此两个进程可以通过打开同一个套接字进行通信。
现在让我们回到正题。如果您的云提供商拒绝以这种方式使用容器,您无法选择挂载对套接字的访问怎么办?所以你必须在另一个容器中运行它,但它伴随着这个选项的创建者Jérôme Petazzoni 描述的新问题,但它不是首选。如果你想找出路,你绝对应该看看他的帖子。不这样做的主要原因有两个:
1、它与Linux 安全模块(LSM)的配合不好;
2、它会在文件系统中造成不匹配,从而给在父容器中创建的容器带来问题。
总之,容器化为我们提供了一个绝佳的机会,可以统一所有Linux 系统中的所有进程,并使用挂载来执行更好的调试,以仔细查看输出和输入文件,例如描述测****道的流或yaml。然而,有时它会给我们带来一些与主机上不同版本的docker 相关的问题,这对于在云中运行或容器在彼此内部运行的方式来说并不常见。
这篇文章并非如你所见。但我希望你喜欢这个小笔记,并从中学到新的东西!