docker-comput中的port和暴露有什么区别?

docker-compose.yml中的portsexpose选项有什么区别?

519217 次浏览

根据docker编写参考

港口定义为:

公开端口。要么指定两个端口(HOST: CONTAINER),要么只指定容器端口(将选择一个随机主机端口)。

  • docker-compose.yml中提到的端口将在docker-compose启动的不同服务之间共享。
  • 端口将被暴露给主机到随机端口或给定端口。

我的docker-compose.yml看起来像:

mysql:image: mysql:5.7ports:- "3306"

如果我做docker-compose ps,它看起来像:

  Name                     Command               State            Ports-------------------------------------------------------------------------------------mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

暴露定义为:

公开端口而不将它们发布到主机-它们只能被链接的服务访问。只能指定内部端口。

端口不暴露给主机,只暴露给其他服务。

mysql:image: mysql:5.7expose:- "3306"

如果我做docker-compose ps,它看起来像:

  Name                  Command             State    Ports---------------------------------------------------------------mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

编辑

在Dockerfile的最新版本中,EXPOSE不再有任何操作影响,它只是提供信息。(另见

端口本节用于定义主机服务器和Docker容器之间的映射。

ports:- 10005:80

这意味着容器内运行的应用程序暴露在端口80。但外部系统/实体无法访问它,因此需要将其映射到主机服务器端口。

注意:您必须打开主机端口10005并修改防火墙规则以允许外部实体访问应用程序。

他们可以使用

超文本传输协议://{主机IP}: 10005

像这样的东西

曝光这专门用于定义在docker容器内运行应用程序的端口。

您也可以在dockerfile中定义它。通常,在dockerfile中定义EXPOSE是一种很好且广泛使用的做法,因为很少有人在默认80端口以外的其他端口上运行它们

我完全同意你的回答。我只是想提一下,暴露和端口之间的区别是docker安全概念的一部分。它与docker的网络齐头并进。例如:

想象一个具有Web前端和数据库后端的应用程序。外部世界需要访问Web前端(可能在端口上)80),但只有后端本身需要访问数据库主机和端口。使用用户定义的网桥,只需将Web端口打开,并且数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的桥到达它。

这是在docker中设置网络架构时的常见用例。例如,在默认的网桥网络中,外部世界无法访问端口。因此,您可以使用“端口”打开一个ingresSpoint。使用“暴露”可以定义网络内的通信。如果您想暴露默认端口,则无需在docker-compose文件中定义“暴露”。

端口

  1. 激活容器以侦听来自docker外部世界(可以是同一主机或不同机器)的指定端口,并且还可以访问docker内部的世界。
  2. 可以指定多个端口(这就是为什么端口不是端口)

在此处输入图片描述

暴露

  1. 激活容器以仅从docker内部的世界侦听特定端口,而不能访问docker外部的世界。
  2. 可以指定多个端口

在此处输入图片描述

港口

ports部分将发布主机上的端口。Docker将为从主机网络到容器的特定端口设置转发。默认情况下,这是使用用户空间代理进程(docker-proxy)实现的,该进程在第一个端口上监听,并转发到容器中,容器需要在第二点监听。如果容器没有在目标端口上监听,你仍然会看到主机上正在监听的东西,但是如果你尝试连接到该主机端口,则会得到一个拒绝的连接,从失败的转发到你的容器。

请注意,容器必须侦听所有网络接口,因为此代理不在容器的网络命名空间内运行,并且无法访问容器内的127.0.0.1。为此,IPv4方法是将您的应用程序配置为侦听0.0.0.0

另请注意,已发布的端口不会以相反的方向工作。您无法通过发布端口从容器连接到主机上的服务。相反,您会发现试图侦听已在使用的主机端口的docker错误。

暴露

暴露是留档的。它在映像上设置元数据,在运行时也在容器上设置元数据。通常,您使用EXPOSE指令在Dockerfile中配置它,它作为运行映像的用户的留档,让他们知道默认情况下您的应用程序将在哪些端口上侦听。使用组合文件配置时,此元数据仅在容器上设置。当您在映像或容器上运行docker inspect时,您可以看到暴露的端口。

有一些工具依赖于暴露的端口。在docker中,-P标志将把所有暴露的端口发布到主机上的临时端口上。如果您没有显式设置容器端口,还有各种反向代理会在向应用程序发送流量时默认使用暴露的端口。

除了那些外部工具,暴露对容器之间的网络没有任何影响。你只需要一个通用的docker网络,并连接到容器端口,就可以从一个容器访问另一个容器。如果该网络是用户创建的(例如,不是名为bridge的默认桥接网络),你可以使用DNS连接到其他容器。