docker启动容器后PORTS没有数据

在使用Docker时,有时候我们会遇到启动容器后,通过docker ps命令查看端口映射时,发现PORTS列没有数据的情况。这可能会导致我们无法通过主机的IP地址和端口号来访问容器内的应用程序。本文将介绍这个问题的原因,并提供解决方案。

问题原因

首先,让我们来了解一下Docker的网络模式。当我们使用Docker启动一个容器时,默认情况下,Docker会为容器创建一个虚拟网络接口(veth pair),并将其中一个接口(eth0)绑定到容器的网络命名空间中,而另一个接口则绑定到宿主机的网络命名空间中。这样,容器就可以通过这个接口与宿主机进行通信。

在Docker中,通过-p--publish参数来指定宿主机和容器之间的端口映射关系。例如,我们可以使用以下命令启动一个容器,并将容器内的80端口映射到宿主机的8080端口上:

$ docker run -p 8080:80 nginx

然而,当容器内的应用程序监听在0.0.0.0地址上时,Docker会自动选择一个随机的端口号,而不是我们指定的端口号。这种情况下,docker ps命令中的PORTS列将显示空白。

解决方案

要解决这个问题,我们可以通过查看容器的详细信息来找到被分配的随机端口号。可以使用docker inspect命令来获取容器的详细信息:

$ docker inspect <container_id>

在返回的JSON中,可以找到NetworkSettings部分,其中包含了容器的网络设置信息。我们可以查看其中的Ports字段来获取容器的端口映射信息。例如,在上面的例子中,我们可以使用以下命令来获取容器的详细信息:

$ docker inspect <container_id> | grep -i ports

这样就可以找到容器内部被分配的随机端口号,然后我们可以使用这个端口号来访问容器内的应用程序。

另外,我们也可以使用docker port命令来获取容器的端口映射信息。例如,在上面的例子中,我们可以使用以下命令来获取容器的端口映射信息:

$ docker port <container_id>

这样就可以直接查看容器的端口映射信息,而不需要查看容器的详细信息。

总结

在使用Docker时,如果启动容器后发现PORTS列没有数据,可能是因为容器内的应用程序监听在0.0.0.0地址上,Docker自动选择了一个随机的端口号。为了找到被分配的随机端口号,我们可以使用docker inspect命令或docker port命令来获取容器的详细信息或端口映射信息。这样,我们就可以通过宿主机的IP地址和被分配的随机端口号来访问容器内的应用程序了。

希望本文对你理解并解决这个问题有所帮助!

关系图

erDiagram
    Docker --|> Container
    Docker --|> Network
    Container --|> Network

旅行图

journey
    title Docker启动容器后PORTS没有数据
    section 问题原因
        Docker启动容器时的网络模式
        容器内应用程序监听的地址和端口
    section 解决方案
        使用docker inspect命令获取容器详细信息
        使用docker port命令获取容器端口映射信息
    section 总结
        容器端口映射信息的获取方法

参考资料:

  • [Docker documentation](
  • [Docker命令行参考](https://docs