Docker 中的“暴露”和“发布”有什么区别?

2023-11-23

我正在尝试 Dockerfile,我想我理解了大部分逻辑。但是,在这种情况下,我没有看到“公开”和“发布”端口之间的区别。

我首先看到的所有教程都包括EXPOSEDockerfile 中的命令:

...
EXPOSE 8080
...

然后他们从此 Dockerfile 构建一个映像:

$ docker build -t an_image - < Dockerfile

进而publish运行图像时与上面相同的端口:

$ docker run -d -p 8080 an_image

或使用发布所有端口

$ docker run -d -P an_image

如果 Dockerfile 无论如何都会发布它,那么在 Dockerfile 中公开端口有什么意义呢?是否需要先公开端口,以及not稍后发布吗?实际上,我想指定创建映像时将在 Dockerfile 中使用的所有端口,然后不再打扰它们,只需使用以下命令运行它们:

$ docker run -d an_image

这可能吗?


基本上,您有三(四)个选择:

  1. 均未指定EXPOSE nor -p
  2. 仅指定EXPOSE
  3. Specify EXPOSE and -p
  4. 仅指定-p这隐含地做了EXPOSE
  1. 如果您两者都没有指定EXPOSE nor -p,容器中的服务只能从inside容器本身。

  2. If you EXPOSE一个端口,容器中的服务不能从 Docker 外部访问,而是可以从其他 Docker 容器内部访问。所以这有利于容器间的通信。

  3. If you EXPOSE and -p一个端口,容器中的服务可以从任何地方访问,甚至在 Docker 之外。

  4. 如果你这样做-p, 但不要EXPOSE,Docker做了一个隐式的EXPOSE。这是因为如果端口向公众开放,它也会自动向其他 Docker 容器开放。因此-p包括EXPOSE。这实际上与 3) 相同。

恕我直言,两者分开的原因是因为:

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

The 文档明确指出:

The EXPOSE指令公开在链接内使用的端口。

它还向您指出如何链接容器(遗留功能),这基本上就是我谈到的容器间通信。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 中的“暴露”和“发布”有什么区别? 的相关文章

随机推荐