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

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

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

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

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

但是如果这个端口没有在Dockerfile及其结果图像中EXPOSE,你仍然可以用--expose

从docker运行 :

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

这是通过在运行时暴露该端口来覆盖图像定义(不暴露端口)的一种方法。
实际上,“覆盖”是错误的,正如PR 14625和PR 15675中提到的那样 :

EXPOSE指令外,图像开发人员对networking控制不够。 EXPOSE指令定义了提供服务的初始传入端口。 这些端口是容器内的可用进程。
操作员可以使用--expose选项来添加到暴露的端口

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

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