我正在试验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明确指出:



    它还向您指出如何link containers,它基本上是我所谈论的容器间通信。

    PS:如果您执行-p,但不执行EXPOSE,则Docker会执行隐式EXPOSE。这是因为如果某个端口向公众开放,那么它也会自动向其他Docker容器开放。因此-p包括EXPOSE。这就是为什么我没有在上面将其列为第四种情况。

    10-06 10:16