使用Docker中的InfluxDB和Grafana来可视化dweet.io的数据
使用Tutum提供的Grafana、Elasticsearch和Grafana的Docker映像,构建物联网数据存储和可视化平台。由于还未与MQTT代理Mosca协同工作,因此我们将dweet.io的数据作为虚拟数据使用InfluxDB客户端导入到数据库中。以dweet.io + InfluxDB + Grafana的投稿为参考,从dweet.io获取加利福尼亚州阿沃卡多果园的传感器数据。
InfluxDB容器
我们将使用InfluxDB作为物联网的数据存储。Docker镜像为tutum/influxdb。
$ docker pull tutum/influxdb
$ docker run --name influxdb \
-d \
-p 8083:8083 \
-p 8086:8086 \
--expose 8090 \
--expose 8099 \
-e PRE_CREATE_DB="influxdb" \
tutum/influxdb
我将在浏览器中进行确认。以下是用户名和密码。
-
- uesrname: root
- password root

我将使用curl进行记录的注册和获取的测试。
$ curl -X POST -d '[{"name":"foo","columns":["val"],"points":[[23]]}]' 'http://localhost:8086/db/influxdb/series?u=root&p=root'
我将查询记录。时间和序列号会自动填入。
$ curl -G 'http://localhost:8086/db/influxdb/series?u=root&p=root&pretty=true' --data-urlencode "q=select * from foo"
[
{
"name": "foo",
"columns": [
"time",
"sequence_number",
"val"
],
"points": [
[
1423550210688,
10001,
23
]
]
}
]
弹性搜索容器
Elasticsearch会保存Grafana仪表板配置信息。基于Docker的映像使用tutum/elasticsearch。由于本次Docker主机环境禁用了IPv6,从Docker Hub Registry获取的映像无法启动。为了禁用IPv6,我们将修改Nginx的配置文件并重新创建Docker映像。
$ mkdir -p ~/docker_apps/es
$ cd !$
使用sed命令将IPv6设置注释掉,并创建Dockerfile。
FROM tutum/elasticsearch
RUN sed -i '/listen \[::\]:9200/s/\(listen \[::\]:9200.*\)/#\1/' /etc/nginx/sites-enabled/default
构建镜像并启动容器。
$ docker build masato/elasticsearch .
$ docker run \
--name es \
-d \
-p 9200:9200 \
-e ELASTICSEARCH_USER=admin \
-e ELASTICSEARCH_PASS=mypass \
masato/elasticsearch
使用curl命令检查Elasticsearch的启动情况。
$ curl admin:mypass@10.1.3.67:9200
"status" : 200,
"name" : "Madcap",
"version" : {
"number" : "1.3.2",
"build_hash" : "dee175dbe2f254f3f26992f5d7591939aaefd12f",
"build_timestamp" : "2014-08-13T14:29:30Z",
"build_snapshot" : false,
"lucene_version" : "4.9"
},
"tagline" : "You Know, for Search"
}
Grafana容器
Grafana的基于Docker的镜像是tutum/grafana。我们将像Elasticsearch一样注释掉Nginx的IPv6配置。创建一个用于构建Docker镜像的项目目录。
$ mkdir -p ~/docker_apps/grafana
$ cd !$
创建Dockerfile。使用sed命令注释掉Nginx的IPv6设置。
FROM tutum/grafana
RUN sed -i '/listen \[::\]:80/s/\(listen \[::\]:80.*\)/#\1/' /etc/nginx/sites-enabled/default
构建镜像并启动容器。在环境变量中指定InfluxDB的IP地址和数据库名称等连接信息。
$ docker build -t masato/grafana .
$ docker run --name grafana \
-d \
-p 8080:80 \
-e INFLUXDB_HOST=10.1.3.67 \
-e INFLUXDB_PORT=8086 \
-e INFLUXDB_NAME=dweet \
-e INFLUXDB_USER=root \
-e INFLUXDB_PASS=root \
-e ELASTICSEARCH_HOST=10.1.3.67 \
-e ELASTICSEARCH_PORT=9200 \
-e ELASTICSEARCH_USER=admin \
-e ELASTICSEARCH_PASS=mypass \
masato/grafana
通过查看日志,确认自动生成的密码。
$ docker logs grafana
=> Creating basic auth for "admin" user with random password
Adding password for user admin
=> Done!
========================================================================
You can now connect to Grafana with the following credential:
admin:DUx0iSs3Zd10
========================================================================
=> Configuring InfluxDB
=> InfluxDB has been configured as follows:
InfluxDB ADDRESS: 10.1.3.67
InfluxDB PORT: 8086
InfluxDB DB NAME: sensortag
InfluxDB USERNAME: root
InfluxDB PASSWORD: root
** Please check your environment variables if you find something is misconfigured. **
=> Done!
=> Found Elasticsearch settings.
=> Set Elasticsearch url to "http://admin:mypass@10.1.3.67:9200".
=> Done!
=> Starting and running Nginx...
请在浏览器中确认。用户名和自动生成的密码如下所示。
-
- username: admin
- password: DUx0iSs3Zd10

InfluxDB客户端容器
使用dweet.io + InfluxDB + Grafana作为参考,在加利福尼亚的鳄梨果园中使用实际数据进行测试。使用InfluxDB的Python客户端,即influxdb-python,将记录添加到InfluxDB中。Docker的基本镜像使用google/python-runtime。
$ mkdir -p ~/docker_apps/dwingest
$ cd !$
指定要通过pip安装的软件包。
influxdb
创建Dockerfile,并在ENTRYPOINT中指定要执行的Python脚本和参数。
FROM google/python-runtime
ENTRYPOINT ["/env/bin/python", "/app/dwingest.py","10.1.3.67","AvocadoGrove","aiHotWaterTemp_degreesF","20"]
使用curl来创建InfluxDB数据库和用户,用于测试目的。
-
- database: dweet
-
- username: dweet
- password: dweet
$ curl -X POST 'http://10.1.3.67:8086/db?u=root&p=root' -d '{"name": "dweet"}'
$ curl -X POST 'http://10.1.3.67:8086/db/dweet/users?u=root&p=root' \
-d '{"name": "dweet", "password": "dweet"}'
启动作业容器并同时从dweet.io查询数据将其注册到InfluxDB。
$ docker run --rm --name dwingest dwingest
2015-02-10T07:12:27 Using InfluxDB host at 10.1.3.67:8086
2015-02-10T07:12:27 ================================================================================
2015-02-10T07:12:27 Querying thing AvocadoGrove with key aiHotWaterTemp_degreesF every 10 sec
2015-02-10T07:12:27 --------------------------------------------------------------------------------
2015-02-10T07:12:27 Starting new HTTP connection (1): 10.1.3.67
2015-02-10T07:12:28 Ingested value: 95.661
2015-02-10T07:12:38 --------------------------------------------------------------------------------
2015-02-10T07:12:38 Resetting dropped connection: 10.1.3.67
2015-02-10T07:12:38 Ingested value: 95.691
2015-02-10T07:12:48 --------------------------------------------------------------------------------
2015-02-10T07:12:49 Resetting dropped connection: 10.1.3.67
2015-02-10T07:12:49 Ingested value: 95.691
...
使用Grafana进行图表创建
通过在屏幕上进行设置,可以轻松创建图表。
