我正在用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_映像
这可能吗
基本上,您有三种选择:
- 既不指定
EXPOSE也不指定-p - 仅指定
EXPOSE - 指定
EXPOSE和-p
1) 如果既不指定EXPOSE也不指定-p,则容器中的服务将只能从容器本身的内部访问
2) 如果EXPOSEa port,则容器中的服务不能从Docker外部访问,只能从其他Docker容器内部访问。因此,这有利于容器间的通信
3) 如果公开和-p端口,则容器中的服务可以从任何地方访问,甚至可以从Docker外部访问
两者分开的原因是因为:
- 选择主机端口取决于主机,因此不属于Dockerfile(否则将取决于主机)
- 如果容器中的服务可以从其他容器访问,通常就足够了
文件明确规定:
EXPOSE指令公开用于链接的端口
它还向您指出了如何链接容器,这基本上就是我提到的容器间通信
PS:如果您执行-p,但不执行公开,Docker将执行隐式公开。这是因为如果一个港口向公众开放,它也会自动向其他Docker集装箱开放。因此-p包括公开。这就是为什么我没有把它列为第四个案例