docker 程序的进程所有者
Process owner of a docker program
我已经启动了一个绑定在 host
网络上的 nginx
容器,如下所示:
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))
这是为什么?
恐怕这里对所谓的docker process
有些误解。
首先,ss
命令没有显示它是什么样的进程。它可能会显示应用程序名称(此处为nginx
)。但我们不能说是所谓的pure nginx process
。
你可以试试 pwdx nginx_pid
。否则,每个 运行 容器都是一个进程,我们可以在其主机上使用 ps -ef
检查。
最重要的是,您可以使用 ps -ef|grep nginx
和 pwdx nginx_pid
来找出它是什么样的过程。
您在主机网络命名空间 --net host
中将 nginx 进程配置为 运行。在那种模式下,您不需要设置从主机到容器网络的端口转发(例如 -p 80:80
)。如果您完成了端口转发,您会在主机上看到一个 docker 进程,该进程正在转发到 nginx 进程的容器名称空间中的同一端口。
请记住,容器是 运行 具有内核选项(例如命名空间)的应用程序的一种方法,它不是单独 OS 下的 VM 运行,所以您将看到直接在主机上打开的进程 运行ning 和端口。
下面是一个示例,说明如果您转发端口而不是使用主机网络命名空间会是什么样子,以及您还可以如何查看容器内的网络命名空间:
$ 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 将端口转发到容器的默认方式。
我已经启动了一个绑定在 host
网络上的 nginx
容器,如下所示:
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))
这是为什么?
恐怕这里对所谓的docker process
有些误解。
首先,ss
命令没有显示它是什么样的进程。它可能会显示应用程序名称(此处为nginx
)。但我们不能说是所谓的pure nginx process
。
你可以试试 pwdx nginx_pid
。否则,每个 运行 容器都是一个进程,我们可以在其主机上使用 ps -ef
检查。
最重要的是,您可以使用 ps -ef|grep nginx
和 pwdx nginx_pid
来找出它是什么样的过程。
您在主机网络命名空间 --net host
中将 nginx 进程配置为 运行。在那种模式下,您不需要设置从主机到容器网络的端口转发(例如 -p 80:80
)。如果您完成了端口转发,您会在主机上看到一个 docker 进程,该进程正在转发到 nginx 进程的容器名称空间中的同一端口。
请记住,容器是 运行 具有内核选项(例如命名空间)的应用程序的一种方法,它不是单独 OS 下的 VM 运行,所以您将看到直接在主机上打开的进程 运行ning 和端口。
下面是一个示例,说明如果您转发端口而不是使用主机网络命名空间会是什么样子,以及您还可以如何查看容器内的网络命名空间:
$ 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 将端口转发到容器的默认方式。