暴露Docker端口的问题

暴露Docker端口的问题,docker,tomcat,kubernetes,dockerfile,Docker,Tomcat,Kubernetes,Dockerfile,我正在尝试使用tomcat Docker映像打包war文件。 我试图在映像中公开tomcat端口,以便从外部访问它 这是我的docker文件 FROM tomcat8:3.0.0 COPY target/hello-world-war-1.0.0.war /usr/local/tomcat/webapps EXPOSE 8080 但是,当我构建此映像时,运行它并尝试从我的主机浏览器(localhost:8080)访问它时,它没有到达端点,因此它无法按预期工作 我仍然必须使用-p开关将

我正在尝试使用tomcat Docker映像打包war文件。 我试图在映像中公开tomcat端口,以便从外部访问它

这是我的docker文件

 FROM tomcat8:3.0.0

 COPY target/hello-world-war-1.0.0.war /usr/local/tomcat/webapps

 EXPOSE 8080
但是,当我构建此映像时,运行它并尝试从我的主机浏览器(localhost:8080)访问它时,它没有到达端点,因此它无法按预期工作

我仍然必须使用-p开关将端口暴露在外部

我错过了什么?或者使用EXPOSE是指其他内容


我的最终需要是能够在kubernetes中部署它。

war中的EXPORT语句仅仅意味着war正在侦听映像中的端口8080,允许通过该端口访问应用程序

但是,这并不意味着它会打开这些端口。因此,您仍然需要使用-p开关打开docker的内部和/或外部端口,以允许容器和/或外部连接之间的通信

p指定的第一个端口是主机端口,第二个端口是容器端口。当您只指定一个端口时,这意味着该容器只能由运行在同一docker网络中的其他容器访问

我错过了什么

您需要以某种方式发布端口:

  • 通过在
    docker run
    命令中直接发布它,使用(注意小写字母p)将
    EXPOSE
    Dockerfile指令重新映射到不同的主机端口:

  • 或者,如中所述,使用(大写字母p)隐式发布
    EXPOSE
    Dockerfile指令中列出的端口:

我的最终需求是能够在kubernetes部署这个


为此,您将以类似的方式使用k8s清单中列出的端口。比方说,您在docker映像中公开端口8080(并使用-p或-p发布),然后您将在容器规范中使用它(具体清单取决于所选的k8s对象类型),很可能稍后在服务清单中使用它,并且在每个层中您都可以更改端口映射(类似于
docker run-p
映射主机:如果需要,将docker端口映射到不同的值)。就k8s而言,如果您
在Dockerfile中公开
端口,并且它在容器中以及通过任何发布方式在主机上正确工作(
docker run
使用-p或-p)它也将在kubernetes中运行(只要您在适当的清单文件中列出).

我认为您混淆了公开/发布端口。请检查您可以简单地运行
docker run-p 8080:8080 image\u name
。我不确定您的端口号。第一个是主机端口,第二个是docker端口。@tgogos是的,我会研究这个问题。您答案的第一部分是错误的。即使您不使用
公开
,端口仍然会我是开放的。你是对的,我的意思是它表明它正在监听那个端口。我已经编辑了我的答案。来源:
-p=[]      : Publish a container᾿s port or a range of ports to the host
-P         : Publish all exposed ports to the host interfaces