docker-compose端口与expose之间有什么区别

时间:2016-11-25 09:39:10

标签: docker docker-compose

ports

中的exposedocker-compose.yml选项有何区别?

5 个答案:

答案 0 :(得分:357)

根据docker-compose reference

Ports定义为:

  

公开端口。指定两个端口(HOST:CONTAINER),或仅指定容器端口(将选择随机主机端口)。

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

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

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

如果我docker-compose ps,它将如下所示:

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

Expose定义为:

  

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

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

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

如果我docker-compose ps,它将如下所示:

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

答案 1 :(得分:32)

端口

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

enter image description here

暴露

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

enter image description here

答案 2 :(得分:9)

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

ports:
   - 10005:80

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

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

他们可以使用

  

http:// {主机IP}:10005

类似的东西

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

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

答案 3 :(得分:2)

端口

ports部分将在主机上发布端口。 Docker将为从主机网络到容器的特定端口设置转发。默认情况下,这是通过用户空间代理进程(docker-proxy)实现的,该进程在第一个端口上侦听,然后转发到需要在第二个点侦听的容器中。如果容器未在目标端口上进行侦听,您仍然会在主机上看到某些内容,但是如果尝试连接到该主机端口(从失败的转发到您的容器),连接将被拒绝。

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

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

暴露

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

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

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

答案 4 :(得分:1)

我完全同意之前的回答。 我只想提一下,暴露和端口之间的区别是docker安全概念的一部分。它与Docker的networking并驾齐驱。 例如:

  

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

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