Docker “与”的区别是什么;揭露;及;出版「;在码头?
我正在用Dockerfiles做实验,我想我理解大部分逻辑。但是,在这种情况下,我看不到“公开”和“发布”端口之间的区别 我首先看到的所有教程都包括Dockerfile中的Docker “与”的区别是什么;揭露;及;出版「;在码头?,docker,Docker,我正在用Dockerfiles做实验,我想我理解大部分逻辑。但是,在这种情况下,我看不到“公开”和“发布”端口之间的区别 我首先看到的所有教程都包括Dockerfile中的EXPOSE命令: ... EXPOSE 8080 ... $ docker build -t an_image - < Dockerfile 然后,他们从该Dockerfile生成一个映像: ... EXPOSE 8080 ... $ docker build -t an_image - < Dockerf
EXPOSE
命令:
...
EXPOSE 8080
...
$ docker build -t an_image - < Dockerfile
然后,他们从该Dockerfile生成一个映像:
...
EXPOSE 8080
...
$ docker build -t an_image - < Dockerfile
或使用发布所有端口
$ docker run -d -P an_image
如果要发布Dockerfile中的端口,那么在Dockerfile中公开该端口有什么意义?有没有必要先公开一个端口,然后再发布它?实际上,我希望在创建映像时指定Dockerfile中使用的所有端口,然后不再使用它们,只需通过以下方式运行它们:
$ docker run -d an_image
这可能吗?基本上,您有三种选择:
EXPOSE
也不指定-p
EXPOSE
EXPOSE
和-p
EXPOSE
也不指定-p
,则只能从容器内部访问容器中的服务
2) 如果EXPOSE
a port,则容器中的服务不能从Docker外部访问,只能从其他Docker容器内部访问。因此,这有利于容器间的通信
3) 如果公开
和-p
端口,则容器中的服务可以从任何地方访问,甚至可以从Docker外部访问
两者分开的原因是因为:
- 选择主机端口取决于主机,因此不属于Dockerfile(否则将取决于主机)
- 如果容器中的服务可以从其他容器访问,通常就足够了
EXPOSE
指令公开用于链接的端口
它还向您指出了如何进行,这基本上就是我提到的容器间通信
PS:如果您执行
-p
,但不执行公开
,Docker将执行隐式公开
。这是因为如果一个港口向公众开放,它也会自动向其他Docker集装箱开放。因此-p
包括公开
。这就是我没有将其列为第四个案例的原因。请参阅官方文档参考:
如果您使用-p
运行容器,则EXPOSE
允许您在映像生成时定义私有(容器)和公共(主机)端口,以便在容器运行时公开
$ docker help run
...
-P, --publish-all Publish all exposed ports to random ports
...
公共端口和协议是可选的,如果未指定公共端口,docker将在主机上选择一个随机端口,以在Dockerfile上公开指定的容器端口
一个好的做法是不要指定公共端口,因为它只限制每个主机一个容器(第二个容器将抛出一个已经在使用的端口)
您可以在docker run
中使用-p
来控制暴露的容器端口可连接的公共端口
无论如何,如果不使用EXPOSE
(在docker运行时使用-p
)或-p
,则不会暴露任何端口
如果您总是在
docker run
中使用-p
,则不需要暴露
,但如果您使用暴露
,则docker run
命令可能更简单,暴露
在您不关心主机上将暴露哪个端口的情况下非常有用,或者,如果您确定只有一个容器将被加载。大多数人使用docker compose与网络。各国:
Docker网络功能支持创建网络,而无需在网络中公开端口,有关详细信息,请参阅此功能的概述)
这意味着,如果使用网络在容器之间进行通信,则无需担心暴露端口。可以使用Dockerfile或 --向docker运行公开标志。公开端口是记录以下内容的一种方法: 使用端口,但实际上不映射或打开任何端口。暴露端口 是可选的 来源:简短回答:
是记录的一种方式EXPOSE
(或--publish
)是一种将主机端口映射到正在运行的容器端口的方法-p
请注意:
与EXPOSE
(文档化)相关Dockerfiles
与--publish
(执行/运行时)docker run…
- 您可以使用docker文件中的
关键字或expose
标志向docker run公开端口。公开端口是记录使用了哪些端口的一种方法,但实际上并不映射或打开任何端口。公开端口是可选的--expose
- 您可以使用
或--publish
标志将端口发布到--publish all
。这会告诉Docker要在容器的网络接口上打开哪些端口。发布端口时,它将映射到主机上的可用高阶端口(高于docker run
),除非您在运行时在主机上指定要映射到的端口。生成映像时(在Dockerfile中),无法在主机上指定要映射到的端口,因为无法保证运行映像的主机上的端口可用30000
docker run --rm -it testexpose bash
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090