Docker实现SpringBoot项目的快速构建

Posted AdobePeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker实现SpringBoot项目的快速构建相关的知识,希望对你有一定的参考价值。

目录

前言

本章节技术栈

1.通过docker-compose实现快速环境搭建

1.1.编写docker-compose.yml

1.2.docker-compose安装与使用

1.2.1.docker-compose下载

1.2.2.docker-compose安装

1.2.3.docker-compose使用

2.Jenkins完成一键任务发布

2.1.Jenkins的安装

2.2.Jenkins的配置

2.2.1.maven环境配置

2.2.2.SSH免密登录配置

2.3.创建一个maven项目

2.3.1.配置git

2.3.2.项目构建镜像配置

2.4.镜像仓库的安装与使用

2.4.1安装镜像仓库

2.4.2.镜像仓库的使用

3.运行测试

4.大结局


前言

上一篇我们实现了通过DockerFile构建项目镜像并且启动,这只是万里长征的第一步。这里的内容比较多,一篇全部写完担心很多小伙伴没有耐心去看完,所以这里分了两个章节。

文末有工程git地址,也有微信二维码,欢迎点赞收藏

本章节技术栈

docker-compose、jenkins、ssh免密登录、docker本地镜像仓库的使用

1.通过docker-compose实现快速环境搭建

目的:因为我们要上线一个项目不可能只有一个jar包,最起码的还需要一些基础环境,例如jdk、mysql,有的还需要用到缓存redis、消息中间件等等。如果不通过docker-compose进行环境搭建的话,常规方法需要一个个下载安装包,上传至服务器,安装。但是通过docker-compose可以实现一个命令全部帮你搞定,对于部署或者迁移环境十分方便。

1.1.编写docker-compose.yml

我们可以在项目中新建一个docker-compose.yml文件,便于格式化。

目录文件如下:

文件内容如下: 解释已经非常全面了

version: "3.0"
services:
  mysql:
    # mysql版本
    image: mysql:5.7
    # 自动重启
    restart: always
    # 容器名,因为不需要每次启动都重新指定容器
    container_name: mysql7
    ports:
      - 3306:3306
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --default-time-zone=+8:00
    environment:
      # root账号密码
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_ALLOW_EMPTY_PASSWORD: "NO"
      # 创建的数据库
      MYSQL_DATABASE: "dockertest"
    volumes: # 数据卷挂载
      - "./mysql/db:/var/lib/mysql"
    networks: # 局域网
      - dockertest
  redis:
    restart: always
    image: redis:5.0.12
    container_name: redis5
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"
    volumes:  # 数据卷挂载
      - ./redis/data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
    networks:
      - dockertest
  dockertest:
    restart: always
    build: ./
    ports:
      - 8080:8080
    depends_on: #依赖mysql和redis
      - mysql
      - redis
    networks: # 局域网
      - dockertest
# 局域网设置
networks:
  dockertest:

主要讲一下局域网设置,因为每一个容器都相当于一台虚拟机,所以他们之间是独立的。通过设置这个局域网,能够让他们处于同一网段,这样的话我们在application配置链接数据的地方的ip就可以直接填容器名即可。如下:

spring:
  application:
    name: dockertest
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql7:3306/dockertest?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=false
    username: root
    password: root
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    serialization:
      write-dates-as-timestamps: false
  liquibase:
    change-log: classpath:db/changelog/master.xml

到这里配置就完成啦,

1.2.docker-compose安装与使用

1.2.1.docker-compose下载

这是官网的下载方法:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

但是你下载的时候你会发现速度比闪电的速度还要慢

所以我这里为大家直接准备了安装包

链接:https://pan.baidu.com/s/18fzQkB1f1LpuzspbOf9o8Q 
提取码:felp 

要是我看到这么贴心的博主,反手就是一个赞。

1.2.2.docker-compose安装

  • 将下载的docker-compose拷贝到 /usr/local/bin目录下
  • 为该文件添加可执行权限
  • 查看版本号,是否成功
[root@adobe2 docker]# cd /usr/local/bin/
[root@adobe2 bin]# rz -y                                                                            
[root@adobe2 bin]# ls
docker-compose
[root@adobe2 bin]# sudo chmod +x /usr/local/bin/docker-compose
[root@adobe2 bin]# docker-compose -v
docker-compose version 1.27.2, build 18f557f9

安装完成

1.2.3.docker-compose使用

首先我们创建一个docker文件夹,然后通过rz -y命令将一下几个文件都拷贝进来

  • docker-compose.yml
  • DockerFile
  • 工程jar包

如下

此时执行docker-compose up -d (注:-d的意思是后台执行,我们可以先不加,看看执行日志)

docker-compose up走起:日志比较多,我就简单的截取一点,如果出现这些说明启动成功,否则有问题。可以查看是否之前有镜像或者容器冲突了,或者可以扫描下面二维码,微信私聊。

[root@adobe2 docker]# docker-compose up
Pulling mysql (mysql:5.7)...   先去拉取mysq镜像
5.7: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
a023ae82eef5: Pull complete
e76c35f20ee7: Pull complete
e887524d2ef9: Pull complete
ccb65627e1c3: Pull complete
Digest: sha256:a682e3c78fc5bd941e9db080b4796c75f69a28a8cad65677c23f7a9f18ba21fa
Status: Downloaded newer image for mysql:5.7  拉取msyql镜像完成
Pulling redis (redis:5.0.12)...
5.0.12: Pulling from library/redis  开始拉取redis镜像
69692152171a: Already exists
a4a46f2fd7e0: Pull complete
bcdf6fddc3bd: Pull complete
1f499504197d: Pull complete
021b18181099: Pull complete
1fb4123902bc: Pull complete
Digest: sha256:c2b0f6fe0588f011c7ed7571dd5a13de58cff538e08d100f0a197a71ea35423a
Status: Downloaded newer image for redis:5.0.12  redis镜像拉取完成
Building dockertest  开始构建工程镜像
Step 1/7 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/7 : MAINTAINER 15705116160@163.com
 ---> Running in 21eff71cf66f
Removing intermediate container 21eff71cf66f
 ---> 00a2cc2b062f
Step 3/7 : VOLUME /tmp
 ---> Running in 833e6a995dd2
Removing intermediate container 833e6a995dd2
 ---> db85d71e6242
Step 4/7 : ADD dockertest.jar mydockertest.jar
 ---> 4d0cb030de75
Step 5/7 : RUN bash -c 'touch /mydockertest.jar'
 ---> Running in 87b181c09bc9
Removing intermediate container 87b181c09bc9
 ---> 1bd22d99dea6
Step 6/7 : ENTRYPOINT ["java","-Djava.-Djava.security.egd=file:/dev/./urandom","-jar","/mydockertest.jar"]
 ---> Running in 8394adea736c
Removing intermediate container 8394adea736c
 ---> 7d4f56981960
Step 7/7 : EXPOSE 8080
 ---> Running in 661f6ffbe7ce
Removing intermediate container 661f6ffbe7ce
 ---> 4bfbf1fb68a4

Successfully built 4bfbf1fb68a4
Successfully tagged docker_dockertest:latest
WARNING: Image for service dockertest was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mysql7 ... done    创建msyql容器
Creating redis5 ... done    创建redis容器
Creating docker_dockertest_1 ... done  创建荣成容器
Attaching to redis5, mysql7, docker_dockertest_1  

在下面就是启动日志

这时候说明已经启动成功了,因为不是后台启动的,所以我们可以重新打开一个窗口,通过docker ps查看是否已经启动成功

[root@adobe2 docker]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
aec612ad427f   docker_dockertest     "java -Djava.-Djava.…"   7 minutes ago   Up 6 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                                  docker_dockertest_1
e5c987fe7933   mysql:5.7             "docker-entrypoint.s…"   7 minutes ago   Up 7 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp                                       mysql7
7bb6de3aaef6   redis:5.0.12          "docker-entrypoint.s…"   7 minutes ago   Up 7 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                                  redis5
[root@adobe2 docker]# 

我们可以看到已经启动成功。

为了验证一下局域网,我们可以看一下对应的数据库是否已经创建,并且第一章节里面Liquibase创建的表是否已经创建。

到这里Docker-compose就算结束了,有没有发现方便快捷很多。

例如我现在要迁移一套pre环境出来,我是不是可以快速的搞定,软件安装可以直接通过docker-compose安装,连数据库初始化脚本都不需要你手动去执行。

2.Jenkins完成一键任务发布

目的:我们如果想要发布某个工程,以前的逻辑是打包、停服务、备份上一个版本的jar包、远程拷贝新的jar包、启动服务。这样处理起来十分麻烦,服务停止的时间也过长。那么通过Jenjins可以实现可以实现一键发布,对,就是一键做完上面的所有事情。

2.1.Jenkins的安装

这里我也踩了不少坑,之前在官网上找到一些镜像,安装完成过后很多插件下载不了,最后找到一个非常棒的镜像。

#拉取Jenkins官方提供的集成blueocean插件的镜像
docker pull jenkinsci/blueocean

#运行容器 
docker run -d --name jenkins -u root -p 8888:8080 -p 50000:50000 --privileged=true  -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean

参数说明:
-d:守护进程的方式启动容器,不打印正在运行的此容器的Docker日志。(或 -it:交互的方式启动容器,打印容器的启动日志信息,相当执行了一遍 docker logs -f jenkins )。
-p:将容器的8080端口映射到宿主机的8888端口。
-v:挂载目录(宿主机目录:容器目录);挂载后,修改宿主机的挂载目录将直接影响到容器的目录。
--name:容器的名称。
--privileged:使用该参数,container内的root拥有真正的root权限。
jenkinsci/blueocean:指定镜像名。

一步一步带你执行:拉取镜像(docker pull jenkinsci/blueocean)

[root@adobe1 ~]# docker pull jenkinsci/blueocean
Using default tag: latest
latest: Pulling from jenkinsci/blueocean
540db60ca938: Pull complete 
2a961b9363b0: Pull complete 
d6a479880c83: Pull complete 
8eaeff69d97a: Pull complete 
351ca2eaf86b: Pull complete 
f6c722701e33: Pull complete 
2e4f785df836: Pull complete 
d3df0c4abbde: Pull complete 
bc5608b67244: Pull complete 
3f8e7265de76: Pull complete 
b43472033709: Pull complete 
8c8d6280a0e7: Pull complete 
a1ce0802fc1d: Pull complete 
8fe1c5ba0c97: Pull complete 
b79e1d38088e: Pull complete 
ab0203034c1e: Pull complete 
Digest: sha256:ca7bf6f518a5397a9b5635edcd84cf3aa9db37a9dde4db508d664be8c073ed12
Status: Downloaded newer image for jenkinsci/blueocean:latest
docker.io/jenkinsci/blueocean:latest

创建文件夹,用于数据挂载,启动容器

[root@adobe1 docker]# mkdir jenkins_home
[root@adobe1 docker]# ls
jenkins_home
[root@adobe1 docker]# docker run -d --name jenkins -u root -p 8888:8080 -p 50000:50000 --privileged=true  -v /root/docker/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
fd6eb90fa50abbb19f724ecf2e161928c76b27a5108d87fcbf0071e231238c3b
[root@adobe1 docker]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES
fd6eb90fa50a   jenkinsci/blueocean   "/sbin/tini -- /usr/…"   2 minutes ago   Up 2 minutes   0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:8888->8080/tcp, :::8888->8080/tcp   jenkins
[root@adobe1 docker]# 

启动成功过后打开访问页面 ip:8888,

到目录中找到管理员密码,复制进去

[root@adobe1 docker]# cat jenkins_home/secrets/initialAdminPassword 
4f08c861ea3c495c92da9f96d6757e2c
[root@adobe1 docker]# 

直接安装推荐插件,后面有需要的我们再装

安装插件等待页面,如果有些插件安装失败,重试几次基本上就OK了。如果有个把是在安装不了就先过,里面也不一定用得到。

创建用户

2.2.Jenkins的配置

2.2.1.maven环境配置

首先到jenkins容器中安装maven

# 找到容器ID
>docker ps
# 进入容器
>docker exec -it dec76b38dd0e bash  
# 到/usr/local 目录下
>cd usr/local/
# 下载maven
>wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
# tar开压缩包
>tar -xzvf apache-maven-3.3.9-bin.tar.gz 
# 删除压缩包
>rm apache-maven-3.3.9-bin.tar.gz 
# 查看文件夹中的文件
>ls
apache-maven-3.3.9  bin  lib  share
# 创建maven仓库文件夹
>mkdir MavenSpace
# 配置环境变量
>vi /etc/profile
# 添加到文件的最下方
#set Maven environment
export MAVEN_HOME=/usr/local/apache-maven-3.3.9
export PATH=$MAVEN_HOME/bin:$PATH

# 使环境变量立即生效
>source /etc/profile
# 查看版本号,以及是否配置成功
>mvn -v

# 修改setting文件
>vi apache-maven-3.3.9/conf/settings.xml
# maven仓库地址
<localRepository>/usr/local/MavenSpace</localRepository>
# 镜像地址
<mirror>
   <id>nexus-aliyun</id>
   <mirrorOf>central</mirrorOf>
   <name>Nexus aliyun</name>
   <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

安装完后到jenkins页面进行配置,需要先安装maven插件

输入maven,选择Maven Integration 直接安装

安装完成后,回到系统管理界面,选择全局工具配置,进行maven配置,这里jdk直接选择自动安装,需要输入Oracle账号密码(自行搞定吧),下面还有一个git配置,直接选择自动安装,搞定。

2.2.2.SSH免密登录配置

回到插件管理中,下载安装插件

安装完成后前往系统配置

滑倒最下面,可以看到ssh配置的地方

回到虚拟机,配置ssh免密登录

# 回到根目录
>cd ~
# 如果配置过的话可以先删除
>rm -rf ./.ssh/
# 生成公钥私钥
>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:z1Be2+ogkQuKgXPFbMc+Q3NyuALLYq5nDyp0It4gEws root@adobe1
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|   o . .         |
|  . = B o . .    |
|Eo = + * + . o   |
|=+= . * S . . .  |
|BB + o + *   .   |
|=oB .   o + .    |
|oooo     . o     |
|+o ..       .    |
+----[SHA256]-----+
# 进入到.ssh文件夹中
>cd .ssh/
# 查看当前文件夹内容
>ls
id_rsa  id_rsa.pub
# 将id_rsa.pub内容复制到文件authorized_keys中,文件名固定
>cat id_rsa.pub > authorized_keys
# 赋操作权限(重要)
>chmod 600 authorized_keys 
>chmod 700 /root/.ssh/

配置完成后,将id_rsa中的内容拷贝贴到jenkins配置中,配置如下,点击按钮Test Configuation测试成功。后面就可以直接些shell操作宿主机了,棒不棒。

2.3.创建一个maven项目

回到首页,点击新建任务,创建一个maven任务

2.3.1.配置git

填写git上工程的地址,以及你的git账号密码

这里需要在下载一个插件,为了再构建选择分支更方便

下面配置分支

配置完分支后可以再项目管理页面点击Build with Parameters可以查看已经有一个master分支了

2.3.2.项目构建镜像配置

首先我们需要配置一下打包命令,注意一下自己的pom文件所在的位置

#  -Dmaven.test.skip=true是为了跳过测试,因为我们在链接数据的时候使用的是局域网,mysql7
clean package spring-boot:repackage -Dmaven.test.skip=true

下面我们需要将代码打包、构建镜像、将镜像备份至本地镜像仓库

我们先编写打包镜像命令,我们是先构建不带项目版本号的镜像,然后为该镜像复制一个带有版本号的副本为了上传至镜像仓库(后面会提到镜像仓库安装与使用)。这么做的目的是镜像仓库里面的版本可用于出现异常情况进行回滚,不带版本号的镜像我们就正常创建容器,启动。写的还是挺详细的。


# 获取版本号
VERSION=$POM_VERSION
# 服务名称
APPLICATION=dockertest
# 版本包类型,jar或者war
PTYPE=jar
# 拼接镜像地址
REPOSITORY=192.168.44.132:5000/$APPLICATION:$VERSION
# 编写dockerfile
cat > Dockerfile << EOF
FROM java:8
# 作者
MAINTAINER 15705116160@163.com
# copy files to working folder
COPY docker/target/$APPLICATION-$VERSION.$PTYPE .
# set working folder
WORKDIR .
RUN chmod +x $APPLICATION-$VERSION.$PTYPE
ENTRYPOINT ["java","-jar","./$APPLICATION-$VERSION.$PTYPE"]
EOF

# 创建镜像
docker build -t $APPLICATION .
echo "=========build image success ============="


# 重命名镜像
docker tag $APPLICATION $REPOSITORY 
echo "=========rename image success ============="


# 上传镜像
docker push $REPOSITORY
echo "=========push image success ============="

# 如果有同名镜像,先删除
IMAGEID=`docker images | grep "/$REPOSITORY " | grep "$VERSION" | awk ' print $3 '`
if [ $IMAGEID>0 ]
then
	docker rmi $IMAGEID
fi
echo "=========del image success ============="

下一步是在构建前执行,我们需要先将容器停掉,再将该容器删除,最后删掉对应的镜像

#!/bin/bash
result=$(docker ps| grep "dockertest") 
if [[ "$result" != "" ]]
then
echo "================docker stop dec-netty================"
docker stop dockertest
fi
result1=$(docker ps -a | grep "dockertest") 
if [[ "$result1" != "" ]]
then
echo "================docker rm dec-netty================"
docker rm dockertest
fi

result2=$(docker images | grep "dockertest")
if [[ "$result2" != "" ]]
then
echo "================docker rmi dec-netty:0.0.1================"
docker rmi dockertest:latest
fi

下面这步是在构建后执行,构成成功后,我们需要将镜像启动

# 运行容器
# --network images_dockertest 这是局域网,我们可以通过docker network ls 进行查看
docker run -d -p 8081:8080 --name dockertest --network images_dockertest --restart=always dockertest:latest

暂时我们先不启动,因为我们还没有创建本地镜像仓库,我们先创建镜像仓库,最后运行看效果

2.4.镜像仓库的安装与使用

2.4.1安装镜像仓库

# 拉取镜像
>docker pull registry
# 启动镜像仓库
>docker run -d -p 5000:5000 --restart always --name registry --privileged -v ./images:/var/lib/registry registry:latest

# 修改daemon.json 文件,将本机的ip地址配置进去
>nano daemon.json

		  "registry-mirrors": ["https://ok6qwbjg.mirror.aliyuncs.com"],
		  "insecure-registries": ["192.168.44.132:5000"]


#重启docker,镜像仓库安装完成
>service docker restart

2.4.2.镜像仓库的使用

     将镜像打标记,并上传至镜像仓库
    docker tag 51e0db6d58d2 192.168.44.132:5000/dockerTag:0.0.1
    docker push 192.168.44.132:5000/dockerTag:0.0.1
    查看镜像仓库
    curl -XGET http://192.168.44.132:5000/v2/_catalog
    查看某个镜像的版本
    curl -XGET http://192.168.44.132:5000/v2/dockertest/tags/list
    拉取镜像
    docker pull 192.168.44.132:5000/dockertest:0.0.1


3.运行测试

全部配置完成,回到工程页面进行构建

构建完成后我们可以查看,按照预想应该是有一个不到版本号的镜像,项目的容器已经启动,并且镜像仓库中有带版本号的镜像

访问页面

4.大结局

这篇全是图片,感觉写的有点乱,但是步骤应该是没有落下的。基本上的坑我都替大家踩完 了,大家如果看完有问题的话,欢迎留言或者添加我的微信一起讨论。

最后附上工程git地址,大家可以下载下来参考参考。

git地址:https://gitee.com/adobepzf/docker-test.git

微信:

以上是关于Docker实现SpringBoot项目的快速构建的主要内容,如果未能解决你的问题,请参考以下文章

Docker实现SpringBoot项目的快速构建

Docker实现SpringBoot项目的快速构建

Docker实现SpringBoot项目的快速构建

Docker实现SpringBoot项目的快速构建

Docker实现SpringBoot项目的快速构建

Docker实现SpringBoot项目的快速构建