我正在试验 Dockerfiles,我想我理解了大部分逻辑。但是,在这种情况下,我看不出“公开”和“发布”端口之间的区别。
我首先看到的所有教程都将EXPOSE命令包含在 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
这可能吗?
基本上,您有三个选择:
-p
1) 如果您既不指定EXPOSE也不指定-p,则容器中的服务将只能从容器本身 内部访问。
2)如果你EXPOSE是一个端口,容器中的服务不能从 Docker 外部访问,但可以从其他 Docker 容器内部访问。所以这有利于容器间的通信。
3)如果你EXPOSE和-p一个端口,容器中的服务可以从任何地方访问,甚至在 Docker 之外。
两者分开的原因是恕我直言,因为:
该文档明确指出:
该EXPOSE指令公开了在链接中使用的端口。
它还为您指出如何链接容器,这基本上就是我所说的容器间通信。
PS:如果你这样做-p,但不这样做EXPOSE,Docker 会隐含EXPOSE. 这是因为如果一个端口对公众开放,它也会自动对其他 Docker 容器开放。因此-p包括EXPOSE. 这就是为什么我没有将其列为第四种情况。