TLDR:似乎我忘记公开 Jenkins 的端口,例如 8080 和 50000,但 Jenkins 仍然可以工作,并且我能够访问 WEB UI。怎么会呢?
所以过去几个月我一直在学习 Docker,在构建 Dockerfile 时,我总是确保公开适当的端口,如果我正在构建 Web 应用程序等,则为 80。
我正在构建一个 Dockerfile,其目的是在容器内运行 Jenkins 服务器,以及一些我需要确保管道正确运行的应用程序。
似乎我忘记公开 Jenkins 的端口,例如 8080 和 50000,但 Jenkins 仍然可以工作。
这让我想知道,EXPOSE 的实际用途是什么?我认为如果没有 EXPOSE,容器不会打开端口,从而使内部的应用程序不可用。
我知道应用程序和容器都需要接受特定端口上的流量,以及从本地主机到容器的端口映射,即 -port port:port 标志。
为什么我的 Dockerfile 可以在没有 EXPOSE 的情况下运行?如何才能访问容器内的 8080 端口而不暴露容器端口?
在服务器启动并正常运行之后,我更改了 Dockerfile 中的一些内容后,我基本上意识到了这一点。
我可能认为这可能是因为在 Jenkins 的情况下,端口是 8080,并且它可能是第二个默认端口 80?那么容器默认接受到该端口的流量?
TLDR;它不是装饰性的,而是提供信息的 - 在大多数情况下意味着相同的。
您可以通过
docker run
命令的 cli 参数指定暴露的端口,而不是通过 dockerfile。 EXPOSE
只是提供信息,因此您可以“找出”映像期望您打开哪些端口,以便执行其应该执行的操作。