我正在试验 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
这可能吗?
原文由 user1496984 发布,翻译遵循 CC BY-SA 4.0 许可协议
基本上,您有三(四)个选项:
既不指定
EXPOSE
也不指定 ----p
只指定
EXPOSE
指定
EXPOSE
和-p
仅指定
-p
隐式执行EXPOSE
如果您既未指定
EXPOSE
也未指定-p
,则容器中的服务将只能从容器本身 内部 访问。如果你
EXPOSE
一个端口,容器中的服务不能从 Docker 外部访问,但可以从其他 Docker 容器内部访问。所以这有利于容器间的通信。如果你
EXPOSE
和-p
一个端口,容器中的服务可以从任何地方访问,甚至在 Docker 之外。如果你这样做
-p
,但不这样做EXPOSE
,Docker 会隐含EXPOSE
。这是因为如果一个端口对公众开放,它也会自动对其他 Docker 容器开放。因此-p
包括EXPOSE
。这实际上与 3) 相同。两者分开的原因是恕我直言,因为:
该 文档 明确指出:
它还为您指出如何 链接容器,这基本上就是我所说的容器间通信。