通過 Docker 快速體驗(yàn) TDengine
雖然并不推薦在生產(chǎn)環(huán)境中通過 Docker 來部署 TDengine 服務(wù),但 Docker 工具能夠很好地屏蔽底層操作系統(tǒng)的環(huán)境差異,很適合在開發(fā)測試或初次體驗(yàn)時用于安裝運(yùn)行 TDengine 的工具集。特別是,借助 Docker,能夠比較方便地在 macOS 和 Windows 系統(tǒng)上嘗試 TDengine,而無需安裝虛擬機(jī)或額外租用 Linux 服務(wù)器。另外,從2.0.14.0版本開始,TDengine提供的鏡像已經(jīng)可以同時支持X86-64、X86、arm64、arm32平臺,像NAS、樹莓派、嵌入式開發(fā)板之類可以運(yùn)行docker的非主流計算機(jī)也可以基于本文檔輕松體驗(yàn)TDengine。
下文通過 Step by Step 風(fēng)格的介紹,講解如何通過 Docker 快速建立 TDengine 的單節(jié)點(diǎn)運(yùn)行環(huán)境,以支持開發(fā)和測試。
下載 Docker
Docker 工具自身的下載請參考 Docker官網(wǎng)文檔。
安裝完畢后可以在命令行終端查看 Docker 版本。如果版本號正常輸出,則說明 Docker 環(huán)境已經(jīng)安裝成功。
$ docker -v
Docker version 20.10.3, build 48d30b5
使用 Docker 在容器中運(yùn)行 TDengine
在 Docker 容器中運(yùn)行 TDengine server
$ docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp tdengine/tdengine
526aa188da767ae94b244226a2b2eec2b5f17dd8eff592893d9ec0cd0f3a1ccd
這條命令,啟動一個運(yùn)行了 TDengine server 的 docker 容器,并且將容器的 6030 到 6049 端口映射到宿主機(jī)的 6030 到 6049 端口上。如果宿主機(jī)已經(jīng)運(yùn)行了 TDengine server 并占用了相同端口,需要映射容器的端口到不同的未使用端口段。(詳情參見 TDengine 2.0 端口說明)。為了支持 TDengine 客戶端操作 TDengine server 服務(wù), TCP 和 UDP 端口都需要打開。
- docker run:通過 Docker 運(yùn)行一個容器
- -d:讓容器在后臺運(yùn)行
- -p:指定映射端口。注意:如果不是用端口映射,依然可以進(jìn)入 Docker 容器內(nèi)部使用 TDengine 服務(wù)或進(jìn)行應(yīng)用開發(fā),只是不能對容器外部提供服務(wù)
- tdengine/tdengine:拉取的 TDengine 官方發(fā)布的應(yīng)用鏡像
- 526aa188da767ae94b244226a2b2eec2b5f17dd8eff592893d9ec0cd0f3a1ccd:這個返回的長字符是容器 ID,我們也可以通過容器 ID 來查看對應(yīng)的容器
進(jìn)一步,還可以使用 docker run 命令啟動運(yùn)行 TDengine server 的 docker 容器,并使用 --name 命令行參數(shù)將容器命名為 tdengine,使用 --hostname 指定 hostname 為 tdengine-server,通過 -v 掛載本地目錄到容器,實(shí)現(xiàn)宿主機(jī)與容器內(nèi)部的數(shù)據(jù)同步,防止容器刪除后,數(shù)據(jù)丟失。
docker run -d --name tdengine --hostname="tdengine-server" -v ~/work/taos/log:/var/log/taos -v ~/work/taos/data:/var/lib/taos -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp tdengine/tdengine
- --name tdengine:設(shè)置容器名稱,我們可以通過容器名稱來訪問對應(yīng)的容器
- --hostname=tdengine-server:設(shè)置容器內(nèi) Linux 系統(tǒng)的 hostname,我們可以通過映射 hostname 和 IP 來解決容器 IP 可能變化的問題。
- -v:設(shè)置宿主機(jī)文件目錄映射到容器內(nèi)目錄,避免容器刪除后數(shù)據(jù)丟失。
使用 docker ps 命令確認(rèn)容器是否已經(jīng)正確運(yùn)行
docker ps
輸出示例如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS ···
c452519b0f9b tdengine/tdengine "taosd" 14 minutes ago Up 14 minutes ···
- docker ps:列出所有正在運(yùn)行狀態(tài)的容器信息。
- CONTAINER ID:容器 ID。
- IMAGE:使用的鏡像。
- COMMAND:啟動容器時運(yùn)行的命令。
- CREATED:容器創(chuàng)建時間。
- STATUS:容器狀態(tài)。UP 表示運(yùn)行中。
通過 docker exec 命令,進(jìn)入到 docker 容器中去做開發(fā)
$ docker exec -it tdengine /bin/bash
root@tdengine-server:~/TDengine-server-2.4.0.4#
- docker exec:通過 docker exec 命令進(jìn)入容器,如果退出,容器不會停止。
- -i:進(jìn)入交互模式。
- -t:指定一個終端。
- tdengine:容器名稱,需要根據(jù) docker ps 指令返回的值進(jìn)行修改。
- /bin/bash:載入容器后運(yùn)行 bash 來進(jìn)行交互。
進(jìn)入容器后,執(zhí)行 taos shell 客戶端程序。
root@tdengine-server:~/TDengine-server-2.4.0.4# taos
Welcome to the TDengine shell from Linux, Client Version:2.4.0.4
Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
taos>
TDengine 終端成功連接服務(wù)端,打印出了歡迎消息和版本信息。如果失敗,會有錯誤信息打印出來。
在 TDengine 終端中,可以通過 SQL 命令來創(chuàng)建/刪除數(shù)據(jù)庫、表、超級表等,并可以進(jìn)行插入和查詢操作。具體可以參考 TAOS SQL 說明文檔。
在宿主機(jī)訪問 Docker 容器中的 TDengine server
在使用了 -p 命令行參數(shù)映射了正確的端口啟動了 TDengine Docker 容器后,就在宿主機(jī)使用 taos shell 命令即可訪問運(yùn)行在 Docker 容器中的 TDengine。
$ taos
Welcome to the TDengine shell from Linux, Client Version:2.4.0.4
Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
taos>
也可以在宿主機(jī)使用 curl 通過 RESTful 端口訪問 Docker 容器內(nèi)的 TDengine server。
curl -u root:taosdata -d 'show databases' 127.0.0.1:6041/rest/sql
輸出示例如下:
{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep0,keep1,keep(D)","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"column_meta":[["name",8,32],["created_time",9,8],["ntables",4,4],["vgroups",4,4],["replica",3,2],["quorum",3,2],["days",3,2],["keep0,keep1,keep(D)",8,24],["cache(MB)",4,4],["blocks",4,4],["minrows",4,4],["maxrows",4,4],["wallevel",2,1],["fsync",4,4],["comp",2,1],["cachelast",2,1],["precision",8,3],["update",2,1],["status",8,10]],"data":[["test","2021-08-18 06:01:11.021",10000,4,1,1,10,"3650,3650,3650",16,6,100,4096,1,3000,2,0,"ms",0,"ready"],["log","2021-08-18 05:51:51.065",4,1,1,1,10,"30,30,30",1,3,100,4096,1,3000,2,0,"us",0,"ready"]],"rows":2}
這條命令,通過 RESTful 接口訪問 TDengine server,這時連接的是本機(jī)的 6041 端口,可見連接成功。
TDengine RESTful 接口詳情請參考官方文檔。
使用 Docker 容器運(yùn)行 TDengine server 和 taosAdapter
在 TDengine 2.4.0.0 之后版本的 Docker 容器,開始提供一個獨(dú)立運(yùn)行的組件 taosAdapter,代替之前版本 TDengine 中 taosd 進(jìn)程中內(nèi)置的 http server。taosAdapter 支持通過 RESTful 接口對 TDengine server 的數(shù)據(jù)寫入和查詢能力,并提供和 InfluxDB/OpenTSDB 兼容的數(shù)據(jù)攝取接口,允許 InfluxDB/OpenTSDB 應(yīng)用程序無縫移植到 TDengine。在新版本 Docker 鏡像中,默認(rèn)啟用了 taosAdapter,也可以使用 docker run 命令中設(shè)置 TAOS_DISABLE_ADAPTER=true 來禁用 taosAdapter;也可以在 docker run 命令中單獨(dú)使用taosAdapter,而不運(yùn)行 taosd 。
注意:如果容器中運(yùn)行 taosAdapter,需要根據(jù)需要映射其他端口,具體端口默認(rèn)配置和修改方法請參考taosAdapter文檔。
使用 docker 運(yùn)行 TDengine 2.4.0.4 版本鏡像(taosd + taosAdapter):
docker run -d --name tdengine-all -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp tdengine/tdengine:2.4.0.4
使用 docker 運(yùn)行 TDengine 2.4.0.4 版本鏡像(僅 taosAdapter,需要設(shè)置 firstEp 配置項 或 TAOS_FIRST_EP 環(huán)境變量):
docker run -d --name tdengine-taosa -p 6041-6049:6041-6049 -p 6041-6049:6041-6049/udp -e TAOS_FIRST_EP=tdengine-all tdengine/tdengine:2.4.0.4 taosadapter
使用 docker 運(yùn)行 TDengine 2.4.0.4 版本鏡像(僅 taosd):
docker run -d --name tdengine-taosd -p 6030-6042:6030-6042 -p 6030-6042:6030-6042/udp -e TAOS_DISABLE_ADAPTER=true tdengine/tdengine:2.4.0.4
使用 curl 命令驗(yàn)證 RESTful 接口可以正常工作:
curl -H 'Authorization: Basic cm9vdDp0YW9zZGF0YQ==' -d 'show databases;' 127.0.0.1:6041/rest/sql
輸出示例如下:
{"status":"succ","head":["name","created_time","ntables","vgroups","replica","quorum","days","keep","cache(MB)","blocks","minrows","maxrows","wallevel","fsync","comp","cachelast","precision","update","status"],"column_meta":[["name",8,32],["created_time",9,8],["ntables",4,4],["vgroups",4,4],["replica",3,2],["quorum",3,2],["days",3,2],["keep",8,24],["cache(MB)",4,4],["blocks",4,4],["minrows",4,4],["maxrows",4,4],["wallevel",2,1],["fsync",4,4],["comp",2,1],["cachelast",2,1],["precision",8,3],["update",2,1],["status",8,10]],"data":[["log","2021-12-28 09:18:55.765",10,1,1,1,10,"30",1,3,100,4096,1,3000,2,0,"us",0,"ready"]],"rows":1}
應(yīng)用示例:在宿主機(jī)使用 taosBenchmark 寫入數(shù)據(jù)到 Docker 容器中的 TDengine server
1,在宿主機(jī)命令行界面執(zhí)行 taosBenchmark (曾命名為 taosdemo)寫入數(shù)據(jù)到 Docker 容器中的 TDengine server
$ taosBenchmark
taosBenchmark is simulating data generated by power equipments monitoring...
host: 127.0.0.1:6030
user: root
password: taosdata
configDir:
resultFile: ./output.txt
thread num of insert data: 10
thread num of create table: 10
top insert interval: 0
number of records per req: 30000
max sql length: 1048576
database count: 1
database[0]:
database[0] name: test
drop: yes
replica: 1
precision: ms
super table count: 1
super table[0]:
stbName: meters
autoCreateTable: no
childTblExists: no
childTblCount: 10000
childTblPrefix: d
dataSource: rand
iface: taosc
insertRows: 10000
interlaceRows: 0
disorderRange: 1000
disorderRatio: 0
maxSqlLen: 1048576
timeStampStep: 1
startTimestamp: 2017-07-14 10:40:00.000
sampleFormat:
sampleFile:
tagsFile:
columnCount: 3
column[0]:FLOAT column[1]:INT column[2]:FLOAT
tagCount: 2
tag[0]:INT tag[1]:BINARY(16)
Press enter key to continue or Ctrl-C to stop
回車后,該命令將在數(shù)據(jù)庫 test 下面自動創(chuàng)建一張超級表 meters,該超級表下有 1 萬張表,表名為 "d0" 到 "d9999",每張表有 1 萬條記錄,每條記錄有 (ts, current, voltage, phase) 四個字段,時間戳從 "2017-07-14 10:40:00 000" 到 "2017-07-14 10:40:09 999",每張表帶有標(biāo)簽 location 和 groupId,groupId 被設(shè)置為 1 到 10, location 被設(shè)置為 "beijing" 或者 "shanghai"。
最后共插入 1 億條記錄。
2.進(jìn)入 TDengine 終端,查看 taosBenchmark 生成的數(shù)據(jù)。
- 進(jìn)入命令行。
$ root@c452519b0f9b:~/TDengine-server-2.4.0.4# taos
Welcome to the TDengine shell from Linux, Client Version:2.4.0.4
Copyright (c) 2020 by TAOS Data, Inc. All rights reserved.
taos>
- 查看數(shù)據(jù)庫。
$ taos> SHOW DATABASES;
name | created_time | ntables | vgroups | ···
test | 2021-08-18 06:01:11.021 | 10000 | 6 | ···
log | 2021-08-18 05:51:51.065 | 4 | 1 | ···
- 查看超級表。
$ taos> use test;
Database changed.
$ taos> SHOW STABLES;
name | created_time | columns | tags | tables |
============================================================================================
meters | 2021-08-18 06:01:11.116 | 4 | 2 | 10000 |
Query OK, 1 row(s) in set (0.003259s)
- 查看表,限制輸出十條。
taos> SELECT * FROM test.d0 LIMIT 10;
ts | current | voltage | phase |
======================================================================================
2017-07-14 10:40:00.000 | 10.12072 | 223 | 0.34167 |
2017-07-14 10:40:00.001 | 10.16103 | 224 | 0.34445 |
2017-07-14 10:40:00.002 | 10.00204 | 220 | 0.33334 |
2017-07-14 10:40:00.003 | 10.00030 | 220 | 0.33333 |
2017-07-14 10:40:00.004 | 9.84029 | 216 | 0.32222 |
2017-07-14 10:40:00.005 | 9.88028 | 217 | 0.32500 |
2017-07-14 10:40:00.006 | 9.88110 | 217 | 0.32500 |
2017-07-14 10:40:00.007 | 10.08137 | 222 | 0.33889 |
2017-07-14 10:40:00.008 | 10.12063 | 223 | 0.34167 |
2017-07-14 10:40:00.009 | 10.16086 | 224 | 0.34445 |
Query OK, 10 row(s) in set (0.016791s)
- 查看 d0 表的標(biāo)簽值。
$ taos> SELECT groupid, location FROM test.d0;
groupid | location |
=================================
0 | shanghai |
Query OK, 1 row(s) in set (0.003490s)
應(yīng)用示例:使用數(shù)據(jù)收集代理軟件寫入 TDengine
taosAdapter 支持多個數(shù)據(jù)收集代理軟件(如 Telegraf、StatsD、collectd 等),這里僅模擬 StasD 寫入數(shù)據(jù),在宿主機(jī)執(zhí)行命令如下:
echo "foo:1|c" | nc -u -w0 127.0.0.1 6044
然后可以使用 taos shell 查詢 taosAdapter 自動創(chuàng)建的數(shù)據(jù)庫 statsd 和 超級表 foo 中的內(nèi)容:
taos> SHOW DATABASES;
name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status |
====================================================================================================================================================================================================================================================================================
log | 2021-12-28 09:18:55.765 | 12 | 1 | 1 | 1 | 10 | 30 | 1 | 3 | 100 | 4096 | 1 | 3000 | 2 | 0 | us | 0 | ready |
statsd | 2021-12-28 09:21:48.841 | 1 | 1 | 1 | 1 | 10 | 3650 | 16 | 6 | 100 | 4096 | 1 | 3000 | 2 | 0 | ns | 2 | ready |
Query OK, 2 row(s) in set (0.002112s)
taos> use statsd;
Database changed.
taos> SHOW STABLES;
name | created_time | columns | tags | tables |
============================================================================================
foo | 2021-12-28 09:21:48.894 | 2 | 1 | 1 |
Query OK, 1 row(s) in set (0.001160s)
taos> SELECT * FROM foo;
ts | value | metric_type |
=======================================================================================
2021-12-28 09:21:48.840820836 | 1 | counter |
Query OK, 1 row(s) in set (0.001639s)
taos>
可以看到模擬數(shù)據(jù)已經(jīng)被寫入到 TDengine 中。
停止正在 Docker 中運(yùn)行的 TDengine 服務(wù)
docker stop tdengine
- docker stop:通過 docker stop 停止指定的正在運(yùn)行中的 docker 鏡像。

