暴露Docker端口

时间:2018-06-12 11:53:39

标签: docker tomcat kubernetes dockerfile

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

这是我的泊坞文件

 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中部署它。

2 个答案:

答案 0 :(得分:1)

  

我错过了什么?

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

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

    -p=[]      : Publish a container᾿s port or a range of ports to the host
    
  • 或者,如docker documentation中所述,使用(注意大写P)隐式发布EXPOSE Dockerfile指令中列出的端口:

    -P         : Publish all exposed ports to the host interfaces
    
  

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

为了实现这一目标,您将以类似的方式使用k8s清单中列出的端口。比如,您在docker镜像中公开端口8080(并使用-p或-P发布它),然后您将在容器规范中使用它(确切的清单取决于所选的k8s对象类型),并且很可能稍后在服务清单中使用它,并且在每个层中,您可以更改端口映射(类似于docker run -p将主机:docker端口映射到不同的值,如果您需要这样做)。因此,就k8s而言,如果您在Dockerfile中EXPOSE端口并且它在容器中本地正常工作,并且通过任何方式发布它(docker run与-p或-P),它将在主机上正常工作在kubernetes中(只要你在正确的清单文件中列出它)。

答案 1 :(得分:0)

战争中的EXPOSE语句只是意味着战争正在侦听图像中的端口8080,允许通过该端口访问您的应用程序。

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

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