1. 概述

在 Docker 中,了解容器化应用程序正在侦听哪些端口非常重要。我们还需要一种从容器外部访问应用程序的方法。

为了解决这些问题,Docker 使我们能够公开和发布端口。

在本文中,我们将了解公开和发布端口。我们将使用一个简单的 Nginx Web 服务器容器作为示例。

2. Expose端口

公开的端口是有关容器化应用程序的一段元数据。在大多数情况下,这显示应用程序正在侦听哪些端口。 Docker 本身不会对暴露的端口执行任何操作 。但是,当我们启动容器时,我们可以在发布端口时使用此元数据。

2.1.使用 Nginx 公开

让我们使用 Nginx Web 服务器来尝试一下。

如果我们查看Nginx 官方 Dockerfile ,我们会看到端口 80 通过以下命令公开:

EXPOSE 80

此处公开端口 80,因为它是 http 协议的默认端口。让我们在本地机器上运行 Nginx 容器,看看是否可以通过端口 80 访问它:

$ docker run -d nginx

上面的命令将使用 Nginx 的最新镜像并运行容器。我们可以使用以下命令仔细检查 Nginx 容器是否正在运行:

$ docker container ls

该命令将输出有关所有正在运行的容器的一些信息,包括 Nginx:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
cbc2f10f787f        nginx               "/docker-entrypoint..."   15 seconds ago      Up 15 seconds       80/tcp              dazzling_mclean

在这里我们在端口部分看到 80。由于端口 80 被暴露,我们可能认为访问 localhost:80 (或只是 localhost )将显示 Nginx 默认页面,但事实并非如此:

$ curl http://localhost:8080
... no web page appears

虽然端口暴露了,但是 Docker 并没有向主机开放。

2.2.公开端口的方法

Docker 中公开端口的方式主要有两种。我们可以在 Dockerfile 中使用 EXPOSE 命令来完成此操作:

EXPOSE 8765

或者,我们也可以在运行容器时使用 –expose 选项公开端口*:*

$ docker run --expose 8765 nginx

3. Publish端口

为了能够通过 docker 主机访问容器端口,我们需要发布它。

3.1.使用 Nginx 发布

让我们使用映射端口运行 Nginx:

$ docker run -d -p 8080:80 nginx

上面的命令会将主机的 8080 端口映射到容器的 80 端口。该选项的一般语法是:

-p <hostport>:<container port>

如果我们访问 localhost:8080 ,我们应该会看到 Nginx 的默认欢迎页面:

$ curl http://localhost:8080
StatusCode : 200
StatusDescription : OK
Content : <!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
... more HTML

让我们列出所有正在运行的容器:

$ docker container ls

现在我们应该看到容器有一个端口映射:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
38cfed3c61ea        nginx               "/docker-entrypoint..."   31 seconds ago      Up 30 seconds       0.0.0.0:8080->80/tcp   dazzling_kowalevski

端口 部分下,我们有 0.0.0.0:8080->80/tcp 映射。

默认情况下,Docker 为主机添加了 0.0.0.0 不可路由的元地址*。* 这意味着该映射对于主机的所有地址/接口都有效。

3.2.限制容器访问

我们可以根据主机 IP 地址限制对容器的访问。 我们可以在映射中指定主机 IP 地址,而不是允许从所有接口访问容器( 0.0.0.0 允许)。

让我们将对容器的访问限制为仅来自 127.0.0.1 环回地址的流量:

$ docker run -d -p 127.0.0.1:8081:80 nginx

在这种情况下,容器只能从主机本身访问。这使用扩展语法进行发布,其中包括地址绑定:

-p <binding address>:<hostport>:<container port>

4. 发布所有暴露的端口

公开的端口元数据对于启动容器非常有用,因为 Docker 使我们能够发布所有公开的端口:

$ docker run -d --publish-all nginx

在这里,Docker 将容器中所有暴露的端口绑定到主机上的空闲随机端口。

让我们看看该命令启动的容器:

$ docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
0a23e78732ce        nginx               "/docker-entrypoint..."   6 minutes ago       Up 6 minutes        0.0.0.0:32768->80/tcp   pedantic_curran

正如我们所料,Docker 从主机中选择了一个随机端口(本例中为 32768)并将其映射到公开的端口*。*

5. 结论

在本文中,我们了解了如何在 Docker 中公开和发布端口。

我们还讨论了公开的端口是有关容器化应用程序的元数据,而发布端口是从主机访问应用程序的一种方式。