GVKun编程网logo

spring-boot项目的docker集成化部署(一)(docker部署springboot项目集群)

7

这篇文章主要围绕spring-boot项目的docker集成化部署和一展开,旨在为您提供一份详细的参考资料。我们将全面介绍spring-boot项目的docker集成化部署的优缺点,解答一的相关问题,

这篇文章主要围绕spring-boot项目的docker集成化部署展开,旨在为您提供一份详细的参考资料。我们将全面介绍spring-boot项目的docker集成化部署的优缺点,解答的相关问题,同时也会为您带来docker+jenkins 实现 spring boot 项目持续集成自动化部署、Docker-Docker部署SpringBoot项目、Dockerfile 部署springboot项目 流程、Docker下部署springboot项目的实用方法。

本文目录一览:

spring-boot项目的docker集成化部署(一)(docker部署springboot项目集群)

spring-boot项目的docker集成化部署(一)(docker部署springboot项目集群)

spring-boot项目的docker集成化部署

[toc]

前言

据说流行的微服务和docker一起,更配哦!接下来,使用简单spring-boot项目演示docker的集成化部署的案例,在看过微笑的博客觉得不过瘾,自己动手,下面的方案与Devops的方式比较接近;希望搭建理解这种思路。

基本思路与方案

docker化的流程图1

  1. 开发者pushgit服务器
  2. Jenkins通过触发器收到通知
  3. Jenkins克隆工作区
  4. Jenkins创建一个Docker镜像(注意:这是用maven的docker插件
  5. Jenkins将镜像推到Docker Hub

借鉴图片

docker化的流程图2

基本步骤

准备源码

Github路径:spring-boot_docker_demo

说明:这里使用com.spotify的docker-maven-plugin的插件;用法参阅代码注释。

服务器和基础环境

Linux下Java8安装

1. 下载
wget --no-cookies \
--no-check-certificate \
--header "Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz \
-O jdk-8-linux-x64.tar.gz
2. 解压安装
tar -zxvf jdk-8-linux-x64.tar.gz
mv jdk-8-linux-x64.tar.gz /usr/local
3. 配置环境变量
export JAVA_HOME=/usr/local/jdk1.8.0_181/
export PATH=$PATH:$JAVA_HOME
export JAVA_HOME=/usr/local/jdk1.8.0_181/
export JRE_HOME=$JAVA_HOME/jre                 #tomcat需要
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
4. 刷新环境变量
source  /etc/profile #刷新环境变量
2.1.3.2.3	Linux下Manven安装 

maven的安装

1. 下载maven
wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz
2. 安装
tar -zxvf apache-maven-3.5.0-bin.tar.gz
mv apache-maven-3.5.4 /usr/local/maven/apache-maven-3.5.4
3. 配置环境变量
export MAVEN_HOME=/usr/local/maven/apache-maven-3.5.4
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin:$PATH #注意这里添加$MAVEN_HOME/bin
4. 刷新环境变量
source  /etc/profile #刷新环境变量

安装Jenkins

Jenkins安装有三种方式

1. 基于Docker的安装
docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean
2. 基于war包方式

在官网下载,放入Tomcat的目录中即可;打war,大家肯定十分熟悉的操作。

3. 使用yum方式直接安装 (推荐)
1.下载
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key  
2.安装
yum install jenkins
3. 配置
vi /etc/sysconfig/jenkins

修改Jenkins的配置端口和登录用户

可避免避免和Tomcat端口重复的问题

4. 启动服务
service jenkins start
Jenkins的基本初始化
1. 登录

登录

2. 安装Jenkins插件

安装推荐插件

3.安装成功

基本按照推荐来 首页

4. 配置jdk和maven配置

配置jdk和maven

说明这里其实git非必须,之前的插件安装中安装了

Pipeline语法

语法请自行查阅资料,这里使用groovy的语法

  • devops [持续交付实践] pipeline:pipeline 使用之语法详解
  • Jenkins语法
Jenkins的项目配置
1. 新建pipeline的项目
2. 添加如下jekins的脚本内容:注意:使用pipeline的语言
#!groovy
pipeline{
	agent any

	environment {
		REPOSITORY="https://gitee.com/will-we/spring-boot_docker_demo.git"
	}
    tools {
        maven ''m3''
        jdk ''java8''
    }
	stages {
		stage(''获取代码''){
			steps {
				echo "start fetch code from git:${REPOSITORY}"
				//清空当前目录
				deleteDir()
				//拉去代码	
				git "${REPOSITORY}"
			}
		}
		stage(''代码静态检查''){
			steps {
				//伪代码检查
				echo "start code check"
			}
		}		
		stage(''编译+单元测试''){
			steps {
				echo "start compile"
				//切换目录
				sh ''mvn -Dmaven.test.skip=true -U clean install''
			}
		}
		stage(''构建镜像''){
			steps {
				echo "start build image"
				//build镜像
				sh ''mvn clean package docker:build''
			}
		}
	}
}
3. 立即构建”,查看运行的日子如下:

日志

4. 如果看上面的恭喜你,构建镜像成功;参看docker的镜像,对你“so easy”

查看docker的镜像

5. 启动docker容器
# 最好添加--name参数
docker run --name= springboot/spring-boot_docker_demo -p 8081:8080 -t srping-demo

启动日志 启动docker

问题解决

1. Jenkins构建时出现:“mvn: command not found”

报错日志 解决方案:

自己试着摸着石头过河,只能借助搜索引擎了;如下是解决的流程:

1) 安装Pipeline Maven Integration插件 2) 检查环境变量

上面安装了插件后依旧不好使,继续找原因吧,Maven not found in Jenkins【StackOverflow】有着这个题问题:原因如下:
The reason is that Jenkins is installed and run as a ‚system user‘ service. This means the process can‘t see the ENV variables and PATH of your user (user level). Setting up maven in PATH and ENV variables on system level makes the trick.
大体意思是:jekins的无法读取系统的环境变量;于是分别查看了大致的服务器和jekins的变量。 Jenkins 服务器/bin/bash

服务器和Jenkins的对比

3) Jenkins导入java和maven的权限

还记得之前配置Jdk和maven的“全局工具设置”,注意:这里设置也是依旧不能直接读取,需要如下方式引入;“m3”是配置时名称,“java8”也是配置名称。

    tools {
        maven ''m3''
        jdk ''java8''
    }

2. Linux中端口占用问题
#方式一:参看端口8080信息
netstat -lnp | grep 8080
#方式二:参看端口8080信息
lsof -i :808
#杀死进程
kill -9 pid号

结语

1. 本文总结:

我们使用了一个简单的spring-boot项目部署到远程服务器的操作流程,从而实现了推送代码到Git远程仓库,使用jekins的集成化构建docker实现,自动化部署方式。

2. 后期优化:

演示spring-boot的简单部署方式,其实该项目的还有很多地方优化,例如:doker pushdocker的仓库、使用Jenkins的触发器git hook等;以及后期;spring-boot的多模块、以及docker compose的使用等。由于篇幅的原因可能放在了后面的文章。


参考资料

  • SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署
  • Spring Boot 2.0(四):使用 Docker 部署 Spring BootMaven 插件之 docker-maven-plugin 的使用
  • 部署流水线搭建小记:Docker、Jenkins、Java和Couchbase

================================================================================

  • 个人博客:will-we.com
  • 我的掘金:weir
  • 我的简书:weir

================================================================================

docker+jenkins 实现 spring boot 项目持续集成自动化部署

docker+jenkins 实现 spring boot 项目持续集成自动化部署

一。首先 jenkins 与 docker 的安装参考下面链接
 
安装 jenkins:   https://www.cnblogs.com/jescs/p/7644635.html
 
安装 docker: https://www.cnblogs.com/wang-yaz/p/10429899.html
 
二.Jenkins 配置
 
1. 打开 jenkins 构建一个 maven 项目,名字取为 ms_backend.
 

 

2. 填写 jenkins 配置

 

 

 

 

 

以上 jenkins 配置就完成了。
 
三。对 docker 的配置(重点,因为我把所有的配置都放在 docker.sh 中,也是出于安全的考虑)
 
1. 进入云服务器中到项目的目录下即 /usr/ms_backend
 
2. 在该目录下创建并编写 Dockerfile 文件
 1 [root@iZuf635fwy8k6ubk6r9yonZ ms_backend]# vim Dockerfile 
 2 
 3 FROM hub.c.163.com/wuxukun/maven-aliyun:3-jdk-8      //下载maven与java的镜像
 4 # 指定当前操作目录
 5 WORKDIR /usr/ms_backend                                           
 6 #指定对外端口号
 7 EXPOSE 8040          
 8 #启动java程序
 9 #--spring.profiles.active=dev 多环境下指定环境 。 -c为清除以前启动的数据
10 ENTRYPOINT ["java","-jar","ms_backend.jar","--spring.profiles.active=dev","-c"]
3. 创建配置 docker.sh 脚本
 
先看下jenkins构建后项目存放的路径,以便在docker.sh中用到

 

 1 [root@iZuf635fwy8k6ubk6r9yonZ ms_backend]# vim docker.sh 
 2 #操作/项目路径(Dockerfile存放的路劲)
 3 BASE_PATH=/usr/ms_backend
 4 # 源jar路径  即jenkins构建后存放的路径(
 5 
 6 
 7 SOURCE_PATH=/var/lib/jenkins/workspace
 8 #docker 镜像/容器名字或者jar名字 这里都命名为这个
 9 SERVER_NAME=ms_backend
10 #容器id
11 CID=$(docker ps | grep "$SERVER_NAME" | awk ''{print $1}'')
12 #镜像id
13 IID=$(docker images | grep "$SERVER_NAME" | awk ''{print $3}'')
14 
15 echo "最新构建代码 $SOURCE_PATH/$SERVER_NAME/target/ms_backend.jar 迁移至 $BASE_PATH ...."
16 #把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下
17  mv $SOURCE_PATH/$SERVER_NAME/target/ms_backend-0.0.1-SNAPSHOT.jar $BASE_PATH/ms_backend.jar
18 #修改文件的权限
19  chmod 777 /usr/ms_backend/ms_backend.jar
20  echo "迁移完成"
21 
22 
23 # 构建docker镜像
24         if [ -n "$IID" ]; then
25                 echo "存在$SERVER_NAME镜像,IID=$IID"
26         else
27                 echo "不存在$SERVER_NAME镜像,开始构建镜像"
28                         cd $BASE_PATH
29                 docker build -t $SERVER_NAME .
30         fi
31 
32 # 运行docker容器 33 docker rm $SERVER_NAME //删除原来的容器 34 # --name docker-test 容器的名字为docker-test 35 # -d 容器后台运行 36 # -p 3636:3636 指定容器映射的端口和主机对应的端口都为3636 37 # -v /usr/ms_backend/:/usr/ms_backend/ 将主机的/usr/ms_backend/目录挂载到容器的/usr/ms_backend/ 目录中(不可少每次本地更新jar包重启容器即可,不用重新构建镜像 38 docker run --name $SERVER_NAME -v $BASE_PATH:$BASE_PATH -d -p 8040:8040 $SERVER_NAME 39 echo "$SERVER_NAME容器创建完成"
以上配置全部完成
 
四。构建的过程可能出现的问题
 
1.jenkins 启动 docker /usr/bin/docker-current: Got permission denied while trying to connect to the Docker daemon socket at
答:权限问题 。 需要把 jenkins 用户加入到 dockerroot 组中
参考: https://www.cnblogs.com/wang-yaz/p/10436775.html
 
2.containerd: start container” error=“oci runtime error: container_linux.go:247: starting container process caused “process_linux.go:245: running exec setns process for init caused \“exit status 17\””\n”
答:这个问题是因为 linux 内核版本的问题,运行 dockerlinux 内核版本应在 3.10 以上。所以需要升级 linux 内核
升级内核: https://blog.csdn.net/kikajack/article/details/79396793
 
3.docker . Unable to access jarfile 问题
需要在 Dockerfile 中指定目录
 
4.spring boot 多环境配置方法

 

5. 如果 docker run 容器运行成功后立马意外退出 exit(1)
可以通过 docker logs 容器名称 。 查看日志,分析原因。

 

 

Docker-Docker部署SpringBoot项目

Docker-Docker部署SpringBoot项目

1.1.准备Springboot jar项目#

在这里插入图片描述​将项目打包成jar

1.2.编写Dockerfile#

FROM java:8
VOLUME /tmp
ADD elk-web-1.0-SNAPSHOT.jar elk.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/elk.jar"] 

FROM:表示基础镜像,即运行环境 VOLUME /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录 ADD:拷贝文件并且重命名(ADD elk-web-1.0-SNAPSHOT.jar elk.jar 将应用jar包复制到/elk.jar) EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人员告诉容器布署人员容器应该映射哪个端口给外界 ENTRYPOINT:容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT

1.3.构建容器#

[root@VM_0_15_centos elk]# docker build -t elk .
Sending build context to Docker daemon 14.43 MB
Step 1/5 : FROM java:8
Trying to pull repository docker.io/library/java ... 
8: Pulling from docker.io/library/java
5040bd298390: Pull complete 
fce5728aad85: Pull complete 
76610ec20bf5: Pull complete 
60170fec2151: Pull complete 
e98f73de8f0d: Pull complete 
11f7af24ed9c: Pull complete 
49e2d6393f32: Pull complete 
bb9cdec9c7f3: Pull complete 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for docker.io/java:8
 ---> d23bdf5b1b1b
Step 2/5 : VOLUME /tmp
 ---> Running in 0aec2dc2f98c
 ---> a52e844f25d4
Removing intermediate container 0aec2dc2f98c
Step 3/5 : ADD elk-web-1.0-SNAPSHOT.jar elk.jar
 ---> 3ba2f4fdddda
Removing intermediate container 860a0f748a23
Step 4/5 : EXPOSE 8080
 ---> Running in 1d3331cc2be6
 ---> e9ac33d26ce0
Removing intermediate container 1d3331cc2be6
Step 5/5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /elk.jar
 ---> Running in d354f8ee2af5
 ---> 8937e1ade6c7
Removing intermediate container d354f8ee2af5
Successfully built 8937e1ade6c7 

1.4.运行容器#

docker run -di --name 容器名称 -p 8080:8080 镜像名称 

其中-d表示后台运行容器,这也就自然地解决的Spring Boot不支持后台运行应用程序的问题。 -p 8080:8080表示将容器内部的8080端口映射到宿主机器的8080端口,这样就可以通过宿主机器直接访问应 用。 --name 给容器取一个容易记住的名字方便日后管理。
[root@VM_0_15_centos elk]# docker run -di --name myspringboot -p 8080:8080 8937e1ade6c7
04d6b2c347950a10c95a039c94a3e51d717e516dd8c3c742e3197687dfcf5523
[root@VM_0_15_centos elk]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
04d6b2c34795        8937e1ade6c7        "java -Djava.secur..."   8 seconds ago       Up 7 seconds        0.0.0.0:8080->8080/tcp   myspringboot
[root@VM_0_15_centos elk]# 

1.5.查看运行日志#

docker logs -f --tail=100 容器名称
[root@VM_0_15_centos elk]# docker logs -f --tail=100 04d6b2c34795
  .   ____          _            __ _ _
 / / ___''_ __ _ _(_)_ __  __ _    
( ( )___ | ''_ | ''_| | ''_ / _` |    
 /  ___)| |_)| | | | | || (_| |  ) ) ) )
  ''  |____| .__|_| |_|_| |___, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.5.4.RELEASE)
2019-12-29 07:42:58.982  INFO 1 --- [           main] c.b.ElkExampleSpringBootApplication      : Starting ElkExampleSpringBootApplication v1.0-SNAPSHOT on 04d6b2c34795 with PID 1 (/elk.jar started by root in /)
2019-12-29 07:42:58.999  INFO 1 --- [           main] c.b.ElkExampleSpringBootApplication      : No active profile set, falling back to default profiles: default
2019-12-29 07:42:59.243  INFO 1 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5a2e4553: startup date [Sun Dec 29 07:42:59 UTC 2019]; root of context hierarchy
2019-12-29 07:43:03.652  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2019-12-29 07:43:03.699  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-12-29 07:43:03.714  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.15
2019-12-29 07:43:04.012  INFO 1 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-12-29 07:43:04.012  INFO 1 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4772 ms
2019-12-29 07:43:04.449  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: ''dispatcherServlet'' to [/]
2019-12-29 07:43:04.470  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: ''characterEncodingFilter'' to: [/*]
2019-12-29 07:43:04.470  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: ''hiddenHttpMethodFilter'' to: [/*]
2019-12-29 07:43:04.471  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: ''httpPutFormContentFilter'' to: [/*]
2019-12-29 07:43:04.471  INFO 1 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: ''requestContextFilter'' to: [/*]
2019-12-29 07:43:05.534  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@5a2e4553: startup date [Sun Dec 29 07:42:59 UTC 2019]; root of context hierarchy
2019-12-29 07:43:05.765  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/exception]}" onto public java.lang.String com.bruceliu.controller.ELKController.exception()
2019-12-29 07:43:05.766  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/elkdemo]}" onto public java.lang.String com.bruceliu.controller.ELKController.helloWorld()
2019-12-29 07:43:05.772  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2019-12-29 07:43:05.780  INFO 1 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2019-12-29 07:43:05.869  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29 07:43:05.869  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29 07:43:05.984  INFO 1 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2019-12-29 07:43:06.387  INFO 1 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2019-12-29 07:43:06.537  INFO 1 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2019-12-29 07:43:06.562  INFO 1 --- [           main] c.b.ElkExampleSpringBootApplication      : Started ElkExampleSpringBootApplication in 8.771 seconds (JVM running for 9.832) 

1.6.访问测试#

在这里插入图片描述

2.Docker远程连接并且使用idea一键部署#

2.1.配置docker远程连接端口#

首先编辑我们服务器上的docker文件

vim /usr/lib/systemd/system/docker.service 

修改以ExecStart开头的行(centos 7):添加

-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock  

在这里插入图片描述​修改后保存文件,然后重启docker

systemctl daemon-reload
service docker restart 

重启之后测试远程连接是否正常,这里的2375是之前配置的端口

curl http://localhost:2375/version 

看到返回信息基本上就没有问题了

[root@VM_0_15_centos elk]# curl http://localhost:2375/version
{"Version":"1.13.1","ApiVersion":"1.26","MinAPIVersion":"1.12","GitCommit":"7f2769b/1.13.1","GoVersion":"go1.10.3","Os":"linux","Arch":"amd64","KernelVersion":"3.10.0-957.21.3.el7.x86_64","BuildTime":"2019-09-15T14:06:47.565778468+00:00","PkgVersion":"docker-1.13.1-103.git7f2769b.el7.centos.x86_64"} 

然后开启端口,或者关闭防火墙,二者选其一即可

firewall-cmd --zone=public --add-port=2375/tcp --permanent 

chkconfig iptables off 

然后打开浏览器测试将之前的localhost修改为你的ip在这里插入图片描述

2.2.使用idea连接到docker#

首先下载docker插件,idea2019自带了docker插件。如果没有插件可以选择安装docker插件在这里插入图片描述​然后配置docker地址,在你的File | Settings | Build, Execution, Deployment | Docker在这里插入图片描述​配置完成链接之后,出现了框中的内容即可.在这里插入图片描述​链接成功之后会列出容器和镜像!

配置阿里云镜像加速器:在这里插入图片描述

2.3.docker-maven-plugin 介绍#

在我们持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。

pom.xml:

<build>

        <finalName>${project.artifactId}</finalName>

        <plugins>

            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
            <!-- 跳过单元测试 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

            <!--使用docker-maven-plugin插件-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.0.0</version>
                <!--将插件绑定在某个phase执行-->
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--指定生成的镜像名-->
                    <imageName>bruceliu/${project.artifactId}</imageName>
                    <!--指定标签-->
                    <imageTags>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <!--指定基础镜像jdk1.8-->
                    <baseImage>java</baseImage>
                    <!--镜像制作人本人信息-->
                    <maintainer>bruceliu@email.com</maintainer>
                    <!--切换到ROOT目录-->
                    <workdir>/ROOT</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                    <!--指定远程 docker api地址-->
                    <dockerHost>http://122.51.50.249:2375</dockerHost>
                    <!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <!--jar 包所在的路径  此处配置的 即对应 target 目录-->
                            <directory>${project.build.directory}</directory>
                            <!--用于指定需要复制的文件 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

        </plugins>
    </build> 

执行Maven打包命令:在这里插入图片描述

G:softDevelopmentJDK8binjava -Dmaven.multiModuleProjectDirectory=E:workspace2017elk-web -Dmaven.home=E:Maven20190910apache-maven-3.6.1 -Dclassworlds.conf=E:Maven20190910apache-maven-3.6.1binm2.conf "-javaagent:G:idea2017IntelliJ IDEA 2017.3.1libidea_rt.jar=49260:G:idea2017IntelliJ IDEA 2017.3.1bin" -Dfile.encoding=UTF-8 -classpath E:Maven20190910apache-maven-3.6.1bootplexus-classworlds-2.6.0.jar org.codehaus.classworlds.Launcher -Didea.version=2017.3.7 -s E:Maven20190910apache-maven-3.6.1confsettings.xml -Dmaven.repo.local=E:Maven20190910repository package
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.bruceliu.elk.demo:elk-web:jar:1.0-SNAPSHOT
[WARNING] ''build.plugins.plugin.(groupId:artifactId)'' must be unique but found duplicate declaration of plugin org.springframework.boot:spring-boot-maven-plugin @ line 36, column 21
[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] -------------------< com.bruceliu.elk.demo:elk-web >--------------------
[INFO] Building elk-web 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ elk-web ---
[INFO] Using ''UTF-8'' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ elk-web ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to E:workspace2017elk-webtargetclasses
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ elk-web ---
[INFO] Using ''UTF-8'' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory E:workspace2017elk-websrctestresources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ elk-web ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ elk-web ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ elk-web ---
[INFO] Building jar: E:workspace2017elk-webtargetelk-web.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:1.5.4.RELEASE:repackage (default) @ elk-web ---
[INFO] 
[INFO] --- docker-maven-plugin:1.0.0:build (build-image) @ elk-web ---
[INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier]
[INFO] Copying E:workspace2017elk-webtargetelk-web.jar -> E:workspace2017elk-webtargetdockerelk-web.jar
[INFO] Building image bruceliu/elk-web
Step 1/6 : FROM java
 ---> d23bdf5b1b1b
Step 2/6 : MAINTAINER bruceliu@email.com
 ---> Running in 787e4786fbd4
 ---> 4d4519f52fda
Removing intermediate container 787e4786fbd4
Step 3/6 : WORKDIR /ROOT
 ---> f40dcbc9a9eb
Removing intermediate container 7fa6bbc9d1df
Step 4/6 : ADD /elk-web.jar //
 ---> c7f1107ae3d4
Removing intermediate container f370558f1a38
Step 5/6 : ENTRYPOINT java -jar /elk-web.jar
 ---> Running in e4480ced0829
 ---> b634ca5fa5ad
Removing intermediate container e4480ced0829
Step 6/6 : CMD java -version
 ---> Running in cc6a064ef921
 ---> cf9a5d50326b
Removing intermediate container cc6a064ef921
Successfully built cf9a5d50326b
[INFO] Built bruceliu/elk-web
[INFO] Tagging bruceliu/elk-web with latest
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.329 s
[INFO] Finished at: 2019-12-29T22:44:06+08:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

Dockerfile 部署springboot项目 流程

Dockerfile 部署springboot项目 流程

编写Dockerfile文件

FROM openjdk:8-jre-alpine
MAINTAINER projectName

ENV PARAMS=""

#添加到本地,如果需要把jar包放到容器内部,则需要添加这行
#ADD target/isafe-admin.jar /admin.jar


#时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo ''Asia/Shanghai'' >/etc/timezone

#ENTRYPOINT ["java", "-jar", "$PARAMS /admin.jar"]
ENTRYPOINT ["sh","-c","java -jar /home/jar/admin.jar --spring.profiles.active=pro $PARAMS"]

在Dockerfile文件目录下运行docker命令   

docker build -t admin:v1 .

注意最后有一个点

运行成功后,在images里就已经有了,

 

启动镜像

把springboot的jar包放到 宿主机/home/test目录下

docker run -d -p18081:8081 -v /home/test:/home/jar --name webadmin admin:v1 /bin/bash

查看日志

docker logs -f --tail 20 admin:v1

Docker下部署springboot项目

Docker下部署springboot项目

1.背景

如何在docker容器环境下部署一个springboot项目?

2.具体步骤

第一步:准备一个springboot项目的xxxx.jar包

jar包中用于测试的一个接口如下

 

第二步:编写Dockerfile文件

案例文件名为:dockerFileSpringboot

# docker部署springboot项目
FROM openjdk:11.0.4 
# 作者
MAINTAINER lidongping <851298348@qq.com> wechat:851298348
# 共享容器卷
VOLUME /tmp 
# 将jar包添加到容器中并更名为app.jar
ADD dockerdemo-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

 

第三步:在装有docker的主机上建立一个该项目的文件夹,并将xxx.jar和Dockerfile文件放在下面

 

第四步:生成镜像

 

 第五步:运行容器

 

 第六步:访问测试

 

 完美!

关于spring-boot项目的docker集成化部署的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于docker+jenkins 实现 spring boot 项目持续集成自动化部署、Docker-Docker部署SpringBoot项目、Dockerfile 部署springboot项目 流程、Docker下部署springboot项目等相关内容,可以在本站寻找。

本文标签: