我是新来的码头,我正在与另一家公司的开发人员工作。我相信他们也是新来的码头。我有一个开发人员问我“我是在docker容器内部还是外部运行该命令”,或者“如果我要在容器外部创建一个新分支”。
有没有人能帮我弄清楚集装箱里面或外面的意思?
我似乎不能理解,我在网上搜索,似乎没有找到任何关于运行命令或其他类似命令的术语内部或外部。
bqjvbblv1#
是的,这是正常的(Docker使用主机上的内核,而不是它自己的内核,您将在主机上的ps命令中看到它。)查看进程在主机的停靠容器中“内部”运行(如果您使用top或ps命令检查正在运行的进程)。尝试以这种方式运行pstree,您将看到所有正在运行的进程都是containerd的子进程。在容器内运行的进程只是一个常规进程。在大多数情况下,它与在容器外部运行的常规进程没有什么不同。Docker使用namespaces和cgroups将进程与系统的其余部分隔离。Namespaces和cgroups是允许内核隔离进程的抽象。Docker守护进程只是一个进程,它可以方便地将其他进程放入名称空间/cgroup中。
ps
top
pstree
containerd
namespaces
cgroups
Namespaces
7cjasjjr2#
Docker文件是对特定应用程序的Linux外观的描述。也就是说,没有该应用程序不需要的任何东西,并且它使用的所有工具和库都已经安装。可以包括用于例如数据库或网络服务器的专用坞站文件,简化了其定义。Docker映像基本上应用了Docker文件中的所有规范。也就是说,设置了一个文件系统,并且将docker文件中指定的所有软件安装到该文件系统中,就像它是真正的Linux一样。停靠容器基本上是在引导映像文件,因此所有启动脚本都会被执行,并且在它完成时会有所有预期的进程在运行。它运行的任何软件都会认为它是在一台独立机器上启动的Linux上运行的。除了它所做的一切只发生在容器内。如果写入文件,则只将其写入容器的文件系统,该文件系统是从实际文件系统借来的一大块空间。通常,您还需要指定应该在容器中运行什么,否则一旦引导,它就没有更多的事情可做了,所以停止。一旦它停止,内存和文件空间就会被释放,所以里面所做的一切都会消失。您可以启动运行服务的Web服务器,或者可以与之交互的外壳,等等。您通常还希望能够连接到容器外部的网络、读取或写入文件外部的文件等。您可以将现实世界中的事物Map到容器(例如,容器中的端口8080Map到实际Linux中的端口18080,/tmp/scratchMap到容器中的/tmp/scratch,等等)。您还可以使用exec命令启动在容器中运行的另一个进程。例如,您可以将输入和输出Map到您的终端并启动bash。最后,您可以停止容器,其中的所有内容都将停止运行,并且所有内存和文件都将被释放。
/tmp/scratch
exec
bash
amrnrhlw3#
以上两个答案很好地阐明了当一个人说“在容器里”是什么意思。世界上没有所谓的“内或外”。您需要了解一个内核结构--“名称空间”。命名空间给进程或应用程序提供了一种隔离的错觉。它们缩小了应用程序的范围,使其只能看到某些资源。这些资源可以是其他进程、文件、IP地址等。目前(截至2022年)有7种命名空间--每种命名空间都有助于隔离特定的资源。例如,PID命名空间限制特定进程或应用程序可以看到的其他进程。装载命名空间限制给定应用程序可以看到的文件。我最近一直在学习名称空间和Cgroup,以更好地理解容器-找到了这个伟大的资源https://www.udemy.com/course/containers-under-the-hood,它得到了极大的帮助。强烈推荐给对了解容器工作原理感兴趣的任何人。
3条答案
按热度按时间bqjvbblv1#
是的,这是正常的(Docker使用主机上的内核,而不是它自己的内核,您将在主机上的
ps
命令中看到它。)查看进程在主机的停靠容器中“内部”运行(如果您使用top
或ps
命令检查正在运行的进程)。尝试以这种方式运行pstree
,您将看到所有正在运行的进程都是containerd
的子进程。在容器内运行的进程只是一个常规进程。在大多数情况下,它与在容器外部运行的常规进程没有什么不同。Docker使用
namespaces
和cgroups
将进程与系统的其余部分隔离。Namespaces
和cgroups
是允许内核隔离进程的抽象。Docker守护进程只是一个进程,它可以方便地将其他进程放入名称空间/cgroup中。
7cjasjjr2#
Docker文件是对特定应用程序的Linux外观的描述。也就是说,没有该应用程序不需要的任何东西,并且它使用的所有工具和库都已经安装。可以包括用于例如数据库或网络服务器的专用坞站文件,简化了其定义。
Docker映像基本上应用了Docker文件中的所有规范。也就是说,设置了一个文件系统,并且将docker文件中指定的所有软件安装到该文件系统中,就像它是真正的Linux一样。
停靠容器基本上是在引导映像文件,因此所有启动脚本都会被执行,并且在它完成时会有所有预期的进程在运行。它运行的任何软件都会认为它是在一台独立机器上启动的Linux上运行的。除了它所做的一切只发生在容器内。如果写入文件,则只将其写入容器的文件系统,该文件系统是从实际文件系统借来的一大块空间。
通常,您还需要指定应该在容器中运行什么,否则一旦引导,它就没有更多的事情可做了,所以停止。一旦它停止,内存和文件空间就会被释放,所以里面所做的一切都会消失。
您可以启动运行服务的Web服务器,或者可以与之交互的外壳,等等。您通常还希望能够连接到容器外部的网络、读取或写入文件外部的文件等。您可以将现实世界中的事物Map到容器(例如,容器中的端口8080Map到实际Linux中的端口18080,
/tmp/scratch
Map到容器中的/tmp/scratch
,等等)。您还可以使用
exec
命令启动在容器中运行的另一个进程。例如,您可以将输入和输出Map到您的终端并启动bash
。最后,您可以停止容器,其中的所有内容都将停止运行,并且所有内存和文件都将被释放。
amrnrhlw3#
以上两个答案很好地阐明了当一个人说“在容器里”是什么意思。世界上没有所谓的“内或外”。您需要了解一个内核结构--“名称空间”。
命名空间给进程或应用程序提供了一种隔离的错觉。它们缩小了应用程序的范围,使其只能看到某些资源。这些资源可以是其他进程、文件、IP地址等。目前(截至2022年)有7种命名空间--每种命名空间都有助于隔离特定的资源。例如,PID命名空间限制特定进程或应用程序可以看到的其他进程。装载命名空间限制给定应用程序可以看到的文件。
我最近一直在学习名称空间和Cgroup,以更好地理解容器-找到了这个伟大的资源https://www.udemy.com/course/containers-under-the-hood,它得到了极大的帮助。
强烈推荐给对了解容器工作原理感兴趣的任何人。