Docker技术的发展给微服务的部署带来了很大的便利,本文简单介绍一下使用Docker部署Spring Boot项目。
一、构建一个简单的Spring Boot项目
- 启动类
@SpringBootApplication
public class DemoApplication {
@RestController
public class HelloSimonController{
@RequestMapping("/hello")
public String hello(){
return "hello simon";
}
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- pom依赖
<?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>
<groupId>com.simon</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动这个demo,浏览器访问http://localhost:8080/hello
,返回 “hello simon”,接口正常。
二、添加Docker支持
-
添加Docker构建插件
<!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>simon/${project.artifactId}:${project.version}</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
简要说明插件配置:
- imageName:用于指定镜像名称,其中
simon
是仓库名称,${project.artifactId}
是镜像名称,${project.version}
是标签名称; - resources.resource.directory:用于指定需要复制的文件,
${project.build.directory}
表示target目录; - resources.resource.include:用于指定需要复制的文件。
${project.build.finalName}.jar
指的是打包后的jar
- imageName:用于指定镜像名称,其中
-
在目录src/main/docker下创建 Dockerfile 文件,Dockerfile 文件用来说明如何来构建镜像
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD demo-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- FROM: 表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
- VOLUME: VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
- ADD ,拷贝文件并且重命名
- ENTRYPOINT ,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
三、打包部署项目
我们需要把demo这个项目上传到linux上进行打包部署。linux上需要安装jdk和maven(不讲述安装过程),还需要安装Docker环境,可以参考之前的文章Centos7 安装Docker。
- 构建镜像
进入demo项目的根目录,执行下面的命令
$ mvn package docker:build
- 查看是否构建成功
$ docker images
[root@simon demo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ibase/demo 0.0.1-SNAPSHOT 639e4a6f043d 6 seconds ago 119MB
ibase/feign_upload_first 0.0.1-SNAPSHOT 3f8c202e53e7 38 minutes ago 119MB
openjdk 8-jdk-alpine 5801f7d008e5 6 weeks ago 103MB
ibase/demo
就是构建的镜像
- 运行镜像
$ docker run -p 8080:8080 -t ibase/demo:0.0.1-SNAPSHOT
- 查看正在运行的镜像
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24a8d8d5b309 ibase/demo:0.0.1-SNAPSHOT "java -Djava.secur..." 26 minutes ago Up 26 minutes 0.0.0.0:8080->8080/tcp adoring_johnson
访问项目
浏览器访问http://localhost:8080/hello
,返回hello simon
,部署成功。停止实例
$ docker stop adoring_johnson