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

bib*_*tha 352 docker docker-compose

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

bib*_*tha 435

根据docker-compose参考,

端口定义为:

暴露端口.指定两个端口(HOST:CONTAINER),或仅指定容器端口(将选择随机主机端口).

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

docker-compose.yml看起来像:

mysql:
  image: mysql:5.7
  ports:
    - "3306"
Run Code Online (Sandbox Code Playgroud)

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

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp
Run Code Online (Sandbox Code Playgroud)

暴露定义为:

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

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

mysql:
  image: mysql:5.7
  expose:
    - "3306"
Run Code Online (Sandbox Code Playgroud)

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

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp
Run Code Online (Sandbox Code Playgroud)

  • 是否有可能解释在`docker-compose`中指定`expose`有什么好处?据我所知,您不需要指定公开以使链接服务可以访问端口. (14认同)
  • @Juicy我猜它类似于Dockerfiles中的`expose`:"EXPOSE指令实际上并没有发布端口.它可以作为一种文档......"https://docs.docker.com/engine/reference/builder /#暴露 (6认同)
  • 它难道不告诉暴露的端口仅可用于同一docker网络中的服务吗(大多数部分的链接已被替换)? (3认同)
  • 请记住,如果您使用“docker-compose run”,则“docker-compose.yml”中的端口定义默认被**忽略**。使用“docker-compose up”或提供参数“--service-ports” (3认同)
  • 端口是否会覆盖防火墙级别的任何设置?我只是注意到我没有在防火墙上为 mysql 开放端口,但它们可以远程访问。我将端口设置为“3306:3306”而不是公开。 (2认同)

Meh*_*lik 99

端口

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

在此处输入图片说明

暴露

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

在此处输入图片说明

  • 初学者的最佳答案,开门见山! (3认同)
  • 请注意,暴露允许多个端口-https://docs.docker.com/compose/compose-file/#expose-但是您仅提供内部端口,而不是内部+外部 (2认同)

sor*_*one 18

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

ports:
   - 10005:80
Run Code Online (Sandbox Code Playgroud)

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

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

他们可以使用

http:// {host IP}:10005

这样的事情

EXPOSE 这专门用于定义在docker容器中运行应用程序的端口.

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


BMi*_*tch 8

港口

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

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

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

暴露

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

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

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

  • 听着,伙计们!这个答案可能看起来不太好,但信息非常丰富。 (3认同)

med*_*ech 5

我完全同意之前的答案。我只想提一下,暴露和端口之间的区别是 docker 中安全概念的一部分。它与docker的网络密切相关。例如:

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

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