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 中公开和发布端口。
我们还讨论了公开的端口是有关容器化应用程序的元数据,而发布端口是从主机访问应用程序的一种方式。