介绍
在本实验中,你将学习如何使用 docker port 命令来检查正在运行的 Docker 容器的端口映射情况。我们将首先启动一个带有发布端口的 Nginx 容器,然后探索如何列出该容器的所有已发布端口映射。
你还将学习如何列出特定的已发布 TCP 和 UDP 端口映射,并了解查询不存在的 UDP 映射时的行为表现。最后,我们将演示如何在不显式指定协议的情况下列出特定的已发布端口映射。
启动带有端口映射的容器
在这一步骤中,我们将学习如何启动一个 Docker 容器并将其端口发布到宿主机。发布端口允许外部访问容器内运行的服务。
首先,让我们从 Docker Hub 拉取 nginx 镜像。该镜像包含了一个可用于演示的简单 Web 服务器。
docker pull nginx
你将看到显示镜像正在下载的输出。下载完成后,可以通过以下命令验证镜像已本地可用:
docker images
现在,我们将启动一个 nginx 容器,并将容器内的 80 端口发布到宿主机的 8080 端口。-d 参数表示以分离模式(后台运行)启动容器,-p 参数用于端口映射,nginx 是镜像名称。
docker run -d -p 8080:80 nginx
输出结果将是容器 ID。这表示容器已成功启动,其内部 80 端口现在可以通过你的 LabEx 虚拟机的 8080 端口访问。
要验证 Web 服务器是否正常运行且可访问,你可以使用 curl 访问宿主机上的发布端口。
curl http://localhost:8080
你应该能在终端看到 Nginx 默认欢迎页面的 HTML 输出。这确认了端口映射工作正常,你可以从宿主机访问容器内运行的服务。
列出容器的所有已发布端口映射
在这一步骤中,我们将学习如何列出正在运行的 Docker 容器的已发布端口映射。这对于确认哪些端口被暴露以及它们如何映射到宿主机非常有用。
我们可以使用 docker port 命令后接容器 ID 或名称来列出特定容器的所有已发布端口映射。首先,让我们获取上一步骤中启动的 nginx 容器的容器 ID。
docker ps -q --filter ancestor=nginx
该命令将输出容器 ID。复制这个 ID,我们将在下一个命令中使用它。
现在,使用 docker port 命令配合容器 ID 来列出端口映射。请将 <container_id> 替换为你获取到的实际 ID。
docker port <container_id>
你应该会看到类似 80/tcp -> 0.0.0.0:8080 的输出。这表示容器的内部 80 端口(使用 TCP 协议)被映射到所有主机接口(0.0.0.0)的 8080 端口。
这个命令是快速查看运行中容器配置的所有端口映射的便捷方式。
查询指定 TCP 端口映射
在这一步骤中,我们将优化 docker port 命令的使用,专门查询某个已发布的端口映射及其协议类型。当容器暴露了多个使用不同协议的端口时,这个功能特别有用。
要查询特定的 TCP 端口映射,我们需要在 docker port 命令后附加容器端口和协议类型(/tcp)。首先,如果你手头没有容器 ID,请再次获取:
docker ps -q --filter ancestor=nginx
现在,使用 docker port 命令配合容器 ID,并指定内部 80 端口和 TCP 协议。请将 <container_id> 替换为你的实际容器 ID。
docker port < container_id > 80/tcp
输出结果应为 0.0.0.0:8080。这明确显示了容器内部 TCP 80 端口所映射到的主机地址和端口号。相比列出所有端口映射,这个方法能更精确地获取你关心的特定映射和协议信息。
查询指定 UDP 端口映射(预期报错)
在这一步骤中,我们将尝试查询 nginx 容器的特定 UDP 端口映射。由于 Nginx 通常仅使用 TCP 协议作为其 Web 服务器协议,我们预期该命令将无法找到 UDP 映射,并可能返回错误或无输出。这演示了在查询端口映射时如何指定协议,以及当该协议的映射不存在时会发生什么情况。
首先,获取你的 nginx 容器 ID:
docker ps -q --filter ancestor=nginx
现在,使用 docker port 命令配合容器 ID,并指定内部 80 端口和 UDP 协议(/udp)。请将 <container_id> 替换为你的实际容器 ID。
docker port < container_id > 80/udp
你应该会观察到该命令没有输出或返回错误信息。这是因为当前配置的 nginx 容器并未使用 UDP 协议暴露 80 端口。这凸显了在查询端口映射时指定正确协议的重要性。
查询指定端口映射(不指定协议类型)
在本步骤中,我们将学习如何在不显式指定协议(TCP 或 UDP)的情况下查询特定端口映射。当省略协议时,docker port 命令会列出指定容器端口的所有 TCP 和 UDP 映射。
首先,获取你的 nginx 容器 ID:
docker ps -q --filter ancestor=nginx
现在,使用 docker port 命令配合容器 ID,并指定内部 80 端口但不包含协议。请将 <container_id> 替换为你的实际容器 ID。
docker port < container_id > 80
由于我们的 nginx 容器仅针对 80 端口配置了 TCP 映射,输出结果将为 80/tcp -> 0.0.0.0:8080。如果容器同时存在 80 端口的 TCP 和 UDP 映射,两者都会被列出。这种方法可以方便地查看特定内部端口的所有映射,而无需考虑协议类型。
总结
在本实验中,我们学习了如何使用 docker run -p 命令启动 Docker 容器并将其内部端口发布到宿主机。我们通过运行 Nginx 容器并将其内部 80 端口映射到宿主机的 8080 端口进行了演示,并使用 curl 验证了可访问性。
随后,我们探索了 docker port 命令来列出运行中容器的已发布端口映射。我们学习了如何列出所有已发布端口,以及如何查询特定的 TCP 或 UDP 端口映射,了解到查询不存在的 UDP 映射会导致错误。我们还实践了在不显式指定协议的情况下列出特定端口映射的方法。



