1. 程式人生 > 其它 >使用docker部署springboot應用

使用docker部署springboot應用

《使用docker安裝mysql5.7》一文中,我們用docker在本地跑起來了一個mysql容器,並做了測試。現在我們把連線mysql容器的這個springboot應用也用容器跑起來。

springboot工程的容器化

在專案根目錄新建Dockerfile:

# Docker image for springboot application
# VERSION 0.0.1
# Author: lyhero11

### 基礎映象,使用alpine作業系統,openjkd使用8u201
FROM openjdk:8u201-jdk-alpine3.9

#作者
MAINTAINER lyhero11 <[email protected]>

#系統編碼
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8

#宣告一個掛載點,容器內此路徑會對應宿主機的某個資料夾
VOLUME /tmp

#應用構建成功後的jar檔案被複制到映象內,名字改成springboot2.jar
ADD build/libs/springboot2-0.0.1-SNAPSHOT.jar springboot2.jar

#啟動容器時的程序
ENTRYPOINT ["java", "-jar", "/springboot2.jar"]

#暴露8080埠
EXPOSE 8080

然後修改一下application.properties配置檔案:

# 應用名稱
spring.application.name=springboot2
server.servlet.context-path=/springboot2
# 應用服務 WEB 訪問埠
server.port=8080
# 資料庫驅動:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 資料來源名稱
spring.datasource.name=defaultDataSource
# 資料庫連線地址
spring.datasource.url=${MYSQL_URL}?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
# 資料庫使用者名稱&密碼:
spring.datasource.username=${MYSQL_USER}
spring.datasource.password=${MYSQL_PASSWORD}

spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

主要是mysql的url連線串以及使用者名稱密碼這些通過環境變數來設定。而這個springboot應用是將要跑在容器裡的,所以顯然這幾個環境變數是通過設定容器的環境變數來設定的。

構建映象並啟動容器

gradle bootJar生成jar包之後,我們構建映象,在Dockerfile所在目錄執行:

docker build -t lyhero11/springbootapp2 .

-t表示--tag,後面lyhero11/springbootapp2是映象名或者叫標籤。

然後,我們啟動容器:

docker run --rm -d `
--name springbootapp2 `
--network mysqlnet `
-e MYSQL_URL=jdbc:mysql://mysqlserver/mydb `
-e MYSQL_USER=root `
-e MYSQL_PASSWORD=pswd `
-p 8080:8080 lyhero11/springbootapp2

這裡說明一下jdbc:mysql://mysqlserver/mydb,因為我們使用了bridge網路mysqlnet,可以起到一個DNS的作用(可以使用docker network ls檢視本機的docker網路),所以只需要使用容器名mysqlserver就可以了,不用ip埠了。-e表示設定容器的環境變數,給上面的application.properties用,另外如果容器啟動失敗,可以把-d去掉,去看看springboot的輸出日誌。

Postman測試一下GET http://localhost:8080/springboot2/rest/getTokenByMobile?mobile=13700000000 ,從資料庫查詢並正確返回結果。

附本地的幾個image的大小:

docker images
REPOSITORY                TAG                   IMAGE ID       CREATED          SIZE
lyhero11/springbootapp2   latest                32c6d6d34615   41 minutes ago   143MB
<none>                    <none>                cc42c391bbe9   47 minutes ago   143MB
<none>                    <none>                2a090734a030   2 hours ago      143MB
mysql                     5.7.36                938b57d64674   13 days ago      448MB
redis                     6.0.16                705235b45ae0   2 weeks ago      112MB
openjdk                   8u201-jdk-alpine3.9   3675b9f543c5   2 years ago      105MB

除了mysql的映象稍微大了一點,其他都是100M多,然後docker的特性image是基於其他若干image一層一層摞起來的,這裡可以看出來openjdk8的image是105M,基於它構建的springbootapp2是143M,所以兩者的差值基本上就是jar包的大小,這與事實相符。可見docker的儲存效率還算是比較高的。