拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Docker中expose”和“publish”之间的区别

Docker中expose”和“publish”之间的区别

白鹭 - 2021-11-24 744 0 0

1.概述

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

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

在本文中,我们将学习有关公开和发布端口的知识。我们将以一个简单的Nginx Web服务器容器为例。

2.暴露端口

公开的端口是有关容器化应用程序的一部分元数据。在大多数情况下,这显示了应用程序正在侦听的端口。 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中公开端口有两种主要方法。我们可以使用EXPOSE命令Dockerfile

EXPOSE 8765

另外,我们也可以在运行容器时使用–expose :

$ docker run --expose 8765 nginx

3.发布端口

为了通过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

ports部分下,我们有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中公开和发布端口的信息。

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

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *