端口发布与暴露
目录
- 发布端口
- 发布到临时端口
- 发布所有端口
- 试一试
- 使用 Docker CLI
- 使用 Docker Compose
如果你一直在跟随本指南,你应该理解容器为应用程序的每个组件提供了隔离的进程。每个组件 - 如 React 前端、Python API 和 Postgres 数据库 - 都运行在自己的沙箱环境中,与主机上的其他一切完全隔离。这种隔离对于安全和管理依赖性非常有利,但也意味着你不能直接访问它们。例如,你无法在浏览器中访问 web 应用程序。
这就是端口发布的作用。
发布端口
发布端口可以通过设置转发规则来打破一点点的网络隔离。举个例子,你可以指示主机的 8080 端口的请求应该转发到容器的 80 端口。发布端口是在创建容器时使用 docker run
的 -p
(或 --publish
)标志来完成的。语法如下:
sh
docker run -d -p 主机端口:容器端口 nginx
- 主机端口:你希望在主机上接收流量的端口号
- 容器端口:容器内监听连接的端口号
例如,将容器的 80 端口发布到主机的 8080 端口:
sh
docker run -d -p 8080:80 nginx
现在,发送到主机 8080 端口的任何流量都会转发到容器内的 80 端口。
当端口被发布时,默认情况下它会发布到所有网络接口上。这意味着任何到达你机器的流量都可以访问发布的应用程序。注意不要发布数据库或任何敏感信息。了解更多关于发布端口的信息 这里.
发布到临时端口
有时,你可能只想发布端口但不在乎使用哪个主机端口。在这些情况下,你可以让 Docker 为你选择端口。为此,只需省略主机端口配置。
例如,以下命令会将容器的 80 端口发布到主机上的一个临时端口:
sh
docker run -p 80 nginx
一旦容器运行起来,使用 docker ps
会显示选定的端口:
sh
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
标志,你可以自动将所有暴露的端口发布到临时端口。这在开发或测试环境中避免端口冲突时非常有用。
例如,以下命令将发布镜像配置的所有暴露端口:
sh
docker run -P nginx
试一试
在本动手指南中,你将学习如何使用 CLI 和 Docker Compose 发布容器端口来部署 web 应用程序。
使用 Docker CLI
在此步骤中,你将运行一个容器并使用 Docker CLI 发布其端口。
下载并安装 Docker Desktop。
在终端中运行以下命令启动新容器:
sh
docker run -d -p 8080:80 docker/welcome-to-docker
第一个 8080 是指主机端口。这是本地机器上用于访问容器内运行的应用程序的端口。第二个 80 是指容器端口。这是容器内应用程序监听传入连接的端口。因此,该命令将主机的 8080 端口绑定到容器系统的 80 端口。
访问浏览器中的 http://localhost:8080 打开网站。
使用 Docker Compose
这个例子将使用 Docker Compose 启动相同的应用程序:
创建一个新目录,并在该目录中创建一个 compose.yaml
文件,内容如下:
yaml
services:
app:
image: nginx
ports:
- 8080:80
端口配置接受几种不同形式的语法定义端口。在这种情况下,你使用与 docker run
命令中相同的 HOST_PORT:CONTAINER_PORT
语法。
打开终端并导航到你在上一步中创建的目录。
使用 docker compose up
命令启动应用程序。
打开浏览器访问 http://localhost:8080。