翼度科技»论坛 云主机 LINUX 查看内容

通过Docker部署SpringBoot项目

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
Docker部署SpringBoot项目

前言:
以前几次在云服务器上部署项目都是手动打包,安装mysql等环境最后再部署运行,相对比较麻烦而且加上网上各种教程质量层次不齐,如果过程中出错的话排查问题对于新人来说已经够喝一壶了。(我自己第一次手动装mysql8.0就出过问题,最后找不到问题所在只能推倒一步步重来)
而最近在Win10专业版下用Docker桌面版安装了zookeeper/rabbitmq/redis 6.2等都比较方便,命令行拉取镜像,启动服务都非常方便快捷,相比以往下载配置环境变量再启动的方式要方便很多,所以此次决定尝试一下通过Docker的方式来安装部署一次Spring Boot项目。
声明:本文主要介绍如何通过 IntelliJ IDEA、Maven 来操作 Docker 部署 Spring Boot 项目到云服务器,不涉及Docker或Maven等内容中的基本概念,默认读者已经了解,相关教程请自行搜索。
云服务器:阿里云Centos 7
1.云服务器基本环境搭建

安装Docker

yum安装Docker
  1. yum install docker
复制代码
启动docker并设置为启动:
  1. systemctl  start docker.service
  2. systemctl  enable docker.service
复制代码
使用docker国内镜像加速
  1. vim  /etc/docker/daemon.json
复制代码
内容如下(也可自己搜索其他镜像修改)
  1. {
  2.     "registry-mirrors": ["https://registry.docker-cn.com"],
  3.     "live-restore": true
  4. }
复制代码
重启docker
  1. systemctl restart docker
复制代码
可以看到镜像已经改了
  1. docker info
复制代码

查看docker版本信息
  1. docker version
复制代码
安装JDK

耐心等待安装完成
  1. yum -y install java-1.8.0-openjdk
复制代码
查找java所在位置
  1. whereis java
复制代码

配置环境变量
  1. vim /etc/profile
复制代码
配置信息
  1. export JAVA_HOME=/usr/lib/jvm/java-1.8.0
  2. export PATH=$PATH:$JAVA_HOME/bin
复制代码
再次刷新配置信息
  1. source /etc/profile
复制代码
查看java版本信息
  1. java -version
复制代码

安装Maven

方式有很多种,自己到Maven官网下载上传到服务器解压或者直接wget命令安装(通过yum安装weget命令).我这里选用第一种.
本质上和在win10下安装没什么区别都是下载->解压->配置镜像和仓库->配置环境变量这几个步骤
下载Maven
Maven官网:
  1. https://maven.apache.org/docs/history.html
复制代码
下载Linux版本,然后传到云服务器手动解压安装

可以直接下载最新版本,但我个人一般习惯往前找几个版本的,所以继续往下滑
1.看到标题停下来,它给我们指明了更早的版本在哪去找

2.二进制文件就是我们要的,source指的是源码
3.选择对应Linux的版本
上传到服务器并解压
把它下载然后上传到服务器指定目录下(我这里用XFTP传到了usr/local目录下)
这时候解压它就行

通过如下命令解压
  1. tar -zxvf apache-maven-3.6.3-bin.tar.gz
复制代码

配置镜像和本地仓库信息
上面这个就是解压后的文件夹,只需要配置下国内镜像地址和本地仓库位置信息就可以用了。
  1. cd apache-maven-3.6.3   #进入apache-maven-3.6.3目录
复制代码

这时候可以新建一个目录,用作后续修改配置文件,存放maven下载的jar
  1. mkdir repository    #创建目录存放后续maven下载jar包
复制代码

进入conf目录,通过vim修改settings.xml,配置镜像和本地仓库信息
vim基本操作:
i:进入编辑模式
esc +!:wq: 保存并退出
  1. cd conf #进入conf目录
复制代码
  1. vim settings.xml  #编辑配置文件
复制代码
配置文件里我们只关心mirrors根节点下的镜像和localRepository根节点下的本地仓库位置
本地仓库:解除注释,把位置改成之前自己创建的仓库目录的完整路径
  1. <localRepository>/usr/local/apache-maven-3.6.3/repository</localRepository>
复制代码
镜像地址:注意name和url这些不要搞错了
  1. <mirror>
  2.       <id>alimaven</id>
  3.       <name>aliyun maven</name>
  4.        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5.       <mirrorOf>central</mirrorOf>
  6. </mirror>
复制代码
修改完以上的两处,保存并退出就行。
配置环境变量
接下来是,依旧是配置环境变量
  1. vim /etc/profile
复制代码
编辑/etc/profile 文件,系统环境变量都在这配置
  1. export MAVEN_HOME=/usr/local/apache-maven-3.6.3
  2. export PATH=$PATH:$MAVEN_HOME/bin
复制代码
刷新配置文件:
  1. source /etc/profile
复制代码

查看Maven版本信息
  1. mvn -v
复制代码

以下的Mysql和Redis的安装只是因为我的项目用到了,如果只是自己体验整个部署流程的话不需要安装
安装Mysql

到DockerHub找一个mysql镜像,我这里用的mysql8
https://hub.docker.com/_/mysql
到tags下搜索,然后复制命令拉取镜像就行


  • 拉取镜像
  1. docker pull mysql:8.0
复制代码

  • 查看镜像
  1. docker images
复制代码

这里DockerHub官方也给了关于如何使用和连接的指南


  • 创建并修改配置文件
创建两个文件夹conf和data(映射Docker的目录,放置配置文件和日志等信息)
我把它放在了/usr/local/mysql/路径下(看自己习惯)
创建/修改配置文件信息
  1. vim my.cnf  #用touch新建也一样
复制代码
内容如下
  1. [mysql]
  2. #设置mysql客户端默认字符集
  3. default-character-set=UTF8MB4
  4. [mysqld]
  5. #设置3306端口
  6. port=3306
  7. #允许最大连接数
  8. max_connections=200
  9. #允许连接失败的次数
  10. max_connect_errors=10
  11. #服务端使用的字符集
  12. character-set-server=UTF8MB4
  13. #创建新表时将使用的默认存储引擎
  14. default-storage-engine=INNODB
  15. #等待超时时间秒
  16. wait_timeout=60
  17. #交互式连接超时时间秒
  18. interactive-timeout=600
复制代码

  • 启动并运行mysql
  1. docker run \
  2.   -d \
  3.   -p 3306:3306 \
  4.   -v /usr/local/mysql/data:/var/lib/mysql \
  5.   -v /usr/local/mysql/my.cnf:/etc/mysql/conf.d/my.cnf \
  6.   -e MYSQL_ROOT_PASSWORD=123456 \
  7.   --restart=always \
  8.   --privileged=true \
  9.   --name mysql8 \
  10.   mysql:8.0
复制代码

参数说明
  1. -p 3306:3306:将容器内的3306端口映射到实体机3306端口
  2. --name msqyl:给这个容器取一个容器记住的名字
  3. -e MYSQL_ROOT_PASSWORD=xxx:docker的MySQL默认的root密码是随机的,这是改一下默认的root用户密码
  4. -v 宿主机和Docker容器的挂载关系 :前是宿主机的路径,后是Docker中的挂载路径
  5. -d mysql:8.0在后台运行mysql:8.0镜像产生的容器
复制代码
后续导入SQL还踩了坑.原因是mysql是通过Docker安装的,而我恢复快照用的是Linux中的路径.
所以dump快照生成的sql文件本身也必须挂载到docker容器中.否则source命令会找不到文件所在.
获取容器/镜像的元数据,通过这个也能看到挂载信息
我这里后续继续挂载到/var/lib/mysql目录下了
  1. docker cp :用于容器与主机之间的数据拷贝
复制代码

安装Redis

拉取镜像
https://registry.hub.docker.com/_/redis
因为我的项目里用到GEO命令,所以要拉取6.2以上的版本
  1. docker pull redis:6.2.7
复制代码

  • 创建redis配置文件目录
  1. mkdir /usr/local/redis/conf
  2. mkdir /usr/local/redis/data
  3. touch /usr/local/redis/conf/redis.conf
复制代码
redis.conf文件内容非常的多(可到redis中文官方或者github里自己下一个)
中文地址:http://www.redis.cn/download.html
配置文件中主要关键的地方
  1. bind 127.0.0.1 #使redis可以外部访问
  2. daemonize no#用守护线程的方式启动
  3. requirepass 你的密码#给redis设置密码
  4. appendonly yes#redis持久化  默认是no
  5. tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
复制代码
一启动就闪退的原因:
redis.conf文件中的daemonize为yes,意思是redis服务在后台运行,与docker中的-d参数冲突了。
只要把daemonize的参数值改为no就可以了,再次执行以上命令,容器启动成功。

  • 启动redis容器
  1. docker run -p 6379:6379 --name redis \
  2. -v /usr/local/redis/data:/data \
  3. -v /usr/local/redis/redis.conf:/etc/redis/redis.conf \
  4. -d redis:6.2.7 redis-server /etc/redis/redis.conf \
  5. --appendonly yes
复制代码
容器随docker启动自动运行
  1. # mysql
  2. docker update mysql --restart=always
  3. # redis
  4. docker update redis --restart=always
复制代码
2.项目打包部署到Docker

引入Docker依赖

首先在 Maven pom.xml 配置文件中加入 Docker 的 Maven 插件
这里有两个插件可以实现我们需要的功能
docker-maven-plugin和dockerfile-maven
选择其中一个到maven仓库搜一个版本引入,我这里用的第一个,因为它只需要编写DockerFile就行
Spotify Maven 插件是一个目前比较普遍的选择。它要求应用程序开发人员编写Dockerfile,并把Dockerfile放在项目src/main/docker目录下
  1.                         <plugin>
  2.                 <groupId>com.spotify</groupId>
  3.                 <artifactId>docker-maven-plugin</artifactId>
  4.                 <version>1.0.0</version>
  5.                 <configuration>
  6.                     
  7.                     <dockerDirectory>${project.basedir}</dockerDirectory>
  8.                     
  9.                     <resources>
  10.                         <resource>
  11.                             <targetPath>/</targetPath>
  12.                            
  13.                             <directory>${project.build.directory}</directory>
  14.                            
  15.                             <include>${project.build.finalName}.jar</include>
  16.                         </resource>
  17.                     </resources>
  18.                 </configuration>
  19.             </plugin>
复制代码
编写Dockerfile

Dockerfile是一种被Docker程序解释的脚本,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile。Docker程序将读取Dockerfile,根据指令生成定制的image。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦.
新建Dockerfile放在src/main/docker目录下(注意file是小写)
内容如下
  1. #指定基础镜像源,以其为基础进行制作
  2. FROM adoptopenjdk/openjdk8:latest
  3. # 维护者信息
  4. MAINTAINER qhy
  5. #将jar包添加到容器中
  6. ADD xxx.jar xxx.jar
  7. #对外暴露端口
  8. EXPOSE 8080
  9. # 运行jar包
  10. CMD [java","-jar","xxx.jar"]
复制代码
注意信息:
ADD 、 COPY 指令用法一样,唯一不同的是 ADD 支持将归档文件(tar, gzip, bzip2, etc)做提取和解压操作。还有需要注意的是,COPY 指令需要复制的目录一定要放在 Dockerfile 文件的同级目录下
ENTRYPOINT 容器启动后执行的命令,让容器执行表现的像一个可执行程序一样,与CMD的区别是不可以被docker run覆盖,会把docker run后面的参数当作传递给ENTRYPOINT指令的参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。docker run命令的-entrypoint参数可以把指定的参数继续传递给ENTRYPOINT
打包项目

常用的两种构建方式

  • Dockerfile和jar上传到服务器进行构建
  • 利用Maven的Docker打包工具进行应用构建同时推送到远程仓库
这里我选择的第一种方式。最后会在target目录下生成jar包
这里借助的是springboot提供的maven-plugin这个依赖包.
  1. mvn clean && mvn package
复制代码
执行package之后耐心等待打包成功

到这之后会在target目录生成一个jar包.
我们在本地把它运行起来进行访问测试,确认一切正常
制作镜像并运行

之前的准备工作做完,最令人期待的部分就来了.
通过XFTP将打包好的jar包和dockerfile上传到云服务器的指定目录
我这里传到了usr/local/src的新建目录下(目录下只有jar包和dockerFile)
执行docker build命令,docker就会根据Dockerfile里你定义好的命令进行构建新的镜像。

  • -t代表要构建的镜像
  • .代表当前目录
  • xxx代表镜像名称以及标签
因为Dockerfile我们之前写好了,所以直接执行命令构建镜像
  1. docker build -t xxx .
复制代码
如果构建过程很慢,可以把同步时间配置去掉

查看镜像
  1. docker images
复制代码
<img alt="image-20230204220540891" loading="lazy">

指定一个端口运行镜像
  1. docker run -it -d --name xxxx -p 8080:8080 xxx
复制代码
基本参数
  1. run:运行的意思
  2. –name: 指定镜像启动的之后的名称
  3. -p: 容器和外部的端口映射 第一个端口:外部 第二个端口:内部
  4. -d: 后台运行 -t:实时运行,窗口关闭,程序结束。
  5. xxx:镜像名称或id,确定你要启动的是哪一个镜像
复制代码
跟踪查看日志实时启动情况
  1. docker logs -f xxx
复制代码
3.访问测试

经过之前的一系列折腾,我们已经成功把项目在服务器上部署完了,接下来只需要到云服务器控制台开放端口就完成了.
浏览器通过ip+端口号访问
此外,还可以使用nginx完成反向代理和https配置(需要提前申请并下载SSL证书)就能用自己的域名在浏览器上进行访问了.
这里不是本篇重点,我就不演示了,需要的自行配置即可
大致的效果就是如此
  1. docker run -p 80:80 --name nginx \
  2. -v /usr/local/nginx/config/nginx.conf:/etc/nginx/nginx.conf \
  3. -v /usr/local/nginx/conf.d:/etc/nginx/conf.d \
  4. -v /usr/local/nginx/logs:/var/log/nginx \
  5. -v /usr/local/nginx/html:/usr/share/nginx/html \
  6. -d nginx
复制代码
参考文章:

Linux下通过Docker安装配置Mysql8.0
Linux下通过Docker安装配置Redis
win10下数据库快照迁移到Linux(https://blog.csdn.net/sinat_36831355/article/details/107342220)
[Linux安装Maven]https://www.cnblogs.com/fuzongle/p/12825048.html
[DockerFile编写]https://www.cnblogs.com/wangmo/p/6811321.html
[Docker安装Nginx并配置反向代理和SSL证书]https://blog.csdn.net/qq_36252295/article/details/122607203
【整体流程参照】
https://blog.csdn.net/qq_43173523/article/details/106076614
https://blog.csdn.net/qq_33220089/article/details/105104524

来源:https://www.cnblogs.com/ride0nTime/p/17093456.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具