为什么我需要“我需要”--揭露;Docker中的选项?

为什么我需要“我需要”--揭露;Docker中的选项?,docker,Docker,我对Docker中的“-expose”选项感到困惑,我不知道它实际上会做什么 当我在“docker run…”中指定它(例如--expose=1234)时,端口将暴露在哪里?我不认为我可以访问主机中的端口,如果我想要,我认为我需要的是“-p”,那么“-expose”实际上可以做什么 我想如果我想从主机访问容器端口,我需要的是,让容器中的服务监听端口,使用“docker run”中的“-p”选项在主机上发布端口。或者在这种情况下,我仍然必须使用“-expose”来公开端口?-p将允许您映射已公开的

我对Docker中的“-expose”选项感到困惑,我不知道它实际上会做什么

当我在“docker run…”中指定它(例如--expose=1234)时,端口将暴露在哪里?我不认为我可以访问主机中的端口,如果我想要,我认为我需要的是“-p”,那么“-expose”实际上可以做什么


我想如果我想从主机访问容器端口,我需要的是,让容器中的服务监听端口,使用“docker run”中的“-p”选项在主机上发布端口。或者在这种情况下,我仍然必须使用“-expose”来公开端口?

-p
将允许您映射已公开的端口(如Dockerfile中设置的)

但是,如果该端口未在Dockerfile及其生成的映像中公开,您仍然可以使用
--EXPOSE

发件人:

EXPOSE
指令定义了提供服务的初始传入端口。这些端口可用于容器内的进程。操作员可以使用
--expose
选项添加到公开的端口

这是一种通过在运行时公开端口来覆盖图像定义(未公开端口)的方法。
实际上,“覆盖”是一个错误的术语,如和中所述:

除了
EXPOSE
指令外,图像开发人员没有 对网络有很大的控制权。
EXPOSE
指令定义了 提供服务的初始传入端口。这些端口可用 容器内的进程。
操作员可以使用
--expose
选项添加到公开端口中

(“add”是这里的键:您可以在运行时声明其他端口)

正如我在评论中提到的,这与
EXPOSE
端口上的活动无关(它不保证进程正在侦听容器中的端口)

这只是一种声明端口的方法,该端口将接受数据包。

您的测试显示了什么?
-p
做你想做的事吗?两个,入站和出站。@Eric是的,这就是想法。EXPOSE允许其他容器访问该端口(或用户将所述端口映射到主机端口)。不暴露表示端口在容器外部不可见。@不,两个问题(暴露和侦听)是完全独立的。EXPOSE意味着另一个容器(或主机,如果映射)可以查询端口。但是如果没有人听这个端口,你将得不到答案。EXPOSE并不能保证关于如何管理该端口的任何内容。它只是向外界开放。@Eric是的,这与倾听无关。这是一种声明开放端口()的正当方法:该端口现在将接受数据包。仅此而已。@Eric-p用于映射暴露的端口。如果该端口最初没有公开,则发布将失败。@SaadMalik否:公开而不发布是有意义的:它允许另一个容器访问您公开的端口,同时阻止任何用户访问同一端口(因为它没有发布)。因此需要
--expose