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

时间:2015-07-06 12:57:58

标签: java tomcat docker

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

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

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

有关如何联系它的任何建议吗?

2 个答案:

答案 0 :(得分:4)

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

准备Docker映像

要做的第一件事是启用日志记录。我使用官方的基本映像并将日志重定向到stdout以便在控制台上查看它:

# 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

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

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

docker build -t tomee-dev .

准备开发环境

我使用标准的Maven目录布局。这是一个示例:

pom.xml
src
 |
 - main
    |
    - java
    |   |
    |   - boundary
    |        |
    |        - TestResource.java
    - webapp
        |
        - WEB-INF
            |
            - web.xml

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

像这样启动容器:

docker run -it --rm -p 8080:8080 tomee-dev

难题的最后一部分是我们的Maven配置。您可以使用tomee maven插件进行重新部署

<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

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

<?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

<?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>

答案 1 :(得分:0)

如果您将主机的卷以只读方式挂载到几个容器,请确保tomcat不会爆炸&#34;爆炸&#34;战争文件,至少不是同一个文件夹,那么我认为你有热部署,至少到tomcat级别可以支持。替换主机文件夹中的.war文件应触发重新部署。