如何在Docker上设置InfluxDB、Telegraf和Grafana(第一部分)

导航至

本篇博客由InfluxAce Antoine Solnichkin编写。

InfluxDB Grafana Docker

由InfluxData于2013年创建,InfluxDB是目前最常用的DevOps监控和仪表盘时序数据库之一。被全球许多成功的公司使用,InfluxDB通常在分布式和多云环境中部署。Docker作为一个虚拟化环境,为许多组织提供了一个简单的方式来动态创建、管理和删除容器,非常适合许多组织。如果您正在尝试构建可靠的监控架构,一种解决方案是在Docker上安装InfluxDB并使用Kubernetes进行管理。

在本教程系列的第1部分中,我们将介绍在Linux实例上安装InfluxDB 1.7的步骤。然后在第2部分中,我们将描述如何为数据收集安装Telegraf插件和与InfluxDB 1.7及Docker配合使用的Grafana界面。请注意,InfluxDB将很快升级到InfluxDB 2.0,这将作为一个单一平台来管理TICK Stack的所有组件。关于如何安装和配置InfluxDB 2.0的另一篇教程即将推出。在开始之前,确保满足安装InfluxDB在Docker上的所有先决条件是非常重要的。

先决条件

sudo权限

首先,您需要在您的Linux机器上拥有sudo权限;否则,您将无法在主机上安装InfluxDB。

要验证它,请运行以下命令

$ sudo -v

如果您的终端没有显示错误消息,那么您就可以开始了。

接下来,您需要确保Docker已正确安装在您的系统上。

Docker已正确安装和配置

教程“如何在Ubuntu 18.04和Debian 10上安装Docker”“如何安装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配置非常简单,或者您更喜欢完全控制您的容器,应使用此方法。

但是,有一种方法可以使用脚本初始化InfluxDB(无论是bash脚本还是InfluxQL脚本)。如果您正在使用InfluxDB自动处理许多服务器(例如使用Chef或Puppet),并且希望在所有实例上具有相同的初始设置,应执行此操作。

在Docker上安装InfluxDB 1.7.x

Docker的官方InfluxDB镜像称为influxdb

InfluxDB Docker official image

此InfluxDB镜像属于官方Docker镜像,因此您有信心在系统上运行的是官方版本的InfluxDB。此外,TICK Stack(Telegraf、InfluxDB、Chronograf和Kapacitor)的其他工具也是官方Docker镜像的一部分。

InfluxDB镜像将安装负责在您的系统上存储时间序列指标的InfluxDB服务器。

如果您熟悉Docker,您已经知道您可以从本地文件系统将卷映射到容器中,以便在容器中更容易地操作数据。这正是本教程将要执行的操作。

配置文件以及存储实际数据的目录将存储在我们的本地文件系统中。

为Docker准备InfluxDB 1.7.x

如果您仔细遵循了在Ubuntu上设置InfluxDB的教程设置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 命令将在标准输出上打印完整的InfluxDB配置文件(默认情况下为您的shell)。

由于设置了–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容器通过自定义InfluxQL脚本来创建管理员账户、普通用户账户(用于Telegraf)以及具有自定义保留策略的数据库。

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文件夹。

首先,在您希望的地方在主机上创建一个脚本文件夹。在我的情况下,它将创建在/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 https://127.0.0.1:8086/query --data-urlencode "q=SHOW DATABASES"

您还可以检查您的 InfluxDB 服务器是否正确地在您的宿主机上监听端口 8086。

$ netstat -tulpn | grep 8086
tcp6    0    0 :::8086      :::*       LISTEN       -

太棒了!您的 InfluxDB 容器已正确地在 Docker 上运行。

默认情况下,您的 InfluxDB 服务器不包含任何数据库,除了用于内部指标的自用 _internal 数据库。然而,如果您为您的 InfluxDB 数据库创建了初始化脚本

,请确保您的数据库和保留策略已正确分配。

$ influx
Connected to https://127.0.0.1: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环境分配伪终端。

目前,您应该有一个shell提示符,类似于这个

在您的容器中,运行influx工具以创建您的管理员账户。

$ influx
Connected to https://127.0.0.1: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 https://127.0.0.1:8086/query --data-urlencode "q=SHOW DATABASES"
{"error":"unable to parse authentication credentials"}

太好了!身份验证已正确启用。

让我们尝试使用正确的凭证再次执行InfluxQL查询。

$ curl -G -u admin:admin123 https://127.0.0.1:8086/query --data-urlencode "q=SHOW DATABASES"

{"results":[{"statement_id":0,"series":[{"name":"databases","columns":["name"],"values":[["_internal"]]}]}]}

通过这个curl命令,我们确保了我们的凭证已正确设置在我们的InfluxDB服务器上。

现在,您的时序数据库已启动并运行,是时候安装我们的指标收集代理: Telegraf