1帽揪、工作環(huán)境
開發(fā)工具:IDEA召耘,安裝插件docker
TDengine Version:2.0.20.5
taos jdbc Version: 2.0.22
Springboot Version: 2.4.5
Docker Version: 20.10.10
2爪飘、Dockerfile設(shè)置
### 基礎(chǔ)鏡像
FROM openjdk:8
### 作者
MAINTAINER luojiarui <luojiarui2@163.com>
### 系統(tǒng)編碼
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
### 聲明掛載點(diǎn)雪隧,容器內(nèi)此路徑會(huì)對(duì)應(yīng)宿主機(jī)的某個(gè)文件夾
VOLUME /tmp
### 應(yīng)用構(gòu)建成功以后jar文件被復(fù)制到鏡像內(nèi)丘损,名字也改為app.jar
ADD target/service-app-1.0-SNAPSHOT.jar app.jar
### 啟動(dòng)容器時(shí)的進(jìn)程
ENTRYPOINT ["java"彭羹, "-jar", "/app.jar"]
### 暴露的端口
EXPOSE 8099
在IDEA中編寫一個(gè)Dorckerfile,文件的位置和springboot項(xiàng)目的根目錄一致岛啸。
使用遠(yuǎn)程的Ubuntu服務(wù)器的docker進(jìn)行鏡像打包和部署钓觉。
再檢查一遍項(xiàng)目的配置文件,這里需要設(shè)置jdbc的連接配置:
### 設(shè)置JDBC的連接地址坚踩,必須加上taos的賬號(hào)密碼荡灾,這里使用的是TDengine的默認(rèn)密碼
taosJdbc:
url: jdbc:TAOS://node1:6030//alpha_db?user=root&password=taosdata
### 使用Restful連接taos的配置也記錄下來(lái)
url:
taos-path: http://node1:6041/rest/sql
table: alpha_db.can_super
從項(xiàng)目的配置文件中瞬铸,可以看到FQDN設(shè)置的是node1批幌。
node1是TDengine機(jī)所在機(jī)器的地址,其真實(shí)ip地址為: 129.122.12.12赴捞。
特別要注意這里的修改逼裆,否則會(huì)出現(xiàn)問(wèn)題。
3赦政、創(chuàng)建容器
根據(jù)鏡像文件service-app:v1創(chuàng)建容器的命令如下胜宇。
docker run
-d ## 后臺(tái)運(yùn)行
-name service-app ## 容器命令
-p 8099:8099 ## 端口映射,<主機(jī)端口: 容器端口>
-v /usr/local/taos/driver/libtaos.so.2.0.20.5:/usr/lib/libtaos.so ## 指定容器里taos的數(shù)據(jù)庫(kù)客戶端
-v /usr/share/zoneinfo:/usr/share/zoneinfo ## 數(shù)據(jù)卷映射
-e TZ=AsiaShanghai ## 時(shí)區(qū)
--add-host=node1:10.30.5.55 ## 增加DNS解析
service-app:v1 ## 容器名
4恢着、容器內(nèi)缺少驅(qū)動(dòng)
問(wèn)題1: java使用JDBC建立簡(jiǎn)介桐愉,在windows系統(tǒng)上可以正常運(yùn)行,打包放到docker容器中運(yùn)行時(shí)掰派,出現(xiàn)如下異常:
$ Caused by: Java.lang.NoClassDefFonderError: Could not initialize calss com.taosdata.jdbc.TSDBJNIConnecter
....
通過(guò)查找前人的方案从诲,通過(guò)指定taos驅(qū)動(dòng)和時(shí)區(qū),解決該問(wèn)題靡羡。
https://github.com/taosdata/TDengine/issues/4238 "java.lang.NoClassDefFoundError: Could not initialize class com.taosdata.jdbc.TSDBJNIConnector #4238"
問(wèn)題2:使用的基礎(chǔ)鏡像Aline不支持
$ /user/lib/libtaos.so: Error loading shared libary ld-linux-x86-64.so.2: No such file or directory (needed by /usr/lib/libtaos.so)
...
在驅(qū)動(dòng)已經(jīng)映射的基礎(chǔ)上系洛,依然缺少某些文件,那么就找一下為什么缺少的原因略步。
進(jìn)入docker以后描扯,查找一下。
### 進(jìn)入docker
root@xxxx: docker exec -it service-app sh
### 查找
/# ldd /usr/lib/libtaos.so
ldd(0x7fefebee2000)
libpthread.so.0 => ldd(0x7fefebee2000)
libm.so.6 => ldd(0x7fefebee2000)
librt.so.1 => ldd(0x7fefebee2000)
libc.so.6 => ldd(0x7fefebee2000)
Error loading shared libaray ld-linux-x86-64.so.2: No such file or directory (need by /usr/lib/libtaos.so)
Error relocating /usr/lib/libtaos.so: _pthread_register_cancel: sysbol not found
...
可以看出這里缺少某些東西趟薄,判斷是由于我們使用了精簡(jiǎn)版的JDK绽诚,那么我們就將原來(lái)的alpine版本的JDK給更換掉。
### 原來(lái)的基礎(chǔ)鏡像
FROM openjdk:8-alpine
### 更換為
FROM openjdk:8
通過(guò)更換基礎(chǔ)鏡像杭煎,雖然鏡像文件從161MB增加到了320MB恩够,但是該問(wèn)題解決。
5羡铲、容器無(wú)法連接TDengine
無(wú)法連接TDengine: TDengine ERROR (80000015): Unable to resolve FQDN.
JNI CONNECTION is NULL
解決該問(wèn)題的辦法即是注意JDBC連接的時(shí)候不能使用IP地址蜂桶,然后在運(yùn)行的容器的時(shí)候增加以下的命令。
--add-host=node1:10.30.5.55 ## 增加DNS解析
6也切、總結(jié)
目前TDengine暫時(shí)沒(méi)有看到官方指導(dǎo)案例扑媚,在使用docker連接TDengine的時(shí)候注意以上細(xì)節(jié)妥曲,一般不會(huì)有任何問(wèn)題。
特別感謝濤思數(shù)據(jù)的董工提供的技術(shù)支持钦购。
如果您覺得上面的內(nèi)容對(duì)您有幫助歡迎點(diǎn)贊檐盟、評(píng)論、轉(zhuǎn)發(fā)押桃!
更多內(nèi)容請(qǐng)查閱作者博客:https://jiaruiblog.com
或者star
作者github: https://github.com/Jarrettluo?tab=repositories