如何在 Docker 上设置 InfluxDB、Telegraf 和 Grafana:第 1 部分
作者:社区 / 产品, 用例
2019 年 11 月 11 日
导航至
这篇文章由 InfluxAce Antoine Solnichkin 撰写。
InfluxDB 由 InfluxData 于 2013 年构建,是迄今为止 DevOps 监控和仪表板中使用最多的时间序列数据库之一。InfluxDB 被全球许多成功的公司使用,通常部署在分布式和多云环境中。Docker 可以作为许多组织的良好选择,作为一个虚拟化环境,它提供了一种在运行时轻松创建、管理和删除容器的方法。如果您正在尝试构建可靠的监控架构,一种解决方案是在 Docker 上安装 InfluxDB 并使用 Kubernetes 进行管理。
在本教程系列的第一部分中,我们将介绍在 Linux 实例的 Docker 上安装 InfluxDB 1.7 的步骤。然后稍后,我们将在第 2 部分中描述如何安装用于数据收集的 Telegraf 插件以及 InfluxDB 1.7 和 Docker 的 Grafana 界面。请注意,InfluxDB 即将成为 InfluxDB 2.0,它将作为一个单一平台来管理 TICK Stack 的所有组件。关于如何安装和设置 InfluxDB 2.0 的另一个教程即将推出。在您开始之前,重要的是确保满足在 Docker 上安装 InfluxDB 的所有先决条件。
先决条件
Sudo 权限
首先,您需要在您的 Linux 机器上拥有 sudo 权限;否则,您将无法在您的主机上安装 InfluxDB。
要验证它,请运行以下命令
$ sudo -v
如果您的终端上没有显示错误消息,那么您就可以继续了。
接下来,您需要确保 Docker 已正确安装在您的系统上。
Docker 已正确安装和配置
教程 “如何在 Ubuntu 18.04 和 Debian 10 上安装 Docker” 提供了关于如何在 Linux 上正确设置 Docker 的详细信息。再次验证 Docker 是否已正确安装,您可以运行以下命令
$ docker --version Docker version 19.03.1, build 74b1e89
现在 Docker 已准备就绪,让我们快速看一下我们将用于容器的网络策略。
为 InfluxDB 设计网络策略
在您开始之前,重要的是回顾一些关于网络的细节。默认情况下,新创建的容器在桥接网络堆栈上运行。此外,在您安装 InfluxDB 后,它将在您的网络堆栈上暴露有用的端口(例如端口 8086)。稍后,您也可以将 Telegraf 绑定到它,但 Telegraf 不必将任何端口暴露给您当前的主机堆栈。
让我们在默认的桥接网络上运行 InfluxDB,并让 Telegraf 在与 InfluxDB 相同的堆栈中运行。此外,我们将 Grafana 添加到我们的桥接网络,以便可视化 Telegraf 收集的指标。
现在我们已经看到了我们将要使用的网络策略,让我们为 Docker 安装 InfluxDB 容器。
要在 Docker 上安装 InfluxDB,您有两种方法。
您可以手动准备您的文件系统,并在没有初始化脚本的情况下在 Docker 容器上运行 InfluxDB。这是初始化 InfluxDB 最简单的方法。如果您计划在单个实例上运行 InfluxDB,并且您的初始 InfluxDB 配置非常简单,或者如果您喜欢完全控制您的容器,则应使用此方法。
但是,有一种方法可以使用脚本(bash 脚本或 InfluxQL 脚本)初始化 InfluxDB。如果您正在使用 InfluxDB 自动化大量服务器(例如使用 Chef 或 Puppet),并且您希望在所有实例上具有相同的初始设置,则应这样做。
在 Docker 上安装 InfluxDB 1.7.x
Docker 的官方 InfluxDB 镜像称为 influxdb。
此 InfluxDB 镜像是官方 Docker 镜像的一部分,因此您可以放心,您正在系统上运行官方版本的 InfluxDB。此外,TICK Stack 的其他工具(Telegraf、InfluxDB、Chronograf 和 Kapacitor)也是官方 Docker 镜像的一部分。
InfluxDB 镜像将安装负责在您的系统上存储时间序列指标的 InfluxDB 服务器。
如果您熟悉 Docker,您已经知道您可以将本地文件系统中的卷映射到您的容器,以便更轻松地在容器中操作数据。这正是我们将在本教程中要做的事情。
配置文件以及存储实际数据的目录将存储在我们的本地文件系统上。
为 Docker 准备 InfluxDB 1.7.x
如果您仔细遵循关于 在 Ubuntu 上设置 InfluxDB 的教程,您就会知道您将为您的 InfluxDB 数据库创建一个特定的用户。
$ sudo useradd -rs /bin/false influxdb
在您的 etc 目录中,为您的 InfluxDB 配置文件创建一个新文件夹。
$ sudo mkdir -p /etc/influxdb
为 InfluxDB 和 Docker 创建配置文件
幸运的是,您不必自己创建 InfluxDB 配置文件。要使用 Docker 创建 InfluxDB 配置文件,请运行以下命令
docker run --rm influxdb influxd config | sudo tee /etc/influxdb/influxdb.conf > /dev/null
简单解释一下,influxd config 命令将在标准输出(默认情况下是您的 shell)上为您打印完整的 InfluxDB 配置文件。
由于设置了 –rm 选项,Docker 将运行一个容器来执行此命令,并且容器将在退出后立即删除。与其将配置文件打印在标准输出上,不如将其重定向到我们的 InfluxDB 配置文件。
接下来,为新创建的文件重新分配文件夹权限;否则,您的容器将无法与其正确交互。
$ sudo chown influxdb:influxdb /etc/influxdb/
为 InfluxDB 和 Docker 创建 lib 文件夹
正如文档中所述,InfluxDB 默认将其数据、元数据以及 WAL(用于预写日志)存储在 /var/lib/influxdb 文件夹中。
因此,如果此文件夹当前不存在,则必须创建它。
$ sudo mkdir -p /var/lib/influxdb
再次,确保为您的容器正确设置了权限以写入此文件夹。
$ sudo chown influxdb:influxdb /var/lib/influxdb
现在我们的文件夹已准备就绪,让我们看看如何使用自定义脚本初始化 InfluxDB。
为 Docker 上的 InfluxDB 准备初始化脚本(可选)
使用 InfluxDB 镜像,有一种方法可以自动化容器上的数据库初始化。例如,我们将指示我们的 Docker 容器创建一个管理员帐户、一个常规用户帐户(用于 Telegraf)以及一个带有自定义保留策略的数据库,通过一个自定义 InfluxQL 脚本。
InfluxDB 镜像的结构
在容器启动时,将执行 entrypoint.sh 脚本,它被设置为您的 Docker 容器的入口点。
可以通过两种方式执行入口点。
您可以执行入口点脚本,以便在您的容器上启动一个简单的 InfluxDB 实例。例如,这就是我们在上一节中所做的。我们指定了配置标志,它用于设置您的 InfluxDB 服务器初始化。
但是,还有第二种执行入口点脚本的方法:执行 init-influxdb 脚本。
init-influxdb 脚本由两部分组成
- 首先,它将监视传递给您的 docker 命令的环境变量,并将相应地执行命令。
- 接下来,如果您在容器的根目录中有一个 docker-entrypoint-initdb.d 目录,它将在其中执行 bash 脚本或 IQL 脚本。
我们将使用此信息来创建我们的 InfluxDB 容器。
首先,确保 /var/lib/influxdb 文件夹中尚未创建任何文件夹。
$ ls -l /var/lib/influxdb
total 0
执行以下命令以更新元文件夹(在 influxdb 文件夹中)以包含正确的信息。提醒一下,我们想要一个管理员帐户和一个 Telegraf 的常规帐户(名为 telegraf)。
在您的主机上创建初始化脚本
为了使初始化脚本在初始化时运行,它们必须映射到容器中的 docker-entrypoint-initdb.d 文件夹。
首先,在您想要的任何位置在您的主机上创建一个 scripts 文件夹。在我的例子中,它将在 /etc/influxdb 中创建。
$ sudo mkdir -p /etc/influxdb/scripts
在您新创建的文件夹上编辑一个新的脚本文件,并确保为其提供 .iql 扩展名
$ sudo touch influxdb-init.iql
CREATE DATABASE weather;
CREATE RETENTION POLICY one_week ON weather DURATION 168h REPLICATION 1 DEFAULT;
这是一个简单的初始化脚本,它将为天气数据创建一个数据库,并将为该数据库分配一周的保留策略。
太棒了!
最后一步是为 InfluxDB 初始化准备我们的元文件夹。
创建/更新 InfluxDB 元数据库
为了更新您的元数据库,请运行以下命令
$ docker run --rm -e INFLUXDB_HTTP_AUTH_ENABLED=true \
-e INFLUXDB_ADMIN_USER=admin \
-e INFLUXDB_ADMIN_PASSWORD=admin123 \
-v /var/lib/influxdb:/var/lib/influxdb \
-v /etc/influxdb/scripts:/docker-entrypoint-initdb.d \
influxdb /init-influxdb.sh
注意: 将 INFLUXDB_HTTP_AUTH_ENABLED 设置为 true 并不意味着在您的 InfluxDB 服务器上启用了身份验证。身份验证在接下来的部分之一中启用;此参数仅用于初始化脚本。
请确保您的终端上打印了一些日志。如果不是这种情况,请确保您为您的容器指定了正确的环境变量。
如果您选择为您的容器创建初始化脚本,您也应该有一行日志。
作为最后的验证步骤,您可以检查您的元文件夹中的 meta.db 文件,以确保更改已正确写入。
$ cat /var/lib/influxdb/meta/meta.db | grep one_week
现在您的 InfluxDB 文件已准备就绪,让我们转到一些配置验证。
验证您的 Docker 版 InfluxDB 配置
如果您使用了上面部分中详细介绍的配置命令,您应该在 /etc/influxdb 文件夹中看到一个简单的配置文件。打开您的文件并验证一切是否正确。
HTTP 接口
转到您配置的 [http] 部分,并确保已启用它。
验证绑定地址是否默认设置为 8086。这是您将用于向您的 InfluxDB 数据库发送一些命令的端口,例如创建数据库或添加用户。
默认情况下,身份验证和加密已禁用。但是,本教程的几个部分解释了如何深入设置身份验证。
数据、元数据和 WAL 配置
默认情况下,您的配置文件应具有我们在第一部分中创建的路径,因此您不必更改任何内容。但是,您应该检查您的路径是否正确。
[meta]
dir = "/var/lib/influxdb/meta"
[data]
dir = "/var/lib/influxdb/data"
wal-dir = "/var/lib/influxdb/wal"
在 Docker 上运行 InfluxDB 容器
我们将使用来自官方 Docker 存储库的 InfluxDB 镜像。快速提醒一下,您需要使用 docker container run 命令才能启动 Docker 容器。
首先,确保端口 8086 上没有任何内容正在运行。
$ sudo netstat -tulpn | grep 8086
如果您正确地记得,我们将我们的文件夹配置为可由 InfluxDB 用户(属于 InfluxDB 组)访问。因此,我们将需要 InfluxDB 用户的用户 ID 才能运行我们的容器。
要查找 InfluxDB 用户 ID,请转到您主机上的 passwd 文件并运行
$ cat /etc/passwd | grep influxdb
influxdb:x:997:997::/var/lib/influxdb:/bin/false
如您所见,我的 InfluxDB 用户的用户 ID 是 997。
注意:您的系统上的用户 ID 肯定会有所不同,您应该在运行 docker 命令时相应地修改它。
要在 Docker 上启动 InfluxDB,请运行以下命令。
docker run -d -p 8086:8086 --user 997:997 --name=influxdb \
-v /etc/influxdb/influxdb.conf:/etc/influxdb/influxdb.conf \
-v /var/lib/influxdb:/var/lib/influxdb \
influxdb \
-config /etc/influxdb/influxdb.conf
测试您的 InfluxDB 容器
为了测试您的 InfluxDB 容器是否正确运行,您可以检查 HTTP API 是否已正确启用。
$ curl -G http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
您还可以检查您的 InfluxDB 服务器是否正在您主机上的端口 8086 上正确侦听。
$ netstat -tulpn | grep 8086
tcp6 0 0 :::8086 :::* LISTEN -
太棒了!您的 InfluxDB 容器正在 Docker 上正确运行。
默认情况下,您的 InfluxDB 服务器不包含任何数据库,除了 _internal,顾名思义,它用于 InfluxDB 自身的内部指标。但是,如果您为您的 InfluxDB 创建了初始化脚本
数据库,请确保您的数据库和保留策略已正确分配。
$ influx
Connected to http://localhost:8086 version 1.7.8
InfluxDB shell version: 1.7.7
> SHOW USERS
user admin
---- -----
admin true
> SHOW DATABASES
name: databases
name
----
weather
为 Docker 版 InfluxDB 启用身份验证
为了为 InfluxDB 1.7.x 启用身份验证,您将为您的 InfluxDB 数据库创建一个管理员帐户(如果您没有使用初始化脚本)
使用 docker exec 创建管理员帐户
如果您在之前的章节中使用环境变量初始化了您的 InfluxDB 镜像,则不必创建管理员帐户。
只有当您选择完全自定义的 InfluxDB 镜像并自行配置时,这才是有必要的。
要创建管理员帐户,请连接到您的容器中的 bash 进程并自行运行 influx 实用程序。
要实现这一点,请运行以下命令
$ docker container ls
注意: 如果您的容器没有在此处显示,请使用 -a(全部)标志运行此命令,以确保您的容器没有崩溃。
确定您的 InfluxDB 容器的容器 ID,并运行以下命令以在您的容器中获得 bash
$ docker exec -it <container_id> /bin/bash
提醒一下,docker exec 用于在正在运行的容器中运行命令。
以下是与其一起指定的选项
- -i:用于交互式,即使未附加,它也会保持标准输入打开
- -t:为您当前的 shell 环境分配一个伪 TTY。
现在,您应该有一个 shell 提示符,类似于这样
在您的容器中,运行 influx 实用程序以创建您的管理员帐户。
$ influx
Connected to http://localhost:8086 version 1.7.8
InfluxDB shell version: 1.7.8
> CREATE USER admin WITH PASSWORD 'admin123' WITH ALL PRIVILEGES
> SHOW USERS
user admin
---- -----
admin true
现在您拥有了一个管理员帐户,您可以为您的数据库启用 HTTP 身份验证。
在您的配置文件中启用 HTTP 身份验证
要实现这一点,请退出您的容器,并转到您为 InfluxDB 创建的配置文件夹。
Ctrl + D(退出您的容器)
$ sudo nano /etc/influxdb/influxdb.conf
[http]
enabled = true
bind-address = ":8086"
auth-enabled = true
保存您的文件并重新启动您的容器以应用更改。
$ docker container restart <container_id>
为了确保您的更改有效,请尝试再次查询 HTTP API。
您应该无法在不指定正确凭据的情况下执行查询。
$ curl -G http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
{"error":"unable to parse authentication credentials"}
太棒了!身份验证已正确启用。
让我们尝试再次使用正确的凭据执行 InfluxQL 查询。
$ curl -G -u admin:admin123 http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
{"results":[{"statement_id":0,"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]}]}]}
通过此 curl 命令,我们确保了我们的凭据已为我们的 InfluxDB 服务器正确设置。
现在您的时间序列数据库已启动并运行,是时候安装我们的指标收集代理:Telegraf 了。