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提交