Skip to content

Docker - 管理端口

在 Docker 容器中运行的应用程序通常需要在特定的网络端口上暴露服务(例如,Web 服务器在 80 端口,数据库在 3306 端口)。为了从 Docker 宿主机或外部网络访问这些服务,你需要将端口从宿主机映射到容器内部的端口。

暴露端口(Exposing) vs. 发布端口(Publishing)

Section titled “暴露端口(Exposing) vs. 发布端口(Publishing)”
  • 暴露端口(EXPOSE 在 Dockerfile 中): 这条指令充当文档说明。它通知镜像的使用者应用程序打算监听哪些端口。它不会使端口可以从宿主机访问。
  • 发布端口(-p 或 --publish 标志在 docker run 中): 这会主动将 Docker 宿主机上的一个端口映射到容器内部的一个端口。这使得容器的服务可以从外部访问。

使用 docker run 命令时,使用 -p(或 --publish)标志来映射端口。

最常见的格式是:

  • -p hostPort:containerPort:将容器内部的 containerPort 映射到 Docker 宿主机所有接口上的 hostPort。
  • -p ip:hostPort:containerPort:将 containerPort 映射到 Docker 宿主机特定 ip 地址上的 hostPort。
  • -p containerPort:将 containerPort 映射到 Docker 宿主机上一个随机选择的可用高位端口。当你不关心具体的宿主机端口时很有用。
  • -p hostPort:containerPort/udp:指定使用 UDP 协议而不是默认的 TCP。

官方 Jenkins 镜像 (jenkins/jenkins:lts) 通常暴露 8080 端口用于 Web UI,暴露 50000 端口用于代理通信。

# Run Jenkins, mapping host 8080 to container 8080 (TCP)
# and host 50000 to container 50000 (TCP)
docker run -d --name myjenkins \
-p 8080:8080 \
-p 50000:50000 \
jenkins/jenkins:lts

运行此命令后,你可以通过在浏览器中访问 http://localhost:8080 或 http://<docker-host-ip>:8080 来访问 Jenkins UI。

如果你运行多个实例或不需要固定的宿主机端口:

# Run Nginx, mapping container port 80 to a random host port
docker run -d --name random-port-nginx -P nginx:stable-alpine
# Note the capital -P publishes ALL exposed ports to random host ports
# Or map a specific container port to a random host port
docker run -d --name specific-random-nginx -p 80 nginx:stable-alpine

要找出分配了哪个随机宿主机端口,请使用 docker ps 命令:

docker ps

查看容器的 PORTS 列(例如,0.0.0.0:32768->80/tcp)。然后你将通过 http://localhost:32768 访问服务。

虽然镜像文档(例如,在 Docker Hub 上)通常会列出暴露的端口,但你也可以通过检查镜像或正在运行的容器来查找它们。

# Inspect the Jenkins image
docker inspect jenkins/jenkins:lts

在 JSON 输出的 "ContainerConfig" 或 "Config" 部分中查找 "ExposedPorts" 键。这显示了 Dockerfile 中由 EXPOSE 定义的端口。

# Inspect a running container to see actual mappings
docker inspect myjenkins

在 "NetworkSettings" 部分中查找 "Ports" 键,以查看实际的宿主机端口映射。

正确管理端口映射对于使容器化服务可访问至关重要。