通過 Docker 快速體驗 TDengine
雖然并不推(tui)薦在(zai)生產環境(jing)(jing)中通(tong)過 Docker 來部署 TDengine 服務(wu),但 Docker 工具(ju)能(neng)夠(gou)很(hen)好地屏蔽底層(ceng)操作(zuo)系(xi)統的環境(jing)(jing)差異,很(hen)適合在(zai)開發測試(shi)或初次體(ti)驗時用(yong)于安裝運行(xing)(xing) TDengine 的工具(ju)集。特別是(shi),借助 Docker,能(neng)夠(gou)比較方便地在(zai) macOS 和 Windows 系(xi)統上嘗試(shi) TDengine,而(er)無需安裝虛(xu)擬機或額外(wai)租用(yong) Linux 服務(wu)器。另外(wai),從2.0.14.0版(ban)本開始,TDengine提(ti)供(gong)的鏡像(xiang)已經可以(yi)(yi)同時支持X86-64、X86、arm64、arm32平臺(tai),像(xiang)NAS、樹莓派(pai)、嵌入式開發板之類可以(yi)(yi)運行(xing)(xing)docker的非主(zhu)流計(ji)算機也(ye)可以(yi)(yi)基于本文檔(dang)輕松體(ti)驗TDengine。
下文通(tong)過(guo) Step by Step 風格的(de)介紹,講解如何通(tong)過(guo) Docker 快速建立 TDengine 的(de)單節點運行環境,以支持(chi)開發(fa)和測試。
下載 Docker
Docker 工具自(zi)身的下載請參考(kao) 。
安裝完畢后可(ke)以(yi)在(zai)命令行終端查看 Docker 版本(ben)。如果(guo)版本(ben)號正常輸出,則說(shuo)明 Docker 環境已經(jing)安裝成功。
$ docker -v
Docker version 20.10.3, build 48d30b5
使用 Docker 在容器中運行 TDengine
在 Docker 容器中運行 TDengine server
$ docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp tdengine/tdengine
526aa188da767ae94b244226a2b2eec2b5f17dd8eff592893d9ec0cd0f3a1ccd
這條命令,啟動一個運行了 TDengine server 的 docker 容器,并且將容器的 6030 到 6049 端口映射到宿主機的 6030 到 6049 端口上。如果宿主機已經運行了 TDengine server 并占用了相同端口,需要映射容器的端口到不同的未使用端口段。(詳情參見 TDengine 2.0 端口說明)。為了支持 TDengine 客戶端操作 TDengine server 服(fu)務, TCP 和(he) UDP 端口都需要(yao)打開。
- docker run:通過 Docker 運行一個容器
- -d:讓容器在后臺運行
- -p:指定映射端口。注意:如果不是用端口映射,依然可以進入 Docker 容器內部使用 TDengine 服務或進行應用開發,只是不能對容器外部提供服務
- tdengine/tdengine:拉取的 TDengine 官方發布的應用鏡像
- 526aa188da767ae94b244226a2b2eec2b5f17dd8eff592893d9ec0cd0f3a1ccd:這個返回的長字符是容器 ID,我們也可以通過容器 ID 來查看對應的容器
進一步,還可以使用 docker run 命令啟動運行 TDengine server 的 docker 容器,并使用 --name 命令行參數將容器命名為 tdengine,使用 --hostname 指定 hostname 為 tdengine-server,通過 -v 掛載本(ben)地目(mu)錄到容(rong)器(qi)(qi),實現宿主機與容(rong)器(qi)(qi)內部(bu)的數(shu)據同步,防止容(rong)器(qi)(qi)刪(shan)除后,數(shu)據丟失。
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:設置容器名稱,我們可以通過容器名稱來訪問對應的容器
- --hostname=tdengine-server:設置容器內 Linux 系統的 hostname,我們可以通過映射 hostname 和 IP 來解決容器 IP 可能變化的問題。
- -v:設置宿主機文件目錄映射到容器內目錄,避免容器刪除后數據丟失。
使用 docker ps 命令確認容器是否已經正確運行
docker ps
輸出示例如下:
CONTAINER ID IMAGE COMMAND CREATED STATUS ···
c452519b0f9b tdengine/tdengine "taosd" 14 minutes ago Up 14 minutes ···
- docker ps:列出所有正在運行狀態的容器信息。
- CONTAINER ID:容器 ID。
- IMAGE:使用的鏡像。
- COMMAND:啟動容器時運行的命令。
- CREATED:容器創建時間。
- STATUS:容器狀態。UP 表示運行中。
通過 docker exec 命令,進入到 docker 容器中去做開發
$ docker exec -it tdengine /bin/bash
root@tdengine-server:~/TDengine-server-2.4.0.4#
- docker exec:通過 docker exec 命令進入容器,如果退出,容器不會停止。
- -i:進入交互模式。
- -t:指定一個終端。
- tdengine:容器名稱,需要根據 docker ps 指令返回的值進行修改。
- /bin/bash:載入容器后運行 bash 來進行交互。
進入容器后,執行(xing) taos shell 客戶端(duan)程(cheng)序。
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 終(zhong)端成功(gong)連接服務端,打印出了歡迎(ying)消息(xi)和版本(ben)信息(xi)。如果失敗,會(hui)有錯誤信息(xi)打印出來。
在 TDengine 終端中,可以通過 SQL 命令來創建/刪除數據庫、表、超級表等,并可以進行插入和查詢操作。具體可以參考 TAOS SQL 說明文檔。
在宿主機訪問 Docker 容器中的 TDengine server
在使用(yong)了(le) -p 命(ming)(ming)令行參數映射了(le)正(zheng)確的端(duan)口啟動了(le) TDengine Docker 容器(qi)后,就(jiu)在宿主機使用(yong) taos shell 命(ming)(ming)令即可訪問運行在 Docker 容器(qi)中的 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>
也可以在宿主機(ji)使用 curl 通過 RESTful 端口訪問 Docker 容器(qi)內(nei)的(de) 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 接口(kou)訪問(wen) TDengine server,這時連接的(de)是本(ben)機的(de) 6041 端(duan)口(kou),可見連接成(cheng)功。
TDengine RESTful 接口詳情請參考官方文檔。
使用 Docker 容器運行 TDengine server 和 taosAdapter
在 TDengine 2.4.0.0 之后(hou)版(ban)本(ben)的(de)(de) Docker 容器,開始提(ti)供一個獨(du)(du)立運行的(de)(de)組件 taosAdapter,代替之前版(ban)本(ben) TDengine 中(zhong) taosd 進程(cheng)中(zhong)內置(zhi)的(de)(de) http server。taosAdapter 支持通過 RESTful 接口對 TDengine server 的(de)(de)數(shu)據寫入和(he)查詢(xun)能(neng)力,并提(ti)供和(he) InfluxDB/OpenTSDB 兼容的(de)(de)數(shu)據攝取接口,允許(xu) InfluxDB/OpenTSDB 應用(yong)(yong)程(cheng)序無縫移植到(dao) TDengine。在新(xin)版(ban)本(ben) Docker 鏡像中(zhong),默認啟(qi)用(yong)(yong)了 taosAdapter,也可(ke)(ke)以使用(yong)(yong) docker run 命令中(zhong)設置(zhi) TAOS_DISABLE_ADAPTER=true 來(lai)禁(jin)用(yong)(yong) taosAdapter;也可(ke)(ke)以在 docker run 命令中(zhong)單獨(du)(du)使用(yong)(yong)taosAdapter,而不運行 taosd 。
注(zhu)意(yi):如(ru)果容(rong)器中(zhong)運行 taosAdapter,需要根(gen)據(ju)需要映射其他端口(kou),具體端口(kou)默認配(pei)置和修改方(fang)法請參考。
使用(yong) docker 運行(xing) TDengine 2.4.0.4 版本鏡(jing)像(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 運(yun)行(xing) TDengine 2.4.0.4 版本鏡像(僅 taosAdapter,需(xu)要設(she)置 firstEp 配置項 或(huo) TAOS_FIRST_EP 環境(jing)變量):
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 運(yun)行 TDengine 2.4.0.4 版本鏡(jing)像(僅 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 命令驗證(zheng) 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}
應用示例:在宿主機使用 taosBenchmark 寫入數據到 Docker 容器中的 TDengine server
1,在宿主機命令行界(jie)面執行 taosBenchmark (曾命名為 taosdemo)寫入數(shu)據到(dao) Docker 容(rong)器中的 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
回車后,該命令將(jiang)在(zai)數(shu)據庫 test 下(xia)面自動創建一張超(chao)級表(biao) meters,該超(chao)級表(biao)下(xia)有(you)(you) 1 萬張表(biao),表(biao)名為 "d0" 到 "d9999",每張表(biao)有(you)(you) 1 萬條記(ji)錄,每條記(ji)錄有(you)(you) (ts, current, voltage, phase) 四(si)個字段(duan),時間戳從 "2017-07-14 10:40:00 000" 到 "2017-07-14 10:40:09 999",每張表(biao)帶(dai)有(you)(you)標(biao)簽 location 和 groupId,groupId 被(bei)設置(zhi)為 1 到 10, location 被(bei)設置(zhi)為 "beijing" 或者 "shanghai"。
最后共插入(ru) 1 億條記錄(lu)。
2.進入 TDengine 終端,查看 taosBenchmark 生(sheng)成(cheng)的數據。
- 進入命令行。
$ 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>
- 查看數據庫。
$ 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 表的標簽值。
$ taos> SELECT groupid, location FROM test.d0;
groupid | location |
=================================
0 | shanghai |
Query OK, 1 row(s) in set (0.003490s)
應用示例:使用數據收集代理軟件寫入 TDengine
taosAdapter 支持多個數據(ju)收集(ji)代理軟(ruan)件(如 Telegraf、StatsD、collectd 等),這里僅模擬(ni) StasD 寫入數據(ju),在宿主機執行命(ming)令如下:
echo "foo:1|c" | nc -u -w0 127.0.0.1 6044
然后(hou)可(ke)以使用 taos shell 查詢(xun) taosAdapter 自動創建的數據庫(ku) statsd 和 超級(ji)表(biao) foo 中(zhong)的內容:
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>
可以看到模擬數據已經被寫入到 TDengine 中(zhong)。
停止正在 Docker 中運行的 TDengine 服務
docker stop tdengine
- docker stop:通過 docker stop 停止指定的正在運行中的 docker 鏡像。

