docker中“揭露”和“发布”的区别

我正在试验Dockerfiles,我想我理解了大部分的逻辑。 但是,在这方面我并没有看到“揭露”和“发布”港口的区别。

我所见过的所有教程都包含了EXPOSE中的EXPOSE命令:

 ... EXPOSE 8080 ... 

然后他们从这个Dockerfile构build一个图像:

 $ docker build -t an_image - < Dockerfile 

然后在运行映像时发布与上面相同的端口:

 $ docker run -d -p 8080 an_image 

或者使用发布所有端口

 $ docker run -d -P an_image 

在Dockerfile中公开端口的意义是什么? 会不会有需要首先公开一个端口,而不是以后发布? 实际上,我想在创build映像时指定我将在Dockerfile中使用的所有端口,然后不再打扰他们,只需使用以下命令来运行它们:

 $ docker run -d an_image 

这可能吗?

基本上,你有三个select:

  • 既不指定EXPOSE也不指定-p
  • 只指定EXPOSE
  • 指定EXPOSE-p

如果您不指定其中的任何一项,则容器中的服务将无法从容器内部的任何地方访问。

如果你EXPOSE一个端口,容器中的服务不能从外部的Docker访问,而是从其他的Docker容器中访问。 所以这对于集装箱间通信是有利的。

如果你EXPOSE-p一个端口,容器中的服务可以从任何地方访问,甚至在Docker之外。

为什么两个分开的原因是恕我直言,因为

  • select主机端口取决于主机,因此不属于Dockerfile(否则将取决于主机),
  • 如果一个容器中的服务可以从其他容器访问,通常就足够了。

该文件明确指出:

EXPOSE指令暴露链接内使用的端口。

它也指出你如何链接容器 ,这基本上是我谈到的集装箱间通信。

PS:如果你做-p ,但是不EXPOSE ,Docker会做一个隐式的EXPOSE 。 这是因为如果一个端口对公众开放,它也会自动打开到其他Docker容器。 因此-p包括EXPOSE 。 这就是为什么我没有把它列为第四种情况。

EXPOSE允许您定义私有(容器)和公共(主机)端口,以在映像构build时为容器运行时显示。 公共端口是可选的,如果没有指定公共端口,Docker会在主机上select一个随机端口来暴露Dockerfile上指定的容器端口。

一个好的实践是不指定公共端口,因为它限制每个主机只有一个容器(第二个容器将抛出已经使用的端口)。

您可以在docker run使用-p来控制公开的容器端口可以连接的端口。

无论如何,如果你不使用EXPOSE-p ,没有端口将被暴露。

如果您始终在EXPOSE docker run使用-p ,则不需要EXPOSE但是如果使用EXPOSE docker run命令可能更简单,如果您不在乎主机上公开哪个端口,或者如果您确定只有一个容器将被加载。

大多数人使用docker与networking组成。 该文件指出:

Dockernetworkingfunction支持创buildnetworking,而无需公开networking中的端口,有关详细信息,请参阅此function的概述)。

这意味着如果您使用networking进行容器之间的通信,则不必担心公开端口。

您使用Dockerfile中的EXPOSE关键字或docker run中的–expose标志公开端口。 公开端口是一种logging使用哪个端口的方法,但并不实际映射或打开任何端口。 公开端口是可选的。

来源: github提交