发布和暴露端口
说明
如果您一直遵循本指南,您应该已经了解到,容器为应用程序的每个组件提供了隔离的进程。每个组件 - 一个 React 前端、一个 Python API 和一个 Postgres 数据库 - 都在自己的沙箱环境中运行,与您主机上的其他所有内容完全隔离。这种隔离对于安全性和管理依赖关系非常有益,但也意味着您无法直接访问它们。例如,您无法在浏览器中访问 Web 应用程序。
这就是端口发布发挥作用的地方。
发布端口
发布端口可以通过设置转发规则来突破一点网络隔离。例如,您可以指定主机端口 8080 上的请求应该转发到容器的端口 80。发布端口是在容器创建过程中使用 -p(或 --publish)标志与 docker run 一起完成的。语法如下:
$ docker run -d -p HOST_PORT:CONTAINER_PORT nginx
HOST_PORT: 您希望在其上接收流量的主机上的端口号CONTAINER_PORT: 容器内监听连接的端口号
例如,要将容器的端口 80 发布到主机端口 8080:
$ docker run -d -p 8080:80 nginx
现在,发送到主机上端口 8080 的任何流量都将转发到容器内的端口 80。
重要
当端口被发布时,默认会发布到所有网络接口。这意味着任何到达您机器的流量都可以访问已发布的应用程序。请注意发布数据库或任何敏感信息。 在此处了解更多关于已发布端口的信息。
发布到临时端口
有时,您可能只想发布端口,而不关心使用哪个主机端口。在这种情况下,您可以让 Docker 为您选择端口。为此,只需省略 HOST_PORT 配置。
例如,以下命令会将容器的端口 80 发布到主机的临时端口上:
$ docker run -p 80 nginx
容器运行后,使用 docker ps 将显示所选的端口:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a527355c9c53 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:54772->80/tcp romantic_williamson
在此示例中,应用程序在主机的端口 54772 上公开。
发布所有端口
在创建容器镜像时,EXPOSE 指令用于指示打包的应用程序将使用指定的端口。这些端口默认不会发布。
使用 -P 或 --publish-all 标志,您可以自动将所有暴露的端口发布到临时端口。这在您尝试避免开发或测试环境中的端口冲突时非常有用。
例如,以下命令将发布由镜像配置的所有暴露端口:
$ docker run -P nginx
试用
在本实操指南中,您将学习如何使用 CLI 和 Docker Compose 发布容器端口,以部署 Web 应用程序。
使用 Docker CLI
在此步骤中,您将运行一个容器并使用 Docker CLI 发布其端口。
下载并安装 Docker Desktop。
在终端中,运行以下命令以启动一个新容器:
$ docker run -d -p 8080:80 docker/welcome-to-docker第一个
8080指的是主机端口。这是您本地机器上用于访问容器内运行的应用程序的端口。第二个80指的是容器端口。这是容器内应用程序用于监听传入连接的端口。因此,该命令将主机的端口8080绑定到容器系统的端口80。通过访问 Docker Desktop 仪表板的 容器 视图来验证已发布的端口。

通过选择容器端口列中的链接或在浏览器中访问 http://localhost:8080 来打开网站。

使用 Docker Compose
此示例将使用 Docker Compose 启动相同的应用程序:
创建一个新目录,在该目录内,创建一个包含以下内容的
compose.yaml文件:services: app: image: docker/welcome-to-docker ports: - 8080:80ports配置接受几种不同的端口定义语法形式。在这种情况下,你使用的是docker run命令中使用的相同HOST_PORT:CONTAINER_PORT。打开终端并导航到您在上一步中创建的目录。
使用
docker compose up命令启动应用程序。在浏览器中打开 http://localhost:8080.
其他资源
如果您想深入了解这一主题,请务必查看以下资源:
后续步骤
既然您已经了解了如何发布和暴露端口,那么您已经准备好学习如何使用 docker run 命令覆盖容器的默认设置。