0

我已经启动了一个nginx在网络上绑定的容器host,如下所示:

docker run --rm -d --network host --name mynginx nginx

但是,当用命令查询进程信息时ss,这似乎是一个纯粹的nginx不是一个docker进程:

$ ss -tuap 'sport = :80'
Netid               State                  Recv-Q                 Send-Q                                  Local Address:Port                                 Peer Address:Port                
tcp                 LISTEN                 0                      128                                           0.0.0.0:http                                      0.0.0.0:*                    users:(("nginx",pid=16563,fd=6),("nginx",pid=16524,fd=6))

这是为什么?

4

2 回答 2

2

您将 nginx 进程配置为在主机网络命名空间中运行--net host。在该模式下,您无需设置从主机到容器网络的端口转发(例如-p 80:80)。如果您完成了端口转发,您会在主机上看到一个 docker 进程,该进程正在转发到 nginx 进程的容器命名空间中的同一端口。

请记住,容器是一种使用内核选项运行应用程序的方法,例如命名空间,它不是在单独的操作系统下运行的 VM,因此您将看到进程正在运行并且端口直接在主机上打开。

下面是一个示例,说明如果您转发端口而不是使用主机网络命名空间会是什么样子,以及如何查看容器内的网络命名空间:

$ docker run --rm -d -p 8000:80 --name mynginx nginx                                                                                
d177bc43166ad59f5cdf578eca819737635c43b2204b2f75f2ba54dd5a9cffbb

$ sudo ss -tuap 'sport = :8000'              
Netid State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port 
tcp   LISTEN     0      128        :::8000                     :::* users:(("docker-proxy",pid=25229,fd=4))

$ docker run -it --rm --net container:mynginx --pid container:mynginx nicolaka/netshoot ss -tuap 'sport = :80'                      
Netid  State      Recv-Q Send-Q Local Address:Port                 Peer Address:Port 
tcp    LISTEN     0      128     *:http                  *:*                     users:(("nginx",pid=1,fd=6))

docker-proxy过程是docker将端口转发到容器的默认方式。

于 2018-09-02T09:12:09.617 回答
0

恐怕这里对所谓的docker process.

首先,ss命令没有显示它是什么类型的进程。它可能会显示应用程序名称(nginx此处)。但我们不能说它是所谓的pure nginx process

你可以试试pwdx nginx_pid。否则,每个正在运行的容器都是一个我们可以ps -ef在其主机上检查的进程。

最重要的是,您可以使用ps -ef|grep nginxpwdx nginx_pid找出它是什么类型的过程。

于 2018-09-02T04:10:41.090 回答