我正在尝试 Dockerfile,我想我理解了大部分逻辑。但是,在这种情况下,我没有看到“公开”和“发布”端口之间的区别。
我首先看到的所有教程都包括EXPOSE
Dockerfile 中的命令:
...
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
这可能吗?
基本上,您有三(四)个选择:
- 均未指定
EXPOSE
nor -p
- 仅指定
EXPOSE
- Specify
EXPOSE
and -p
- 仅指定
-p
这隐含地做了EXPOSE
-
如果您两者都没有指定EXPOSE
nor -p
,容器中的服务只能从inside容器本身。
-
If you EXPOSE
一个端口,容器中的服务不能从 Docker 外部访问,而是可以从其他 Docker 容器内部访问。所以这有利于容器间的通信。
-
If you EXPOSE
and -p
一个端口,容器中的服务可以从任何地方访问,甚至在 Docker 之外。
-
如果你这样做-p
, 但不要EXPOSE
,Docker做了一个隐式的EXPOSE
。这是因为如果端口向公众开放,它也会自动向其他 Docker 容器开放。因此-p
包括EXPOSE
。这实际上与 3) 相同。
恕我直言,两者分开的原因是因为:
- 选择主机端口取决于主机,因此不属于 Dockerfile(否则它将取决于主机),
- 通常,如果容器中的服务可以从其他容器访问就足够了。
The 文档明确指出:
The EXPOSE
指令公开在链接内使用的端口。
它还向您指出如何链接容器(遗留功能),这基本上就是我谈到的容器间通信。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)