小编典典

Docker 中的“公开”和“发布”有什么区别?

all

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

我首先看到的所有教程都将EXPOSE命令包含在 Dockerfile 中:

...
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

这可能吗?


阅读 102

收藏
2022-03-04

共1个答案

小编典典

基本上,您有三个选择:

  1. 既不指定EXPOSE也不-p
  2. 只指定EXPOSE
  3. 指定EXPOSE-p

1) 如果您既不指定EXPOSE也不指定-p,则容器中的服务将只能从容器本身 内部访问。

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

3)如果你EXPOSE-p一个端口,容器中的服务可以从任何地方访问,甚至在 Docker 之外。

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

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

文档明确指出:

EXPOSE指令公开了在链接中使用的端口。

它还为您指出如何链接容器,这基本上就是我所说的容器间通信。

PS:如果你这样做-p,但不这样做EXPOSE,Docker 会隐含EXPOSE. 这是因为如果一个端口对公众开放,它也会自动对其他
Docker 容器开放。因此-p包括EXPOSE. 这就是为什么我没有将其列为第四种情况。

2022-03-04