docker-compose.yml中的端口和公开选项之间有什么区别?
根据docker compose参考,
端口定义为:
露出端口。要么指定两个端口(HOST:CONTAINER),要么只指定容器端口(将选择一个随机主机端口)。
docker-compose.yml中提到的端口将在docker-coompose启动的不同服务之间共享。端口将暴露给主机的随机端口或给定端口。
我的docker-compose.yml看起来像:
mysql:
image: mysql:5.7
ports:
- "3306"
如果我做docker合成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合成ps,它将看起来像:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
Edit
在Dockerfile的最新版本中,EXPOSE不再具有任何操作影响,它只是提供信息。(另请参见)
端口本节用于定义主机服务器和Docker容器之间的映射。
ports:
- 10005:80
这意味着在容器内运行的应用程序在端口80处暴露。但外部系统/实体无法访问它,因此需要将其映射到主机服务器端口。
注意:您必须打开主机端口10005并修改防火墙规则,以允许外部实体访问应用程序。
他们可以使用
http://{host IP}:10005
像这样的东西
暴露,暴露它专门用于定义docker容器中运行应用程序的端口。
您也可以在dockerfile中定义它。通常,在dockerfile中定义EXPOSE是一种良好且广泛使用的做法,因为很少有人在默认80端口以外的其他端口上运行它们
我完全同意之前的答案。我只想提一下,暴露和端口之间的区别是docker中安全概念的一部分。它与码头工人的网络联系紧密相连。例如:
设想一个具有web前端和数据库后端的应用程序。外部世界需要访问web前端(可能在端口上80),但只有后端本身需要访问数据库主机和端口。使用用户定义的网桥,只需要将web端口并且数据库应用程序不需要打开任何端口,因为web前端可以通过用户定义的桥到达它。
这是在docker中设置网络架构时的常见用例。因此,例如在默认网桥网络中,不能从外部世界访问端口。因此,您可以使用“端口”打开入口点。使用“暴露”可以定义网络内的通信。如果要公开默认端口,则无需在docker compose文件中定义“expose”。
端口:
激活容器以侦听来自docker外部世界(可以是同一主机或不同计算机)以及docker内部世界的指定端口。可以指定多个端口(这就是为什么端口不是端口)
暴露:
激活容器以仅从docker内部的世界监听特定端口,而不从docker外部的世界监听。可以指定多个端口
端口
端口部分将在主机上发布端口。Docker将为从主机网络到容器的特定端口设置转发。默认情况下,这是通过用户空间代理进程(docker代理)实现的,该进程侦听第一个端口,并转发到需要侦听第二个端口的容器中。如果容器未在目标端口上侦听,您仍会看到主机上有侦听的内容,但如果您尝试连接到该主机端口,则连接被拒绝,从失败转发到容器。
注意,容器必须在所有网络接口上侦听,因为此代理未在容器的网络命名空间内运行,并且在容器内无法达到127.0.0.1。IPv4方法是将应用程序配置为侦听0.0.0.0。
还要注意,已发布的端口在相反的方向上不起作用。您无法通过发布端口从容器连接到主机上的服务。相反,您会发现docker错误试图侦听已在使用的主机端口。
暴露
暴露是文档。它在图像上设置元数据,运行时也在容器上设置元数据。通常,您使用EXPOSE指令在Dockerfile中配置它,它作为运行映像的用户的文档,让他们知道默认情况下应用程序将侦听哪些端口。当使用合成文件配置时,此元数据仅在容器上设置。当您对图像或容器运行docker检查时,可以看到暴露的端口。
有一些工具依赖于暴露的端口。在docker中,-P标志将所有暴露的端口发布到主机上的临时端口上。如果没有显式设置容器端口,那么在向应用程序发送流量时,还有各种反向代理将默认使用公开端口。
除了这些外部工具,expose对容器之间的网络没有任何影响。您只需要一个通用的码头网络,并连接到容器端口,就可以从另一个容器访问一个容器。如果该网络是用户创建的(例如,不是名为bridge的默认网桥网络),则可以使用DNS连接到其他容器。
推荐文章
- 如何从私有docker注册表中删除图像?
- 创建多个标签码头镜像
- Docker -如何将文件从镜像复制到主机?
- 如何防止docker在系统启动时自动启动容器?
- 什么是Docker映像“层”?
- 无法从docker-compose连接到docker
- Docker错误无法删除Docker容器,冲突:无法删除存储库引用
- 如何让容器在Kubernetes上运行?
- 如何备份docker容器的数据卷?
- Docker入口点运行bash脚本被“拒绝权限”
- 我如何复制Docker作为非根?
- 如何禁用容器上的自动重启?
- 如何传递参数到Dockerfile?
- 如何知道docker是否已经登录到docker注册服务器
- 为什么安装了Docker而没有安装Docker Compose?