如何使用 docker compose port 命令查找映射端口

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 docker port 命令来发现映射到 Docker 服务的公共端口。我们将首先使用 nginx 镜像创建一个带有端口映射的简单服务。

创建服务后,你将探索如何查找整个服务的公共端口、特定协议的公共端口以及服务中特定容器索引的公共端口。通过这个动手实践,你将掌握以编程方式识别 Docker 容器暴露端口的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555085{{"如何使用 docker compose port 命令查找映射端口"}} docker/ps -.-> lab-555085{{"如何使用 docker compose port 命令查找映射端口"}} docker/port -.-> lab-555085{{"如何使用 docker compose port 命令查找映射端口"}} docker/pull -.-> lab-555085{{"如何使用 docker compose port 命令查找映射端口"}} docker/images -.-> lab-555085{{"如何使用 docker compose port 命令查找映射端口"}} end

创建带有端口映射的简单服务

在这一步中,我们将学习如何使用 Docker 创建一个简单服务,并将容器内的端口映射到宿主机。这样就能从外部访问运行在容器内的服务。

首先,让我们从 Docker Hub 拉取 nginx 镜像。这个镜像包含了一个轻量级的 web 服务器,非常适合我们的示例。

docker pull nginx

你会看到显示镜像正在下载的输出。下载完成后,可以通过列出镜像来验证本地是否已有该镜像:

docker images

现在,让我们基于 nginx 镜像运行一个容器,并将容器内的 80 端口映射到宿主机的 8080 端口。-d 参数让容器在后台运行(detached 模式),-p 8080:80 参数则执行端口映射。

docker run -d -p 8080:80 nginx

这个命令会在 Docker 容器中启动一个 Nginx web 服务器,并使其可以通过 LabEx VM 的 8080 端口访问。

要验证容器是否正在运行以及端口映射是否生效,可以使用 docker ps 命令列出正在运行的容器。找到运行 nginx 镜像的容器,检查 PORTS 列。你应该能看到 0.0.0.0:8080->80/tcp

docker ps

最后,你可以使用 curl 向 8080 端口的 localhost 发送请求来访问 Nginx 欢迎页面。

curl localhost:8080

你会在输出中看到默认 Nginx 欢迎页面的 HTML 内容。这确认了容器正在运行,并且可以通过映射的端口访问。

查找服务的公共端口

在上一步中,我们创建了一个 Docker 容器并将容器端口映射到宿主机。现在,让我们学习如何以编程方式查找服务暴露的公共端口。这在你不记得具体将哪个主机端口映射到容器内部端口时特别有用。

docker port 命令专为此目的设计,它可以显示指定容器的端口映射情况。你需要提供容器 ID 或名称作为参数。

首先,让我们获取正在运行的 Nginx 容器的 ID。你可以使用 docker ps 并过滤输出,或者直接从之前步骤中 docker ps 命令的输出里复制 ID。

docker ps

找到运行 nginx 镜像的容器并记下其 Container ID。

现在,使用 docker port 命令后跟容器 ID 来查看端口映射情况。

docker port [CONTAINER_ID]

[CONTAINER_ID] 替换为你实际的 Nginx 容器 ID。

输出将显示容器的内部端口及其映射到的主机端口。例如,你应该会看到类似 80/tcp -> 0.0.0.0:8080 的输出,这表示容器的内部 80 端口(使用 TCP 协议)被映射到了所有主机接口(0.0.0.0)的 8080 端口。

这个命令无需检查容器的完整配置,就能快速确定公共端口。

查找特定协议的公共端口

在上一步中,我们使用 docker port 查找了容器的所有端口映射。有时,一个容器可能会使用不同协议(如 TCP 和 UDP)暴露多个端口。在这一步中,我们将学习如何查找特定协议的公共端口。

docker port 命令允许你指定容器的内部端口和感兴趣的协议。格式为 docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]

让我们查找 Nginx 容器内部 80 端口使用 TCP 协议的公共端口。首先,确保你已从上一步获取了容器 ID。如果没有,可以再次使用 docker ps 获取。

docker ps

现在,使用 docker port 命令并带上容器 ID 以及特定端口和协议:

docker port [CONTAINER_ID] 80/tcp

[CONTAINER_ID] 替换为你实际的 Nginx 容器 ID。

输出应直接显示主机端口映射到容器内部 80 端口(TCP 协议)的结果,即 0.0.0.0:8080。这比仅运行 docker port [CONTAINER_ID](会列出所有映射)更加具体。

当容器为不同协议暴露相同端口号,而你只需要其中一个协议的映射时,这个方法特别有用。

查找特定容器索引的公共端口

在某些高级场景中,容器可能会多次暴露相同的内部端口,可能映射到不同的主机端口或接口。虽然对于 Nginx 这类简单服务来说不太常见,但这种情况确实存在。此时,docker port 命令可能会为单个内部端口返回多个映射结果。

当存在多个映射时,你可以使用索引来获取特定的映射结果。docker port 命令针对某个内部端口的输出是一个映射列表,你可以通过从 0 开始的索引来访问特定映射。

假设我们的 Nginx 容器为端口 80 配置了多个映射(仅为演示目的)。要获取第一个映射(索引 0),你可以使用以下命令格式:

docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]

以我们的 Nginx 为例,要获取内部端口 80 TCP 的第一个映射,可以使用:

docker port [CONTAINER_ID] 80/tcp/0

[CONTAINER_ID] 替换为你实际的 Nginx 容器 ID。

由于我们的 Nginx 容器只有一个 80/tcp 端口的映射,该命令的输出将与 docker port [CONTAINER_ID] 80/tcp 相同,即 0.0.0.0:8080

虽然这个 Nginx 示例可能无法完全展示索引功能的强大之处(因为只有一个映射),但理解这个功能对于更复杂的容器配置非常重要——特别是当同一个内部端口可能存在多个映射时。

总结

在本实验中,我们学习了如何通过拉取 Nginx 镜像、运行容器并将容器端口 80 映射到主机端口 8080 来创建一个带有端口映射的简单 Docker 服务。我们使用 docker ps 验证了容器的状态和端口映射,并通过 curl 访问主机映射端口确认了服务的可访问性。

随后,我们探索了如何通过编程方式使用 docker port 命令查找服务的公共端口,这在主机端口映射不明确的情况下特别有用。该命令使我们能够获取与容器内部端口对应的主机端口。