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

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

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

。。。
曝光8080
...

然后,他们从该Dockerfile生成一个映像:

$docker build-t an_image-<Dockerfile

然后在运行映像时发布与上面相同的端口:

$docker run-d-p8080一张图片

或使用发布所有端口

$docker run-d-P an_image

如果要发布Dockerfile中的端口,那么在Dockerfile中公开该端口有什么意义?是否需要先公开一个端口,然后再发布它?实际上,我希望在创建映像时指定Dockerfile中使用的所有端口,然后不再使用它们,只需通过以下方式运行它们:

$docker run-d a_映像

这可能吗

基本上,您有三种选择:

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

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

2) 如果EXPOSEa port,则容器中的服务不能从Docker外部访问,只能从其他Docker容器内部访问。因此,这有利于容器间的通信

3) 如果公开-p端口,则容器中的服务可以从任何地方访问,甚至可以从Docker外部访问

两者分开的原因是因为:

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

文件明确规定:

EXPOSE指令公开用于链接的端口

它还向您指出了如何链接容器,这基本上就是我提到的容器间通信

PS:如果您执行-p,但不执行公开,Docker将执行隐式公开。这是因为如果一个港口向公众开放,它也会自动向其他Docker集装箱开放。因此-p包括公开。这就是为什么我没有把它列为第四个案例

发表评论