我正在尝试使用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中部署它。
答案 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网络中运行的其他容器访问该容器。