发布和公开端口
说明
如果您一直按照指南进行操作,您会了解到容器为应用的每个组件提供了隔离的进程。每个组件——React 前端、Python API 和 Postgres 数据库——都在其自己的沙箱环境中运行,与主机上的其他所有内容完全隔离。这种隔离对于安全性和依赖项管理非常有用,但也意味着您无法直接访问它们。例如,您无法在浏览器中访问 Web 应用。
这就是端口发布的作用所在。
发布端口
端口发布通过设置转发规则,能够稍微突破一些网络隔离。例如,您可以指定将主机端口 8080
上的请求转发到容器的端口 80
。端口发布是在使用 docker run
命令时的 -p
(或 --publish
) 标志来完成的。语法是
$ 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 Dashboard 的 容器 视图来验证已发布的端口。
通过点击容器 端口 列中的链接或在浏览器中访问 http://localhost:8080 来打开网站。
使用 Docker Compose
此示例将使用 Docker Compose 启动相同的应用
创建一个新目录,并在该目录中创建一个包含以下内容的
compose.yaml
文件services: app: image: docker/welcome-to-docker ports: - 8080:80
ports
配置接受几种不同的端口定义语法形式。在这种情况下,您使用的是与docker run
命令中相同的HOST_PORT:CONTAINER_PORT
格式。打开终端并导航到您在上一步中创建的目录。
使用
docker compose up
命令启动应用。在浏览器中打开 http://localhost:8080。
其他资源
如果您想深入了解此主题,请务必查看以下资源
下一步
现在您了解了如何发布和公开端口,接下来您将学习如何使用 docker run
命令覆盖容器的默认设置。