为什么 Docker 中需要“--expose”选项?

Eri*_*ric 5 docker

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

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

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

Von*_*onC 4

-p将允许您映射已经暴露的端口(如 Dockerfile 中设置)。

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

docker 运行

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

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

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

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

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