[英]Issue with exposing Docker Port
我正在尝试使用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中部署它。
我错过了什么?
您需要以某种方式发布端口:
通过直接将其发布在docker run
命令重映射EXPOSE
使用(注意小写p)的Dockerfile指令以不同的主机端口:
-p=[] : Publish a container᾿s port or a range of ports to the host
或者,如EXPOSE
文档中所述,使用(注意大写字母P)隐式发布EXPOSE
Dockerfile指令中列出的端口:
-P : Publish all exposed ports to the host interfaces
我的最终需求是能够在kubernetes中部署它。
为此,您将以类似的方式使用k8s清单中列出的端口。 假设您在docker映像中公开了端口8080(并使用-p或-P进行发布),然后将其用于容器规范(具体清单取决于所选择的k8s对象类型),并且很可能稍后在服务清单中使用,以及在每一层中,您都可以更改端口映射(类似于docker run -p
将host:docker端口映射为不同的值)(如果需要)。 因此,就k8s而言,如果您在Dockerfile中使用EXPOSE
端口,并且它可以在容器中本地正常运行,并且还可以通过任何发布它的方式在主机上docker run
使用-p或-P docker run
docker),它也将在kubernetes中起作用(到目前为止当您在正确的清单文件中列出它时)。
战争中的EXPOSE语句仅表示战争正在侦听映像中的端口8080,从而允许通过该端口访问您的应用程序。
但是,这并不意味着它会打开这些端口。 因此,您仍然需要使用-p开关打开docker的内部和/或外部端口,以允许容器和/或外部连接之间的通信。
-p指定的第一个端口是主机端口,第二个是容器端口。 当您仅指定一个端口时,这意味着该容器只能由在同一docker网络中运行的其他容器访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.