利用docker搭建、發(fā)布springboot項目(mac環(huán)境)
本文主要講解如何建立一個springboot項目氏捞,并通過docker搭建并發(fā)布的完整流程碧聪。
特別說明:
- 本文章不會講解基礎,為實戰(zhàn)講解液茎,一些基礎的東西就請各位自行學習了逞姿。
- 后續(xù)所有貼出來的下載地址,都是官網地址捆等,也可自行百度搜索滞造,不在贅述。
一栋烤、 環(huán)境搭建
- 準備工作谒养,需要安裝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 用于本機開發(fā)始绍。
- 一個是Linux版本的,用于后續(xù)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是我的電腦名柔昼,這里請?zhí)鎿QWie你自己的即可哑芹。) - 遠端鏡像倉庫地址:這里我們使用的是阿里云的倉庫地址。
- 本地倉庫地址:
<!-- 本地倉庫地址 -->
<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環(huán)境
- 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容器的別名,后續(xù)啟停巷送、刪除等都可以用別名代替驶忌,不用輸入隨機字符串ID。
- -p 設置端口映射笑跛,比如
-p 13306:3306
將容器內的mysql端口3306與本機的13306端口綁定付魔,就可以使用localhost的13306端口訪問mysql了。- -e MYSQL_ROOT_PASSWORD=123456 設置mysql的訪問密碼飞蹂,-e 是設置環(huán)境變量
- 在最后面加上啟動的鏡像几苍,一定要加上版本號喲,否則會去下載最新的版本陈哑,又要重新下載鏡像了妻坝。
-
安裝后,我們進行測試惊窖,先通過命令行測試
-
docker ps -a
通過這個命令惠勒,查看是否啟動成功,顯示的my1的STATUS是 Up 多少時間爬坑,就應該啟動成功了纠屋。 -
docker exec -it my1 bash
通過這個命令,我們進入到容器內部盾计,里面其實就是一個簡單的Linux系統(tǒng) -
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纹蝴,會發(fā)現報錯庄萎,因為缺少一個插件。
- 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
完成第一個接口的開發(fā)险领、啟動侨舆、測試訪問
2.3 編寫數據庫訪問接口
- 創(chuàng)建數據庫,腳本如下:
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
創(chuàng)建mapper接口愁铺,mapper:UserMapper.java
- image.png
創(chuàng)建service實現,service:UserService.java
- image.png
創(chuàng)建controller類闻鉴, controller:UserController.java
- image.png
創(chuàng)建mybatis的sql映射文件茵乱,在resources下創(chuàng)建文件夾(Directory):mapping
- image.png
創(chuàng)建映射文件,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
完成
三斤贰、發(fā)布應用
3.1 本機docker環(huán)境打包運行
下載鏡像:ubuntu:18.04 使用命令:
docker pull ubuntu:18.04
- image.png
配置Dockerfile文件。創(chuàng)建文件夾:DockerImage次询,在里面創(chuàng)建文件: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