2016-02-27 59 views
1

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

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

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

+0

您的测试显示了什么? '-p'做你想要的吗?这两个[选项适用于不同的方向](https://docs.docker.com/engine/reference/run/#expose-incoming-ports),入站和出站。 – msw

回答

1

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

但如果该端口未在Dockerfile及其导致的图像EXPOSE'd,你仍然可以--expose揭露它:

docker run

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

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

随着EXPOSE指令外,图像开发人员尚未 拿到过网络太多的控制。指令EXPOSE定义了提供服务的初始传入端口号 。这些端口在容器内部可用 进程。
运营商可以使用--expose选项添加到暴露端口

(“添加”在这里是关键:你可以在运行时声明额外端口)

正如我在评论中提到,这有什么好做的EXPOSE端口上的活动(它不保证一个进程正在监听容器内的端口)
这只是一种声明open port的方法,即接受数据包的端口。

+0

谢谢,这也意味着即使在容器中运行的服务在端口上侦听,如果我不通过EXPOSE或“--expose”公开它,我不能通过主机中的“-p”发布该端口?即,EXPOSE还是“--expose”是“-p”的前提条件? – Eric

+1

@Eric是的,就是这个想法。 EXPOSE允许其他容器访问该端口(或者用于将所述端口映射到主机端口)。没有EXPOSE意味着端口在容器外不可见。 – VonC

+0

但它需要容器才能合作,对吧?我的意思是,如果端口被EXPOSE或“--expose”暴露,但在容器中运行的服务实际上不在该端口上侦听呢?有没有一种机制来保证暴露的端口确实在容器内被监听? – Eric

相关问题