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

docker compose端口与expose端口之间有什么区别,docker,docker-compose,Docker,Docker Compose,根据 定义如下: 暴露端口。指定两个端口(主机:容器),或仅指定容器端口(将选择一个随机主机端口) docker-compose.yml中提到的端口将在docker-compose启动的不同服务之间共享 端口将向主机公开到随机端口或给定端口 我的docker compose.yml看起来像: mysql: image: mysql:5.7 ports: - "3306" 如果我使用docker compose ps,它将看起来像: Name

根据

定义如下: 暴露端口。指定两个端口(主机:容器),或仅指定容器端口(将选择一个随机主机端口)

  • 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
  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp
定义如下: 公开端口而不将其发布到主机-它们只能由链接的服务访问。只能指定内部端口

端口不向主机公开,只向其他服务公开

mysql:
  image: mysql:5.7
  expose:
    - "3306"
如果我使用
docker compose ps
,它将看起来像:

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp
  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp
编辑 在Dockerfile的最新版本中,
EXPOSE
不再有任何操作影响,它只是提供信息。()

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

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

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

他们可以使用

http://{host IP}:10005

像这样的

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

ports:
   - 10005:80

您也可以在dockerfile中定义它。一般来说,在dockerfile中定义EXPOSE是一种良好且广泛使用的做法,因为除了默认的80端口之外,很少有人在其他端口上运行它们。 我只想提到暴露和端口之间的区别是docker安全概念的一部分。它与docker的工作密切相关。 例如:

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

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

端口

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

  • 激活容器以仅从docker内部世界侦听特定端口,而不从docker外部世界侦听特定端口
  • 可以指定多个端口
  • 端口
    端口
    部分将在主机上发布端口。Docker将为从主机网络到容器的特定端口设置转发。默认情况下,这是通过用户空间代理进程(
    docker proxy
    )实现的,该进程侦听第一个端口,然后转发到需要侦听第二个端口的容器中。如果容器未在目标端口上侦听,您仍将看到主机上正在侦听的内容,但如果您尝试连接到该主机端口,则会从失败的转发到容器中,连接被拒绝

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

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

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

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


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

    有没有可能解释一下有哪些优势