如何dockerize Maven项目? 以及有多less种方法来完成它?

我是新来的Docker,并不知道如何用maven运行一个java项目,即使我已经阅读了许多文档,并尝试了很多方法。

  1. 我应该使用Dockerfile生成图像吗?
  2. 当使用Dockerfile在主机上运行maven项目时,有什么命令?

尝试使用新的官方图片,Maven有一个

https://registry.hub.docker.com/_/maven/

该图像可用于在构build时运行Maven来创build一个编译的应用程序,或者像下面的例子一样,在一个容器中运行一个Maven构build。

示例1 – 在一个容器中运行的Maven

以下命令在容器中运行Maven构build:

 docker run -it --rm \ -v "$(pwd)":/opt/maven \ -w /opt/maven \ maven:3.2-jdk-7 \ mvn clean install 

笔记:

  • 这种方法的好处是所有的软件都安装在容器中运行。 只需要主机上的docker。
  • 请参阅此版本的Dockerfile

示例2 – 使用Nexus来caching文件

运行Nexus容器

 docker run -d -p 8081:8081 --name nexus sonatype/nexus 

创build一个“settings.xml”文件:

 <settings> <mirrors> <mirror> <id>nexus</id> <mirrorOf>*</mirrorOf> <url>http://nexus:8081/content/groups/public/</url> </mirror> </mirrors> </settings> 

现在运行连接到nexus容器的Maven,这样依赖关系将被caching

 docker run -it --rm \ -v "$(pwd)":/opt/maven \ -w /opt/maven \ --link nexus:nexus \ maven:3.2-jdk-7 \ mvn -s settings.xml clean install 

笔记:

  • 在后台运行Nexus的一个优点是,其他第三方存储库可以通过pipe理URL来透明地pipe理在本地容器中运行的Maven构build版本。

可能有很多方法..但我通过以下两种方式实现

给出的例子是maven项目。

1.在maven项目中使用Dockerfile

使用以下文件结构:

 Demo └── src | ├── main | │ ├── java | │ └── org | │ └── demo | │ └── Application.java | │ | └── test | ├──── Dockerfile ├──── pom.xml 

并将Dockerfile更新为:

 FROM java:8 EXPOSE 8080 ADD /target/demo.jar demo.jar ENTRYPOINT ["java","-jar","demo.jar"] 

导航到项目文件夹,然后input以下命令来创build映像并运行该映像:

 $ mvn clean $ mvn install $ docker build -f Dockerfile -t springdemo . $ docker run -p 8080:8080 -t springdemo 

在Spring Boot中使用Docker获取video

2.使用Maven插件

pom.xml添加给定的maven插件

 <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.5</version> <configuration> <imageName>springdocker</imageName> <baseImage>java</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> 

导航到项目文件夹并键入以下命令,您将能够创build映像并运行该映像:

 $ mvn clean package docker:build $ docker images $ docker run -p 8080:8080 -t <image name> 

在第一个例子中,我们正在创buildDockerfile并提供基础镜像并添加jar,所以在完成之后,我们将运行docker命令来构build具有特定名称的映像,然后运行该映像。

而在第二个例子中,我们使用了maven插件,在这个插件中我们提供了baseImageimageName所以我们不需要在这里创buildDockerfile。打包Maven项目之后,我们将得到Docker镜像,我们只需要运行该镜像。

作为一个经验法则,您应该使用Maven(一个包含代码和所有依赖关系的JAR)构build一个胖JAR

然后你可以编写一个符合你需求的Dockerfile (如果你可以构build一个胖JAR,你只需要一个基本的操作系统,比如CentOS和JVM)。

这是我用于Scala应用程序(这是基于Java的)。

 FROM centos:centos7 # Prerequisites. RUN yum -y update RUN yum -y install wget tar # Oracle Java 7 WORKDIR /opt RUN wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u71-b14/server-jre-7u71-linux-x64.tar.gz RUN tar xzf server-jre-7u71-linux-x64.tar.gz RUN rm -rf server-jre-7u71-linux-x64.tar.gz RUN alternatives --install /usr/bin/java java /opt/jdk1.7.0_71/bin/java 1 # App USER daemon # This copies to local fat jar inside the image ADD /local/path/to/packaged/app/appname.jar /app/appname.jar # What to run when the container starts ENTRYPOINT [ "java", "-jar", "/app/appname.jar" ] # Ports used by the app EXPOSE 5000 

这创build了一个基于CentOS的Java7图像。 开始时,它会执行你的应用程序jar。

部署它的最好方法是通过Docker Registry,就像Docker镜像的Github一样。

你可以像这样构build一个图像:

 # current dir must contain the Dockerfile docker build -t username/projectname:tagname . 

然后你可以用这种方式推送一个图像:

 docker push username/projectname # this pushes all tags 

一旦图像在Docker Registry上,你可以从世界上的任何地方拉它并运行它。

请参阅Docker用户指南了解更多信息。

请记住一些事情

你也可以把你的版本库放到一个映像中,并把它作为容器执行的一部分来构build,但这不是一个好的方法,因为代码可能会改变,最终你可能会在不通知的情况下使用不同版本的应用程序。

build立一个胖jar子可以解决这个问题。