为什么在Docker中需要使用"--expose"选项?

5
我对Docker中的"--expose"选项感到困惑,不知道它实际上会做什么。
当我在"docker run..."中指定它(例如,--expose=1234),端口将会被暴露在哪里?我认为我不能访问主机上的端口,如果我想要这样做,我认为我需要使用"-p",那么"--expose"实际上会做什么呢?
我认为,如果我想从主机访问容器端口,我需要让容器中的服务监听该端口,在"docker run"中使用"-p"选项发布主机上的端口。或者在这种情况下,我仍然需要使用"--expose"来暴露端口吗?

你的测试结果是什么?-p参数是否符合你的期望?这两个选项是用于不同方向的,分别是入站和出站。 - msw
1个回答

4

-p选项可以将已在Dockerfile中设置的EXPOSE端口映射出来。

但是如果该端口未在Dockerfile及其生成的镜像中设置为EXPOSE,则仍然可以使用--expose暴露它:

来源于docker run

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

这是一种通过在运行时暴露该端口来覆盖图像定义(未公开端口的)的方法。实际上,“覆盖”这个词是错误的,如PR 14625PR 15675所述:

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

(这里“添加”关键字是重点:您可以在运行时声明附加端口)

正如我在评论中提到的,这与EXPOSE端口上的活动无关(它不能保证容器内进程正在侦听该端口)
这只是一种声明开放端口的方法,即将接受数据包的端口。


1
@Eric 是的,那就是想法。EXPOSE 允许其他容器访问该端口(或者用户将该端口映射到主机端口)。没有 EXPOSE 就意味着该端口在容器外不可见。 - VonC
1
@Eric 不,这两个问题(暴露和监听)是完全独立的。EXPOSE 表示另一个容器(或映射到主机上)可以查询该端口。但是,如果没有人监听该端口,你将得不到任何答案。EXPOSE 并不能保证关于如何管理该端口的任何内容。它只是为了将其开放给外部世界。 - VonC
1
@Eric 是的,这和监听无关。 这只是声明打开端口(https://en.wikipedia.org/wiki/Open_port)的一种方法:该端口现在将接受数据包。 就这些。 - VonC
1
@Eric -p 是用于映射已公开的端口。如果该端口一开始没有被公开,发布将会失败。 - VonC
1
@SaadMalik 不发布而暴露是有意义的:它允许另一个容器访问您暴露的端口,同时防止任何用户访问相同的端口(因为它没有被发布)。因此需要使用 --expose - VonC
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接