发布和暴露端口

解释

如果您一直关注到目前为止的指南,您就会明白容器为应用程序的每个组件提供了隔离的进程。每个组件——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 发布其端口。

  1. 下载并安装 Docker Desktop。

  2. 在终端中,运行以下命令以启动一个新容器

    $ docker run -d -p 8080:80 docker/welcome-to-docker
    

    第一个 8080 指的是主机端口。这是您本地机器上用于访问容器内运行的应用程序的端口。第二个 80 指的是容器端口。这是容器内应用程序监听传入连接的端口。因此,该命令将主机的端口 8080 绑定到容器系统上的端口 80

  3. 通过转到 Docker Desktop 仪表板的 Containers(容器)视图来验证已发布的端口。

    A screenshot of Docker Desktop Dashboard showing the published port
  4. 通过选择容器的Port(s)(端口)列中的链接或在浏览器中访问 https://:8080 来打开网站。

    A screenshot of the landing page of the Nginx web server running in a container

使用 Docker Compose

此示例将使用 Docker Compose 启动相同的应用程序

  1. 创建一个新目录,并在该目录内创建一个名为 compose.yaml 的文件,内容如下

    services:
      app:
        image: docker/welcome-to-docker
        ports:
          - 8080:80

    ports 配置接受几种不同形式的端口定义语法。在这种情况下,您使用的是与 docker run 命令中相同的 HOST_PORT:CONTAINER_PORT

  2. 打开一个终端并导航到您在上一步中创建的目录。

  3. 使用 docker compose up 命令来启动应用程序。

  4. 在浏览器中打开 https://:8080

其他资源

如果您想更深入地了解这个主题,请务必查看以下资源

后续步骤

既然您已经了解了如何发布和公开端口,您就可以学习如何使用 docker run 命令覆盖容器的默认设置了。

覆盖容器默认值
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.