本篇文章将在将介绍如何使用spring boot的docker-maven-plugin插件生成镜像以及推送到docker库中以及运行确认。

这里写图片描述

准备

JDK和Maven以及Docker是需要的,本文中使用CentOS7.2,因为Docker也支持windows,所以OS不限于linux。相关版本如下:

软件版本安装
JDK1.8http://blog.csdn.net/liumiaocn/article/details/53512956
Maven3.3.9http://blog.csdn.net/liumiaocn/article/details/53512956
Docker1.10yum install docker; systemctl start docker

创建Maven项目

Maven坐标信息如下:

项目详细
groupIdcom.liumiaocn.springboot.demo
artifactIddockerdemo
version=0.0.1SNAPSHOT

创建命令:设定interactiveMode为false,需要询问的设定Maven将直接使用缺省值。

mvn archetype:generate -DgroupId=com.liumiaocn.springboot.demo -DartifactId=dockerdemo -Dversion=0.0.1-SNAPSHOT -DinteractiveMode=false

创建时需要下载archetype-catalog.xml,此文件较大,目前已经5M以上了,一般因此会较慢,可以在命令行中加入 -X选项察看DEBUG信息已确认原因

创建详细参照

[root@liumiaocn demo]# ll
total 0
[root@liumiaocn demo]# mvn archetype:generate -DgroupId=com.liumiaocn.springboot.demo -DartifactId=dockerdemo -Dversion=0.0.1-SNAPSHOT -DinteractiveMode=false
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.jar (5 KB at 1.0 KB/sec)
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom
Downloaded: https://repo.maven.apache.org/maven2/org/apache/maven/archetypes/maven-archetype-quickstart/1.0/maven-archetype-quickstart-1.0.pom (703 B at 1.1 KB/sec)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /root/demo
[INFO] Parameter: package, Value: com.liumiaocn.springboot.demo
[INFO] Parameter: groupId, Value: com.liumiaocn.springboot.demo
[INFO] Parameter: artifactId, Value: dockerdemo
[INFO] Parameter: packageName, Value: com.liumiaocn.springboot.demo
[INFO] Parameter: version, Value: 0.0.1-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /root/demo/dockerdemo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 08:19 min
[INFO] Finished at: 2017-01-18T20:34:25-05:00
[INFO] Final Memory: 13M/50M
[INFO] ------------------------------------------------------------------------
[root@liumiaocn demo]# ll
total 0
drwxr-xr-x. 3 root root 30 Jan 18 20:34 dockerdemo
[root@liumiaocn demo]#

创建后的结构
这里写图片描述

修改App.java

此时已经自动给生成了App.java文件,我们将其修改成一个最简单的Web应用的HelloWorld。修改后如下:

package com.liumiaocn.springboot.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class App {
    @RequestMapping("/")
    public String Hello(){
        return "Hello, Spring Boot...";
    }
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

修改Pom

修改前Pom

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.liumiaocn.springboot.demo</groupId>
  <artifactId>dockerdemo</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>dockerdemo</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

加入spring boot所需相关内容,修改后如下

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.liumiaocn.springboot.demo</groupId>
  <artifactId>dockerdemo</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>dockerdemo</name>
  <url>http://maven.apache.org</url>

  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.4.2.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
      <plugins>
          <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
          </plugin>
      </plugins>
  </build>
</project>

编译打包

使用如下maven命令进行编译打包

项目详细
命令mvn clean package

启动确认

使用如下方式启动该服务

项目详细
命令cd target; java -jar dockerdemo-0.0.1-SNAPSHOT.jar

画面确认

这里写图片描述

修正pom的build部分

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.liumiaocn.springboot.demo</groupId>
  <artifactId>dockerdemo</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>dockerdemo</name>
  <url>http://maven.apache.org</url>

  <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>1.4.2.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>

      <plugin>
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <configuration>
            <imageName>springboot-docker-demo</imageName>
            <forceTags>true</forceTags>
            <imageTags>
              <imageTag>latest</imageTag>
            </imageTags>
            <baseImage>java:alpine</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>
    </plugins>
  </build>
</project>

生成docker镜像

使用mvn clean package docker:build生成镜像,注意package命令要先行。另外如果想直接push到私库或者dockerhub上,事前docker login之后,加上-DpushImage即可。

[root@liumiaocn dockerdemo]# mvn clean package docker:build
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for com.liumiaocn.springboot.demo:dockerdemo:jar:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for com.spotify:docker-maven-plugin is missing. @ line 45, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building dockerdemo 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ dockerdemo ---
[INFO] Deleting /root/demo/dockerdemo/target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ dockerdemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /root/demo/dockerdemo/src/main/resources
[INFO] skip non existing resourceDirectory /root/demo/dockerdemo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ dockerdemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /root/demo/dockerdemo/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ dockerdemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /root/demo/dockerdemo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ dockerdemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /root/demo/dockerdemo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ dockerdemo ---
[INFO] Surefire report directory: /root/demo/dockerdemo/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.liumiaocn.springboot.demo.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 sec - in com.liumiaocn.springboot.demo.AppTest

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ dockerdemo ---
[INFO] Building jar: /root/demo/dockerdemo/target/dockerdemo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.4.2.RELEASE:repackage (default) @ dockerdemo ---
[INFO]
[INFO] --- docker-maven-plugin:0.4.13:build (default-cli) @ dockerdemo ---
[INFO] Copying /root/demo/dockerdemo/target/dockerdemo-0.0.1-SNAPSHOT.jar -> /root/demo/dockerdemo/target/docker/dockerdemo-0.0.1-SNAPSHOT.jar
[INFO] Building image springboot-docker-demo
Step 1 : FROM java:alpine
 ---> e40ba8c51bb2
Step 2 : ADD /dockerdemo-0.0.1-SNAPSHOT.jar //
 ---> ed34815e725e
Removing intermediate container 8784da544f9e
Step 3 : ENTRYPOINT java -jar /dockerdemo-0.0.1-SNAPSHOT.jar
 ---> Running in 1381f35250e1
 ---> e9260209838b
Removing intermediate container 1381f35250e1
Successfully built e9260209838b
[INFO] Built springboot-docker-demo
[INFO] Tagging springboot-docker-demo with latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 45.429 s
[INFO] Finished at: 2017-01-18T21:05:29-05:00
[INFO] Final Memory: 36M/88M
[INFO] ------------------------------------------------------------------------
[root@liumiaocn dockerdemo]#

确认docker镜像

[root@liumiaocn dockerdemo]# docker images |grep springboot-docker-demo
springboot-docker-demo                                   latest              285c2351de9b        About a minute ago   145 MB
[root@liumiaocn dockerdemo]#

运行docker镜像

将该镜像运行起来,把对外port设定为9090

项目详细
命令docker run -p 9090:8080 springboot-docker-demo

结果确认

这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐