war 的 docker 容器化部署

这篇博客记录如何将 war 包部署到 docker 的 web 容器中.

拉取 tomcat 镜像


首先, 我们这里使用 tomcat 的容器来运行 war, 因此需要先拉取 tomcat 镜像:

docker run -it --rm -p 8888:8080 tomcat:7.0.75-jre8

编写 webapp DockerFile


vim src/main/docker/Dockerfile

FROM tomcat:7.0.75-jre8
COPY javaweb.war /usr/local/tomcat/webapps/javaweb.war

配置 maven 的 docker 插件


使用 docker 插件, 将生成 image 加入 maven task 中.

<properties>
<docker.image.prefix>nikoio</docker.image.prefix>
</properties>
<build>
...
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.war</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>

构建代码和镜像


mvn clean package docker:build

启动镜像


查看构建成功的镜像:

docker images

从镜像启动容器, (假设 image name 为 web):

docker run -d -p 8888:8080 --name web-1.0 nikoio/docker-war-tomcat:1.0

共享数据卷容器


由于我们的 tomcat 容器在运行中都会生成日志, 但如今若重新 build 了代码和镜像, 就是新的镜像了. 如果需要保留旧的日志等文件, 我们需要一个数据卷容器, 使得多个不同版本的 webapp 容器能够共用日志等文件.

首先, 我们先创建一个数据卷容器:

docker run -d -v /usr/local/tomcat/logs --name tomcat_log tomcat:7.0.75-jre8 echo Data-only container for tomcat-7.0.75-jre8

或者

docker create -v /usr/local/tomcat/logs --name tomcat_log_test tomcat:7.0.75-jre8 echo Data-only container for tomcat-7.0.75-jre8

web-1.0 基于刚才的 tomcat_log 数据卷容器启动.

docker run -d --volumes-from tomcat_log --name web-1.0 nikoio/docker-war-tomcat:1.0

关闭 web-1.0 :

docker stop web-1.0

启动 web-2.0 应用:

docker run -d --volumes-from tomcat_log --name web-2.0 nikoio/docker-war-tomcat:2.0

此时, 可以进入 web-2.0 中, 可以查看到 web-1.0 的历史 tomcat 日志.

docker exec -it web-2.0 /bin/bash

参考


docker run