Spring boot项目部署到Docker环境

Spring boot项目部署到Docker环境

环境列表

JDK 1.8
编译器 IDEA
docker环境操作系统 CentOS7.6
spring boot 版本 2.1.1.RELEASE
Docker 版本

创建spring boot应用

参考:在IDEA中创建spring Boot项目

在项目入口类添加一个测试接口,代码如下:

@SpringBootApplication
@RestController
public class DemoApplication {

    @RequestMapping("/hello")
    public String home() {
        return "Hello Docker World";
    }

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

我创建了一个名为 demo的项目

Spring 项目添加Docker支持

pom.xml-properties中添加 Docker 镜像名称前缀

<properties>
    <java.version>1.8java.version>
    <spring-cloud.version>Greenwich.RC2spring-cloud.version>
    <docker.image.prefix>vikidocker.image.prefix>
properties>

pom.xml-plugins中添加 docker 插件

<plugin>
    <groupId>com.spotifygroupId>
    <artifactId>dockerfile-maven-pluginartifactId>
    <version>1.4.9version>
    <configuration>
        <repository>${docker.image.prefix}/${project.artifactId}repository>
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jarJAR_FILE>
        buildArgs>
    configuration>
plugin>

Docker有一个简单的Dockerfile文件格式,用于指定图像的“layer”。那么让我们继续在Spring Boot项目中创建一个Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

注: app.jar 可改为你具体的应用jar包名称

这个 Dockerfile 文件很简单,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中。

  • FROM :指定需要使用哪个基础docker镜像(镜像含有JDK环境),需要先下载
  • VOLUME:因为这是Spring Boot应用程序默认为Tomcat创建工作目录的地方。效果是在主机“/ var / lib / docker”下创建一个临时文件,并将其链接到“/ tmp”下的容器
  • ARG :定义了用户可以在编译时或者运行时传递的变量,JAR_FILE是项目打包后的jar名称
  • ADD:拷贝文件并重新命名
  • ENTRYPOINT:为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为

Docker打包环境配置

Docker安装

这里是在CentOS7.6上安装docker环境

请参考我的另一篇博文 CentOS7.6安装Docker,注意,需要使用Docker 中国加速器,否则下载镜像时,会超时。

JDK安装

yum install java java-devel

注:需要安转java-devel,否则Maven会报找不到JRE的错误,虽然执行java -version没有异常。

Maven安装

请参考另一篇博文Linux(CentOS7.x)下安装Maven

在Docker环境部署Spring boot项目

将demo项目上传到服务器,进入项目进行打包测试

mvn clean package

启动测试项目是否正常工作

java -jar target/demo-0.1.ja

看到成功日志说明环境没有问题,接下来我们使用 DockerFile 构建镜像

使用Dockerfile构建镜像

mvn clean package dockerfile:build

构建成功后验证,生成了期望的viki/demo的镜像

[root@MiWiFi-R3-srv demo]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
viki/demo               latest              07a1ed182817        9 seconds ago       119MB

使用镜像

[root@MiWiFi-R3-srv demo]# docker run -p 8080:8080 -t viki/demo

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

看到容器中的应用成功启动。

在浏览器中访问 http://宿主机IP:8080/hello

看到期望的返回结果:Hello Docker World

构建成功!

传递参数到docker内的Spring boot项目

场景需求:

​ 我们的spring boot项目打包进入docker,但我们根据不同的环境(开发、测试、生产)需要设置不同的参数,如数据库的IP地址,配置中心的IP地址等。如下面的例子:我们Spring boot的application.yml配置文件中,定义了变量db-ip,在启动容器时,通过 -e参数将内容值传递进容器。

server:
  port: 9100
  db-ip: localhost
  db-port: 3306
spring:
  datasource:
    url: jdbc:mysql://${server.db-ip}:${server.db-port}/cds-config?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      connection-test-query: SELECT 1 FROM DUAL
      connection-timeout: 30000
      maximum-pool-size: 200
      max-lifetime: 1800000
      minimum-idle: 50

docker命令如下:

docker run -p 9100:9100 -e server.db-ip=10.131.5.181 production/cds-config-server:latest

这样,application.yml文件会变为10.131.5.181

碰到的问题

  1. docker:build 时报如下错误:
[ERROR] No plugin found for prefix 'docker' in the current project and in the plugin groups [org.apache.maven.plugins, org.codehaus.mojo] available from the repositories [local (/root/.m2/repository), alimaven (http://maven.aliyun.com/nexus/content/groups/public/)] -> [Help 1]

解决方法是:解决办法是修改 maven 的配置文件 settings.xml,在pluginGroups 处增加如下内容,


com.spotify

  1. Must specify baseImage if dockerDirectory

    应该使用mvn clean package dockerfile:build,而不是mvn clean package docker:build

参考文档

1、使用Docker 部署Spring Boot项目

2、spring boot官网docker构建章节

你可能感兴趣的:(Spring,Cloud)