Docker实现SpringBoot项目的快速构建
Posted AdobePeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker实现SpringBoot项目的快速构建相关的知识,希望对你有一定的参考价值。
目录
前言
上一篇我们实现了通过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项目的快速构建的主要内容,如果未能解决你的问题,请参考以下文章