+-

我正在尝试使用Dockerfiles,我想我理解大部分逻辑.但是,我没有看到在这种情况下“暴露”和“发布”端口之间的区别.
我首先看到的所有教程都包含Dockerfile中的EXPOSE命令:
...
EXPOSE 8080
...
然后他们从这个Dockerfile构建一个图像:
$docker build -t an_image - < Dockerfile
然后在运行映像时发布与上面相同的端口:
$docker run -d -p 8080 an_image
或使用发布所有端口
$docker run -d -P an_image
暴露Dockerfile中的端口有什么意义,如果它仍然会被发布?是否需要首先公开一个端口,而不是稍后发布它?实际上,我想在创建映像时指定我将在Dockerfile中使用的所有端口,然后再不打扰它们,只需运行它们:
$docker run -d an_image
这可能吗?
最佳答案
基本上,您有三种选择:
>既不指定EXPOSE也不指定-p
>仅指定EXPOSE
>指定EXPOSE和-p
1)如果既未指定EXPOSE也未指定-p,则只能从容器内部访问容器中的服务.
2)如果EXPOSE一个端口,容器中的服务不能从Docker外部访问,而是从其他Docker容器内部访问.所以这对于容器间通信很有用.
3)如果EXPOSE和-p端口,容器中的服务可以从任何地方访问,甚至可以在Docker外部访问.
两者分开的原因是恕我直言,因为:
>选择主机端口取决于主机,因此不属于Dockerfile(否则它将取决于主机),
>如果容器中的服务可以从其他容器访问,通常就足够了.
documentation明确指出:
The
EXPOSEinstruction exposes ports for use within links.
它还指出了如何到link containers,这基本上是我所谈到的容器间通信.
PS:如果你做-p但不进行EXPOSE,Docker会进行隐式EXPOSE.这是因为如果一个端口对公众开放,它也会自动向其他Docker容器开放.因此-p包括EXPOSE.这就是为什么我没有把它作为第四种情况列在上面.
点击查看更多相关文章
转载注明原文:Docker中“expose”和“publish”有什么区别? - 乐贴网