将Java webapp部署到Docker容器中运行的Tomcat 8

将Java webapp部署到Docker容器中运行的Tomcat 8,java,tomcat,docker,spring-boot,war,Java,Tomcat,Docker,Spring Boot,War,我是Tomcat和Docker的新手,所以我可能在这个问题中遗漏了Tomcat的基本原理 我想做的是构建一个Docker容器,它运行一个SpringBoot Restful web服务,只返回一些静态数据。这都是在OSX上运行的,所以我也使用Boot2Docker 我已经编写了自己的Dockerfile来构建我的应用程序在其中运行的容器: FROM tomcat:8.0.20-jre8 RUN mkdir /usr/local/tomcat/webapps/myapp COPY /1.0-S

我是Tomcat和Docker的新手,所以我可能在这个问题中遗漏了Tomcat的基本原理

我想做的是构建一个Docker容器,它运行一个SpringBoot Restful web服务,只返回一些静态数据。这都是在OSX上运行的,所以我也使用Boot2Docker

我已经编写了自己的Dockerfile来构建我的应用程序在其中运行的容器:

FROM tomcat:8.0.20-jre8

RUN mkdir /usr/local/tomcat/webapps/myapp

COPY /1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/myapp/
这个Dockerfile工作正常,我可以从创建的图像启动容器

docker build -t myapp .

docker run -it --rm -p 8888:8080 myapp
此容器正确启动,不输出任何错误,并显示消息,说明我的应用已部署

22-Mar-2015 23:07:21.217 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 
Deploying web application directory /usr/local/tomcat/webapps/myapp
容器还正确地将myapp.war复制到Dockerfile中描述的路径。此外,我能够导航到Tomcat默认页面,以确认Tomcat正在运行,我还可以点击所有示例,等等


对于这个问题,当我导航到我得到一个404。我不太明白为什么。我是否缺少有关.war部署到Tomcat的信息?

您正在尝试将
war
文件复制到
webapps
下面的目录中。war文件应复制到
webapps
目录中

删除mkdir命令,并按如下方式复制
war
文件:

COPY /1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/myapp.war

如果启用了
autodeploy
,Tomcat将提取war。

Tomcat将只提取复制到
webapps
目录的war。 更改
Dockerfile
如下:

FROM tomcat:8.0.20-jre8
COPY /1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.war /usr/local/tomcat/webapps/myapp.war
除非指定了webroot,否则您可能需要按如下方式访问url


这一条有一条直线

你可以直接跑

docker run -v /1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.war:/usr/local/tomcat/webapps/myapp.war -it -p 8080:8080 tomcat

这将把war文件复制到webapps目录,并立即让你的应用程序运行。

你从哪里获得该IP地址?它是分配给我的Boot2Docker VM的IP地址。在没有/myapp的情况下点击该IP:port会显示默认的Tomcat页面。我是Linux用户,所以行为可能会有所不同,但请尝试访问localhost:8080。这不起作用,因为容器运行在Boot2Docker管理的VM中,这与在Linux上本机运行Docker有点不同。检查您Tomcat的日志,我不认为tomcat能够加载你的应用程序,因为你没有把战争放在
webapps
中,而是放在一个子文件夹中。选中此选项可能会有所帮助。这将替换tomcat目录中的任何现有Web应用程序,并只复制一个war?如果不需要这样做,您可能必须使用暂存区域并将WAR从那里复制到tomcat/WebApps。只有当autodeploy设置为true时,此功能才有效。我们如何在命令行中部署它?