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 proxy
)实现的,该进程侦听第一个端口,然后转发到需要侦听第二个端口的容器中。如果容器未在目标端口上侦听,您仍将看到主机上正在侦听的内容,但如果您尝试连接到该主机端口,则会从失败的转发到容器中,连接被拒绝
ports:
- 10005:80
注意,容器必须侦听所有网络接口,因为此代理未在容器的网络命名空间内运行,并且无法到达容器内的127.0.0.1。IPv4方法是将应用程序配置为侦听0.0.0.0
还请注意,已发布的端口不会以相反的方向工作。无法通过发布端口从容器连接到主机上的服务。相反,在尝试侦听已在使用的主机端口时,您会发现docker错误
暴露
公开是文档。它在映像上设置元数据,运行时也在容器上设置元数据。通常,您可以在Dockerfile中使用EXPOSE
指令对此进行配置,并将其作为运行映像的用户的文档,让他们知道默认情况下应用程序将侦听哪些端口。当使用组合文件配置时,此元数据仅在容器上设置。在映像或容器上运行docker inspect
时,可以看到暴露的端口
有一些工具依赖于暴露的端口。在docker中,-P
标志将把所有暴露的端口发布到主机上的临时端口上。如果未显式设置容器端口,则在向应用程序发送流量时,还有各种反向代理将默认使用公开端口
除了这些外部工具之外,expose对容器之间的网络没有任何影响。您只需要一个公共docker网络并连接到容器端口,就可以从一个容器访问另一个容器。如果该网络是用户创建的(例如,不是名为
网桥
的默认网桥网络),则可以使用DNS连接到其他容器 有没有可能解释一下有哪些优势