首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Docker容器中热部署Java EE应用程序

如何在Docker容器中热部署Java EE应用程序
EN

Stack Overflow用户
提问于 2015-07-06 20:57:58
回答 2查看 3.6K关注 0票数 10

我正在寻找将Java EE应用程序热部署到Docker容器中的可能性。

我发现最有趣的内容是通过“卷”在主机和容器之间共享tomcat目录的可能性。但这还不是一个热门的部署。

参考:https://groups.google.com/forum/#!topic/docker-user/b_4NRn9sLBQ

对如何到达它有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2018-07-20 19:49:19

我知道这个问题有点老了,但我想分享我关于如何在Docker中使用tomee服务器开发java应用程序的知识。

准备Docker镜像

首先要做的是启用日志记录。我使用官方的基本镜像,并将日志重定向到stdout,以便在我的控制台上查看:

代码语言:javascript
复制
# you can change the base image of course
FROM tomee:8-jre-1.7.5-jaxrs
RUN ln -s /dev/stdout /usr/local/tomee/logs/catalina.out 
RUN echo '<?xml version="1.0" encoding="utf-8"?><tomcat-users><role rolename="tomee-admin"/><user username="tomee" password="tomee" roles="tomee-admin,manager-gui,manager-script"/></tomcat-users>' > /usr/local/tomee/conf/tomcat-users.xml

log添加可能看起来不是什么大问题,但它确实是。启用此功能后,您可以立即看到部署的成功(或失败)。丑陋的xml片段实际上非常重要。它使名为tomee的用户具有部署应用程序的所有重要权限。

您可以使用普通的docker工具构建镜像:

代码语言:javascript
复制
docker build -t tomee-dev .

准备开发环境

我使用标准的maven目录布局。下面是一个示例:

代码语言:javascript
复制
pom.xml
src
 |
 - main
    |
    - java
    |   |
    |   - boundary
    |        |
    |        - TestResource.java
    - webapp
        |
        - WEB-INF
            |
            - web.xml

这些文件的内容可以在此答案的底部找到。

像这样启动容器:

代码语言:javascript
复制
docker run -it --rm -p 8080:8080 tomee-dev

最后一块拼图是我们的maven配置。您可以使用tomee maven插件进行重新部署。

代码语言:javascript
复制
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <url>http://localhost:8080/manager/text</url>
                <username>tomee</username>
                <password>tomee</password>                    
                <path>/${project.artifactId}</path>
            </configuration>
        </plugin>
    </plugins>
</build>

您现在可以使用mvn clean tomcat7:deploymvn clean tomcat7:redeploy命令来部署/重新部署您的应用程序。

附录

下面是我在示例中使用的源文件和配置文件的内容:

src/main/java/boundary/TestResource.java

代码语言:javascript
复制
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;

@Path("/")
public class TestResource {

    @GET
    @Path("test")
    public Response test1() {
        return Response.ok("this is a test").build();
    }
}

src/main/java/webapp/WEB-INF/web.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <module-name>hot-deploy</module-name>

    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/resources/*</url-pattern>
    </servlet-mapping>
</web-app>

pom.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <artifactId>hot-reload</artifactId>
    <groupId>org.test.stackoverflow.answers</groupId>
    <version>1.0.0-snapshot</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <tomee-plugin.pwd>tomee</tomee-plugin.pwd>
        <tomee-plugin.user>tomee</tomee-plugin.user>

    </properties>



    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <scope>provided</scope>
            <version>7.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <url>http://localhost:8080/manager/text</url>
                    <username>tomee</username>
                    <password>tomee</password>                    
                    <path>/${project.artifactId}</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
票数 5
EN

Stack Overflow用户

发布于 2017-05-24 21:12:21

如果您以只读方式将主机的卷挂载到几个容器中,请确保tomcat不会“分解”war文件,至少不会将其“分解”到同一文件夹中,那么我认为您拥有了热部署,至少达到了tomcat可以支持的级别。替换主机文件夹中的.war文件应该会触发重新部署。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31246526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档