利用docker搭建、发布springboot项目(mac环境)
本文主要讲解如何建立一个springboot项目,并通过docker搭建并发布的完整流程。
特别说明:
- 本文章不会讲解基础,为实战讲解,一些基础的东西就请各位自行学习了。
- 后续所有贴出来的下载地址,都是官网地址,也可自行百度搜索,不在赘述。
一、 环境搭建
- 准备工作,需要安装java、maven、idea、docker、mysql、redis
1.1 安装java
- 官网下载地址:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html
- 下载两个版JDK
- 一个是Mac版本的:jdk-16.0.1_osx-x64_bin.dmg 用于本机开发。
- 一个是Linux版本的,用于后续docker及服务器上部署:jdk-16.0.1_linux-x64_bin.tar.gz
- 安装JDK:双击dmg文件,一直下一步即可。
- 安装好后,打开终端,输入java命令和javac命令,看下输出。使用
/usr/libexec/java_home -V
命令,查找所安装的java具体在哪。 -
-
1.2 安装maven
- 官网下载地址:https://maven.apache.org/download.cgi
- 下载 apache-maven-3.8.1-bin.tar.gz
- 双击解压,然后移动到 /Library 下面。使用命令行
sudo mv apache-maven-3.8.1 /Library/
- 配置maven,
vi /Library/apache-maven-3.8.1/conf/settings.xml
,主要修改两个配置:- 本地仓库地址:
(这里本地仓库地址,sullivan是我的电脑名,这里请替换Wie你自己的即可。)/Users/sullivan/repo - 远端镜像仓库地址:这里我们使用的是阿里云的仓库地址。
- 本地仓库地址:
/Users/sullivan/repo
ali maven
aliyun maven
https://maven.aliyun.com/repository/public/
central
1.3 安装idea
- 官网下载地址:https://www.jetbrains.com/idea/download/#section=mac
- 下载Ultimate版本,正常情况是可以试用30天的(请到某宝购买账号)
- 直接双击安装,一直下一步即可
- 配置idea:jdk和maven环境
- jdk配置:File=>Project Structure=>Platform Settings=>SDKs,一般会直接出来,没有的话,使用命令行
/usr/libexec/java_home -V
获得的JDK地址 -
- maven配置:IntelliJ IDEA=>Preferences=>Build,Execution,Deployment=>Build Tools=>Maven
然后在Maven home path,选择我们下载的文件的地址,比如我的是:/Library/apache-maven-3.8.1
-
- jdk配置:File=>Project Structure=>Platform Settings=>SDKs,一般会直接出来,没有的话,使用命令行
1.4 安装docker
- 官方下载地址:https://www.docker.com/products/docker-desktop
- 下载:Mac with intel chip。
- 直接双击安装,一直下一步即可。安装后,在任务栏会出现一个小鲸鱼,就安装好了。
这里单独说下,如何切换docker的数据源,用原本docker的源,有可能下载很慢。我这里使用的是阿里云的源,登录阿里云后,可以在https://cr.console.aliyun.com/ap-southeast-1/instances/mirrors 找到阿里云的镜像加速器,每个账号都有一个自己的。然后在docker desktop的settings下的Docker Engine里面添加上源地址即可,然后保存重启docker即可。
"registry-mirrors": [
"https://mayswc8m.mirror.aliyuncs.com"
],
1.5 安装mysql,基于docker安装
- 下载mysql的镜像,使用命令:
docker pull mysql:5.7.31
,等待下载 - 查看库里面的镜像,使用命令:
docker images
-
-
- 启动容器,使用命令:
docker run -d --name my1 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31
- -d 是表明后台运行,否则退出终端后服务就停了
- --name 设置docker容器的别名,后续启停、删除等都可以用别名代替,不用输入随机字符串ID。
- -p 设置端口映射,比如
-p 13306:3306
将容器内的mysql端口3306与本机的13306端口绑定,就可以使用localhost的13306端口访问mysql了。- -e MYSQL_ROOT_PASSWORD=123456 设置mysql的访问密码,-e 是设置环境变量
- 在最后面加上启动的镜像,一定要加上版本号哟,否则会去下载最新的版本,又要重新下载镜像了。
-
安装后,我们进行测试,先通过命令行测试
-
docker ps -a
通过这个命令,查看是否启动成功,显示的my1的STATUS是 Up 多少时间,就应该启动成功了。 -
docker exec -it my1 bash
通过这个命令,我们进入到容器内部,里面其实就是一个简单的Linux系统 -
mysql -uroot -p123456
通过这个命令,我们就应该可以进入到mysql操作界面了。-u后面是数据库用户名,-p后面是该用户名的密码。你们按我上面说的命令启动,这个密码就应该可以进去。
-
能够到这里,就说明mysql启动起来了,可以试试
show databases;
可以看看目前的数据库。-
-
我们可以下载mysql的桌面客户端,我用的是navicat for mysql,新建一个连接,然后连上去看看。
1.6 安装redis,基于docker安装
下载redis的镜像,使用命令:
docker pull redis
查看库里面的镜像,使用命令:
docker images
-
-
启动容器,命令为:
docker run -d --name rd1 -p 16379:6379 redis --requirepass 123456
,参数说明,请看docker安装mysql里面的说明。再强调下,这里没有带版本号,就是用的最新版本。
- 单独说明下,最后的参数 --requirepass 是设置Redis密码的
- 进行测试,使用命令行进行验证
-
docker exec -it rd1 redis-cli
这里的rd1是我启动时设置的别名,然后就可以看到127.0.0.1:6379>
就说明进去了,可以直接试一下:set a 123
以及get a
,如果打印出来值,则说明搞定。 - 但是由于redis有密码,而我们没有用密码登录,需要会报错:
(error) NOAUTH Authentication required.
- 使用命令
auth 123456
即可,现在可以正常使用了。
-
-
-
二、编写测试demo
2.1 新建一个项目
- 新建一个项目,选择Spring Initializr,根据下图填写内容
-
-
- 选择项目需要引入的第三方插件,然后点击完成
-
-
- 编译项目,Maven需要download很多包。耐心等待右下角的进度条完全走完
-
-
- 点击package,会发现报错,因为缺少一个插件。
-
-
- 这里需要引入一个插件,请打开pom.xml文件,在build下添加一个配置
org.apache.maven.plugins
maven-surefire-plugin
2.22.2
true
-
-
-
重新
package
之后,出现[INFO] BUILD SUCCESS
就证明没啥问题了。注意:这个过程maven会去下载很多第三方插件,用于支持springboot、mysql、redis等等,所以需要内心等等。
2.2 编写一个接口
新建一个java类,命名TestController.java
-
-
-
-
编写第一个接口
-
-
添加配置文件,我们使用的是yml格式,所以重命名一下
application.properties
为application.yml
-
-
添加以下配置:
server:
port: 8888 # 服务端口
spring:
datasource:
name: test # 数据库名
url: jdbc:mysql://127.0.0.1:13306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
username: root # 数据库用户名
password: 123456 # 数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver # 数据库链接驱动
redis:
host: 127.0.0.1 # redis端口
port: 16379 # redis端口
password: 123456 # redis密码
database: 0
-
-
启动springboot服务
-
-
打开浏览器访问:
http://127.0.0.1:8888/test/getString
-
-
完成第一个接口的开发、启动、测试访问
2.3 编写数据库访问接口
- 创建数据库,脚本如下:
CREATE DATABASE `test`;
USE `test`;
CREATE TABLE `user` (
`id` int(32) NOT NULL AUTO_INCREMENT,
`username` varchar(32) NOT NULL,
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
insert into user(id, username, password) values(0, '张三', '111111');
insert into user(id, username, password) values(0, '李四', '222222');
select * from user;
-
-
修改pom.xml文件,修改mysql版本号、添加mybatis依赖
mysql
mysql-connector-java
8.0.25
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
添加4个包,controller,service,mapper,entity
-
-
添加实体对象,entity:User.java
-
-
创建mapper接口,mapper:UserMapper.java
-
-
创建service实现,service:UserService.java
-
-
创建controller类, controller:UserController.java
-
-
创建mybatis的sql映射文件,在resources下创建文件夹(Directory):mapping
-
-
创建映射文件,mapping:UserMapping.xml
-
-
修改主入口文件,TestDemoApplication.java
-
-
在yml文件中添加mybatis配置
-
-
启动服务,先clean,在run
-
-
测试访问,
http://127.0.0.1:8888/user/getUserById?id=1
-
-
完成
三、发布应用
3.1 本机docker环境打包运行
下载镜像:ubuntu:18.04 使用命令:
docker pull ubuntu:18.04
-
-
配置Dockerfile文件。创建文件夹:DockerImage,在里面创建文件:Dockerfile
FROM ubuntu:18.04
WORKDIR /root
ENV LANG=C.UTF-8
ENV JAVA_HOME=/java
ENV PATH=$PATH:$JAVA_HOME/bin
RUN apt update && apt install -y --no-install-recommends fontconfig curl telnet iputils-ping vim \
&& rm -rf /var/lib/apt/lists/* \
&& rm -rf /var/log/*
VOLUME /java
打包我们自己的镜像,使用命令
docker build -t testdi .
-
-
获取mysql和redis的docker容器的ip,使用命令:
docker inspect my1 | grep IPAddress
和docker inspect rd1 | grep IPAddress
查询到IP-
-
修改yml配置文件,修改mysql连接的ip和端口,redis连接的ip和端口
server:
port: 8888 # 服务端口
spring:
datasource:
name: test # 数据库名
url: jdbc:mysql://172.17.0.2:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false&useSSL=false # url
username: root # 数据库用户名
password: 123456 # 数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver # 数据库链接驱动
redis:
host: 172.17.0.3 # redis端口
port: 6379 # redis端口
password: 123456 # redis密码
database: 0
mybatis:
mapper-locations: classpath:mapping/*Mapping.xml #mapping文件所在位置
type-aliases-package: com/ske/test/testdemo
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启mybatis日志
- 修改maven配置文件
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.5.2
com.ske.test
testdemo
0.0.1-SNAPSHOT
testdemo
Demo project for Spring Boot
16
false
false
false
testdi
${project.artifactId}:latest
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
mysql
mysql-connector-java
8.0.25
runtime
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
org.springframework.boot
spring-boot-starter-test
test
org.apache.maven.plugins
maven-surefire-plugin
2.22.2
true
org.springframework.boot
spring-boot-maven-plugin
repackage
${skip.boot}
org.codehaus.mojo
build-helper-maven-plugin
1.8
timestamp-property
build.time
yyyyMMdd.HHmmss
GMT+8
com.spotify
docker-maven-plugin
1.2.2
package
build
${skip.docker}
${image.name}
latest
v${build.time}
${image.push}
${image.base}
root
/export/servers
mkdir -p /export/tmp
["sh", "-c", "java -server -Djava.io.tmpdir=/export/tmp $OPTIONS -Djava.security.egd=file:/dev/./urandom -jar ${project.build.finalName}.jar"]
${docker.host}
${docker.ca}
/export/servers
${project.build.directory}
${project.build.finalName}.jar
-
主要修改点:
- 修改了artifactId,必须改为全小写,否则打包会报错
- 修改了properties,添加一些参数
- 修改了build,修改了打包方式
启动,使用命令:
docker run -d -v /Users/sullivan/jdk-16.0.1:/java -p8888:8888 --name td --rm testdemo:latest
特别说明,这里需要使用Linux版本的JDK,之前下载的时候,已经提示过下载Linux版本的JDK了,解压后,在命令中使用这个版本的JDK路径
- 可以通过浏览器访问了,输入地址:
http://127.0.0.1:8888/user/getUserById?id=1
- 查看日志,使用命令:
docker logs -f td