Answers:
露出端口。要么指定两个端口(HOST:CONTAINER),要么仅指定容器端口(将选择一个随机主机端口)。
我的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
公开端口而不将其发布到主机上-只有链接的服务才能访问它们。只能指定内部端口。
端口不暴露给主机,仅暴露给其他服务。
mysql:
image: mysql:5.7
expose:
- "3306"
如果我这样做docker-compose ps
,它将看起来像:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
Dockerfiles中的相似:“ EXPOSE指令实际上并未发布端口。它只是一种文档类型...” docs.docker.com/engine/reference/builder/#expose
docker-compose run
,则默认情况下docker-compose.yml
将忽略其中的端口定义。使用docker-compose up
或提供参数--service-ports
端口:
暴露:
端口 此部分用于定义主机服务器和Docker容器之间的映射。
ports:
- 10005:80
这意味着在容器内部运行的应用程序在端口80处公开。但是外部系统/实体无法访问它,因此需要将其映射到主机服务器端口。
注意:您必须打开主机端口10005并修改防火墙规则,以允许外部实体访问应用程序。
他们可以使用
http:// {主机IP}:10005
像这样的东西
EXPOSE 这专门用于定义在Docker容器中运行应用程序的端口。
您也可以在dockerfile中定义它。通常,在dockerfile中定义EXPOSE是一种良好且广泛使用的做法,因为很少有人在默认80端口以外的其他端口上运行它们
本ports
节将在主机上发布端口。Docker将为从主机网络到容器的特定端口设置转发。默认情况下,这是通过用户空间代理进程(docker-proxy
)实现的,该进程在第一个端口上进行侦听,然后转发到需要在第二个点上进行侦听的容器中。如果容器未在目标端口上侦听,您仍会在主机上看到某些内容,但是如果尝试连接到该主机端口,则从失败的转发到容器,连接将被拒绝。
请注意,容器必须在所有网络接口上侦听,因为此代理未在容器的网络名称空间中运行,并且无法在容器内部达到127.0.0.1。IPv4的方法是将应用程序配置为侦听0.0.0.0
。
另请注意,已发布的端口不能以相反的方向工作。您无法通过发布端口从容器连接到主机上的服务。相反,您会发现尝试侦听已在使用的主机端口的docker错误。
公开是文档。它在图像上以及运行时在容器上设置元数据。通常,您使用EXPOSE
指令在Dockerfile中对其进行配置,并且它充当运行映像的用户的文档,以使他们知道默认情况下您的应用程序将在哪些端口上侦听。当配置有撰写文件时,此元数据仅在容器上设置。docker inspect
在映像或容器上运行时,可以看到暴露的端口。
有一些依赖公开端口的工具。在docker中,该-P
标志会将所有公开的端口发布到主机上的临时端口上。如果没有显式设置容器端口,则当向应用程序发送流量时,还有许多反向代理默认使用暴露端口。
除了那些外部工具之外,暴露对容器之间的网络完全没有影响。您只需要一个公共的docker网络并连接到容器端口,即可从另一个容器访问一个容器。如果该网络是用户创建的(例如,不是名为的默认桥接网络bridge
),则可以使用DNS连接到其他容器。
我完全同意之前的回答。我只想提一下,暴露和端口之间的区别是docker安全概念的一部分。它与docker 的网络并驾齐驱。例如:
想象一个具有Web前端和数据库后端的应用程序。外界需要访问Web前端(也许在端口80上),但是只有后端本身需要访问数据库主机和端口。使用用户定义的网桥,只需打开Web端口,并且数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的网桥到达它。
这是在Docker中设置网络架构时的常见用例。因此,例如在默认网桥网络中,无法从外部访问端口。因此,您可以使用“端口”打开一个入口点。通过使用“暴露”,您可以定义网络内的通信。如果要公开默认端口,则无需在docker-compose文件中定义“公开”。
expose
的docker-compose
?据我所知,您无需指定暴露即可使链接服务可以访问端口。