What is the difference between “expose” and “publish” in Docker?
我正在试验dockerfiles,我想我理解大部分逻辑。但是,在这个上下文中,我看不到"公开"和"发布"端口之间的区别。
我首先看到的所有教程都包括dockerfile中的
1 2 3 | ... EXPOSE 8080 ... |
然后他们从这个dockerfile构建一个图像:
1 | $ docker build -t an_image - < Dockerfile |
然后在运行映像时发布与上面相同的端口:
1 | $ docker run -d -p 8080 an_image |
或使用发布所有端口
1 | $ docker run -d -P an_image |
如果要发布Dockerfile中的端口,那么在Dockerfile中公开端口有什么意义?有没有必要先公开一个端口,以后再发布它?实际上,我想指定创建映像时将在dockerfile中使用的所有端口,然后不再麻烦它们,只需运行它们:
1 | $ docker run -d an_image |
这有可能吗?
基本上,您有三种选择:
1)如果您既没有指定
2)如果您使用的是cx1〔0〕一个港口,那么集装箱内的服务不能从码头外进入,而是从其他码头集装箱内进入。所以这对于容器间的通信是很好的。
3)如果您是
二者分开的原因是imho,因为:
- 选择主机端口取决于主机,因此不属于dockerfile(否则将取决于主机)。
- 通常,如果可以从其他容器访问容器中的服务,就足够了。
文件明确规定:
The
EXPOSE instruction exposes ports for use within links.
它还向您指出了如何链接容器,这基本上就是我所讨论的容器间通信。
附言:如果你做
简短回答:
EXPOSE 是一种记录--publish 或-p 是将主机端口映射到正在运行的容器端口的一种方法。
请注意:
EXPOSE 与Dockerfiles 有关(文件化)--publish 与docker run ... 有关(执行/运行时)
Exposing and publishing ports
In Docker networking, there are two different mechanisms that directly involve network ports: exposing and publishing ports. This applies to the default bridge network and user-defined bridge networks.
You expose ports using the
EXPOSE keyword in the Dockerfile or the--expose flag to docker run. Exposing ports is a way of documenting which ports are used, but does not actually map or open any ports. Exposing ports is optional.You publish ports using the
--publish or--publish-all flag todocker run . This tells Docker which ports to open on the container’s network interface. When a port is published, it is mapped to an available high-order port (higher than30000 ) on the host machine, unless you specify the port to map to on the host machine at runtime. You cannot specify the port to map to on the host machine when you build the image (in the Dockerfile), because there is no way to guarantee that the port will be available on the host machine where you run the image.from: Docker container networking
也,
EXPOSE
...The
EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.from: Dockerfile reference
未定义
在@golo roden的回答中,声明:
"If you do not specify any of those, the service in the container will not be accessible from anywhere except from inside the container itself."
也许在写答案的时候就是这样,但现在看来,即使你不使用
我用了下面的
1 2 | FROM ubuntu RUN apt-get update && apt-get install -y mini-httpd |
i
1 | docker run --rm -it testexpose bash |
在容器内,我启动了几个
1 2 3 | root@fb8f7dd1322d:/# mini_httpd -p 80 root@fb8f7dd1322d:/# mini_httpd -p 8080 root@fb8f7dd1322d:/# mini_httpd -p 8090 |
然后,我可以使用主机或其他容器中的
一个好的实践是不要指定公共端口,因为它只限制每个主机一个容器(第二个容器将抛出已经使用的端口)。
您可以在
无论如何,如果您不使用
如果你总是在
使用dockerfile中的expose关键字或--向Docker运行公开标志。公开端口是一种记录端口被使用,但实际上并不映射或打开任何端口。暴露端口是可选的。
来源:Github提交
大多数人使用Docker与网络组合。文件规定:
The Docker network feature supports creating networks without the need to expose ports within the network, for detailed information see the overview of this feature).
这意味着,如果您使用网络在容器之间进行通信,则无需担心端口暴露。
Dockerfile公开vs发布
暴露
在编写dockerfiles时,expose指令告诉docker正在运行的容器监听特定的网络端口。这是一种端口映射文档,可以在发布端口时使用。
暴露[…]
您还可以在docker run命令中指定此命令,例如:
docker run--expose=1234我的应用程序
但expose不允许通过定义的端口与同一网络之外的容器或主机进行通信。要允许这种情况发生,您需要发布端口。
发布端口并将其映射到主机
当使用docker run命令在容器网络外部发布容器的端口并将它们映射到主机的端口时,可以使用几个标志。这些是标记-p和-p,它们在发布一个或所有端口方面有所不同。
要在运行容器时实际发布端口,请使用docker run上的-p标志发布和映射一个或多个端口,或者使用-p标志发布所有公开的端口并将它们映射到高阶端口。?-?Docker文档:公开
docker run-p 80:80/tcp-p 80:80/udp my_应用程序
在上面的示例中,-p标志后面的第一个数字是主机端口,第二个数字是容器端口。
要使用expose发布Dockerfile中定义的所有端口并将它们绑定到主机,可以使用-p标志。
docker run-p my_应用程序