利用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具体在哪。 - image.png
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
,主要修改两个配置:- 本地仓库地址:
<localRepository>/Users/sullivan/repo</localRepository>
(这里本地仓库地址,sullivan是我的电脑名,这里请替换Wie你自己的即可。) - 远端镜像仓库地址:这里我们使用的是阿里云的仓库地址。
- 本地仓库地址:
<!-- 本地仓库地址 -->
<localRepository>/Users/sullivan/repo</localRepository>
<!-- 远端镜像仓库地址 -->
<mirrors>
<mirror>
<id>ali maven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
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地址 - image.png
- maven配置:IntelliJ IDEA=>Preferences=>Build,Execution,Deployment=>Build Tools=>Maven
然后在Maven home path,选择我们下载的文件的地址,比如我的是:/Library/apache-maven-3.8.1
- image.png
- 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
- image.png
- 启动容器,使用命令:
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;
可以看看目前的数据库。- image.png
我们可以下载mysql的桌面客户端,我用的是navicat for mysql,新建一个连接,然后连上去看看。
1.6 安装redis,基于docker安装
下载redis的镜像,使用命令:
docker pull redis
查看库里面的镜像,使用命令:
docker images
- image.png
启动容器,命令为:
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
即可,现在可以正常使用了。
-
- image.png
二、编写测试demo
2.1 新建一个项目
- 新建一个项目,选择Spring Initializr,根据下图填写内容
- image.png
- 选择项目需要引入的第三方插件,然后点击完成
- image.png
- 编译项目,Maven需要download很多包。耐心等待右下角的进度条完全走完
- image.png
- 点击package,会发现报错,因为缺少一个插件。
- image.png
- 这里需要引入一个插件,请打开pom.xml文件,在build下添加一个配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
- image.png
-
重新
package
之后,出现[INFO] BUILD SUCCESS
就证明没啥问题了。<br />注意:这个过程maven会去下载很多第三方插件,用于支持springboot、mysql、redis等等,所以需要内心等等。
2.2 编写一个接口
新建一个java类,命名TestController.java
- image.png
- image.png
编写第一个接口
- image.png
添加配置文件,我们使用的是yml格式,所以重命名一下
application.properties
为application.yml
- image.png
添加以下配置:
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
- image.png
启动springboot服务
- image.png
打开浏览器访问:
http://127.0.0.1:8888/test/getString
- image.png
完成第一个接口的开发、启动、测试访问
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;
- image.png
修改pom.xml文件,修改mysql版本号、添加mybatis依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
添加4个包,controller,service,mapper,entity
- image.png
添加实体对象,entity:User.java
- image.png
创建mapper接口,mapper:UserMapper.java
- image.png
创建service实现,service:UserService.java
- image.png
创建controller类, controller:UserController.java
- image.png
创建mybatis的sql映射文件,在resources下创建文件夹(Directory):mapping
- image.png
创建映射文件,mapping:UserMapping.xml
- image.png
修改主入口文件,TestDemoApplication.java
- image.png
在yml文件中添加mybatis配置
- image.png
启动服务,先clean,在run
- image.png
测试访问,
http://127.0.0.1:8888/user/getUserById?id=1
- image.png
完成
三、发布应用
3.1 本机docker环境打包运行
下载镜像:ubuntu:18.04 使用命令:
docker pull ubuntu:18.04
- image.png
配置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 .
- image.png
获取mysql和redis的docker容器的ip,使用命令:
docker inspect my1 | grep IPAddress
和docker inspect rd1 | grep IPAddress
查询到IP- image.png
修改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配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ske.test</groupId>
<artifactId>testdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>16</java.version>
<!--是否跳过spring-boot-maven-plugin, 依赖项目需要设置为true-->
<skip.boot>false</skip.boot>
<!--是否跳过打包为docker镜像, 默认为true, 即不打包为镜像-->
<skip.docker>false</skip.docker>
<!--是否推送镜像到镜像仓库, 默认为false, 即不推送-->
<image.push>false</image.push>
<!--基础镜像-->
<image.base>testdi</image.base>
<!--远程docker地址-->
<docker.host/>
<!--docker认证ca-->
<docker.ca/>
<image.name>${project.artifactId}:latest</image.name>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<skip>${skip.boot}</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>build.time</name>
<pattern>yyyyMMdd.HHmmss</pattern>
<timeZone>GMT+8</timeZone>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<skipDocker>${skip.docker}</skipDocker>
<imageName>${image.name}</imageName>
<imageTags>
<imageTag>latest</imageTag>
<imageTag>v${build.time}</imageTag>
</imageTags>
<pushImage>${image.push}</pushImage>
<baseImage>${image.base}</baseImage>
<user>root</user>
<workdir>/export/servers</workdir>
<runs>
<run>mkdir -p /export/tmp</run>
</runs>
<cmd>["sh", "-c", "java -server -Djava.io.tmpdir=/export/tmp $OPTIONS -Djava.security.egd=file:/dev/./urandom -jar ${project.build.finalName}.jar"]</cmd>
<dockerHost>${docker.host}</dockerHost>
<dockerCertPath>${docker.ca}</dockerCertPath>
<resources>
<resource>
<targetPath>/export/servers</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!-- 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
-
主要修改点:
- 修改了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