使用 Docker 运行 InfluxDB 2.0 和 Telegraf

导航至

此文章最初发布于 2021 年 1 月,为了保持其时效性,我们在 2022 年 12 月对其进行了更新。

与此博客相关的代码可以在这个 repo 中找到。

尽管 Docker 的热度有所下降,被 “Kubernetes” 和 “Serverless” 等新词所取代,但不可否认的是,对于希望开始使用 Linux 容器的开发者来说,Docker 仍然是默认的工具链,因为它非常普及,并且与各种平台紧密集成。

Linux 容器是从多个底层 Linux 功能(如命名空间cgroups)构建的抽象概念,它们共同提供了一种操作系统级别的虚拟化;对于您的应用程序而言,似乎每个应用程序都在其自身的操作系统副本上独立运行。因此,与直接在主机上运行软件相比,Docker 具有多种优势;它可以将您的应用程序与系统的其余部分以及彼此隔离,并使跨各种操作系统部署应用程序变得更加容易。总的来说,它可以使事物保持整洁、有序和良好分区。

如果您有兴趣了解更多关于容器的信息,我强烈推荐 Julia Evans 的 “What even is a container” (什么是容器?) 这篇文章。

就我个人而言,我在桌面上运行 Docker,并在那里尽可能多地部署我的应用程序;这不仅可以使我的主机保持清洁——我经常需要启动一个新的堆栈副本来测试特定问题、开发新功能或演示演示,而 Docker 使这一切变得异常容易。

Linux 容器和 Docker 都是很棒的工具,应该成为每个开发者工具库的一部分。那么,我们如何使用它们来运行 InfluxDB 2.x 呢?

目录

Docker 组件

您需要在本地机器上安装 Docker。Docker 网站提供了 macOSWindows 上的安装文档。Docker CE 安装文档中还提供了针对多种 Linux 变体的说明。

由于 Docker 是 Linux 容器的实现,因此需要 Linux 操作系统才能运行。当您为 Windows 或 macOS 安装 Docker 时,它将设置和管理一个带有 Linux 内核的虚拟机,该虚拟机将运行您的所有容器。在 macOS 上,虚拟机通过使用 HyperKit 进行设置,而在 Windows 上,虚拟化由 Hyper-V 提供。遗憾的是,Hyper-V 仅在 Windows 10 企业版、专业版和教育版上受支持;运行 Windows 家庭版的用户将需要使用旧版 Docker Toolbox

要在容器中运行 InfluxDB 2.0 和 Telegraf,您需要

运行 Docker 容器

有几种方法可以与 Docker 交互并管理您的容器。第一种是使用 docker 可执行文件来发出命令,例如 docker rundocker stop

如果您已完整遵循 Docker 的安装说明,则应该已经使用以下命令启动了 hello-world 容器

$ docker run hello-world

在运行更复杂的软件时,我们通常需要为 docker run 命令提供额外的参数来配置容器环境。这可能包括将容器中的端口暴露给 Docker 主机,或挂载卷以进行持久存储。

Docker 网络

首先,我们将设置一个新的 Docker 网络。Docker 自带一个内置网络,默认情况下所有容器都连接到该网络,但是为我们的 InfluxDB 2.0-r.c 和 Telegraf 部署创建一个新网络将使它们保持隔离,同时允许它们相互通信。隔离对于许多事情都很有用,但对于启动堆栈的多个实例以进行测试或开发尤其有帮助。您可以在文档中阅读更多关于默认网络和用户定义网络之间区别的信息。

我们将使用以下命令创建一个新网络

$ docker network create --driver bridge influxdb-telegraf-net

这将使用 bridge 驱动程序创建一个新网络,并将其命名为 influxdb-telegraf-net

当我们执行 docker run 命令来启动容器时,我们将添加以下参数以将其连接到我们新创建的网络

--network influxdb-telegraf-net

我们还需要将容器中的端口暴露给 Docker 主机,以便我们可以从外部世界与容器中的应用程序进行通信。我们将以 InfluxDB v2 为例。数据库默认通过端口 8086 进行通信。使用发布标志 --publish-p,并将以下两行添加到我们的 docker run 命令中以暴露端口

-p 8086:8086

持久存储

接下来,我们需要决定希望配置文件存储在哪里,以及对于需要容器数据的那些容器,我们将数据存储在哪里。

继续构建我们的 InfluxDB 运行命令,数据库期望它可以访问 Linux 上的一个文件位置 /root/.influxdb2,它在其中存储其数据和配置。可以自定义这些位置,但对我们来说,默认值就足够了。

我们将通过将卷标志 --volume-v 添加到 docker run,将本地文件夹挂载到容器中的这些位置。如果您愿意,您可以让 Docker 为您管理 ,但是绑定本地机器上的文件夹可以确保我们能够从主机操作系统访问数据。

Docker 主机上的绑定点将根据您运行的机器而有所不同。为了举例说明,我们假设在用户的主目录中有一个名为 influxdb 的文件夹,并且其中有两个名为 data 和 config 的子文件夹。我们将提供以下参数以将这两个文件夹挂载到容器内部

-v  /tmp/testdata/influx:/root/.influxdb2

汇总起来:在网络上的容器中运行 InfluxDB

我们即将启动我们的第一个容器。我们只需要在 docker run 命令中添加一些内容。我们将使用 -d 标志在“分离”模式下启动容器,这会在后台运行它,并且我们将使用 --name 参数为其命名。最后,我们将运行最新版本的 influxdb 容器。

docker run -d --name=influxdb \
 -p 8086:8086 \
 -v  /tmp/testdata/influx:/root/.influxdb2 \
      --net=influxdb-telegraf-net \
      influxdb:2.0

成功运行命令后,您应该看到生成的容器 ID,例如

8d868d437d5444c4ce0db04f208939843113db651a3729ce3c924bd11df19d38

接下来,我们将以类似的方式运行 Telegraf 容器。但在执行此操作之前,我们需要配置我们的 InfluxDB 实例。

配置您的 InfluxDB 2.0 实例

配置 InfluxDB 2.0-r.c. 实例的最简单方法是通过 UI。访问 http://localhost:8086 完成设置并收集必要的授权凭据。要使用 Telegraf 将数据写入 InfluxDB,您需要

您还可以使用 InfluxDB CLI 完成设置。要在容器本身内启动 CLI,您需要 docker exec 命令。它使您能够运行交互式会话。分别提供 -io-t 参数以创建交互式会话并分配伪 TTY。influx setup 命令允许您使用 CLI 交互式地设置 InfluxDB 实例。

使用以下命令在我们的 influxdb 容器中执行 influx CLI

$ docker exec -it influxdb influx setup

管理您的 Telegraf 配置

收集以上所有凭据后,我们可以配置 Telegraf 配置的输出部分。它看起来像这样

[[outputs.influxdb_v2]]
 ## The URLs of the InfluxDB cluster nodes.
 ##
 ## Multiple URLs can be specified for a single cluster, only ONE of the
 ## urls will be written to each interval.
 ## urls exp: http://127.0.0.1:8086
 urls = ["http://influxdb:8086"]

 ## Token for authentication.
 token = "$DOCKER_INFLUXDB_INIT_ADMIN_TOKEN"

 ## Organization is the name of the organization you wish to write to; must exist.
 organization = "$DOCKER_INFLUXDB_INIT_ORG"

 ## Destination bucket to write into.
 bucket = "$DOCKER_INFLUXDB_INIT_BUCKET"

另请注意,我们必须将 url 从 localhost 更改为 influxdb,这是运行 InfluxDB 2.0-r.c 的容器的名称。此更改将允许我们的 telegraf 容器通过网络与 influxdb 容器通信。

挂载 Telegraf 配置文件

接下来,我们需要决定希望配置文件存储在哪里,以及对于需要容器数据的那些容器,我们将数据存储在哪里。

开始构建我们的 telegraf 运行命令,代理期望它可以访问 Linux 上的文件位置 /etc/telegraf/telegraf.conf,它在其中存储其 telegraf 配置。可以自定义这些位置,但对我们来说,默认值就足够了。

我们将通过将卷标志 --volume-v 添加到 docker run,将本地文件夹挂载到容器中的这些位置。如果您愿意,您可以让 Docker 为您管理 ,但是绑定本地机器上的文件夹可以确保我们能够从主机操作系统访问数据。

Docker 主机上的绑定点将根据您运行的机器而有所不同。为了举例说明,我们假设在 lizzo 用户的主目录中有一个 Telegraf 配置。我们将提供以下参数以将此配置挂载到运行 Telegraf 的容器内部

-v /mytelegrafconfigsdir/telegraf.conf:/var/lib/influxdb

汇总起来:将运行 Telegraf 的容器添加到我们的网络

我们即将启动我们的第一个容器。我们只需要在 docker run 命令中添加一些内容。我们将使用 -d 标志在“分离”模式下启动容器,这会在后台运行它,并且我们将使用 –name 参数为其命名。最后,我们将运行最新版本的 telegraf 容器。

docker run -d --name=telegraf \
      -v /mytelegrafconfigsdir/telegraf.conf:/var/lib/influxdb \
      --net=influxdb-telegraf-net \
      telegraf

继续在命令行中运行它。如果成功,它应该返回一个唯一的哈希值,用于标识正在运行的容器,就像之前一样。

操作容器

现在我们已经有了一个正在运行的容器,让我们来谈谈一些额外的操作细节。我们通常需要检查的第一件事是我们的容器是否正在运行。为此,我们可以使用 docker ps 命令

$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                          NAMES
e0be3cb0de4b        telegraf                             "/entrypoint.sh tele…"   10 minutes ago      Up 10 minutes       8092/udp, 8125/udp, 8094/tcp   telegraf
8d868d437d54        quay.io/influxdb/influxdb:2.0.0-rc   "/entrypoint.sh infl…"   12 minutes ago      Up 12 minutes       0.0.0.0:8086->8086/tcp         influxdb

太棒了!我们的容器已启动并正在运行。但是,也许它们的行为不如我们预期的那样?我们可能需要深入研究并查看日志。我们可以使用 docker logs 命令并提供容器的名称来获取这些日志。我们还将添加 -f 参数。此 follow 命令将继续流式传输来自容器 STDOUT 和 STDERR 的新输出。在调试期间,接收所有 Telegraf 日志可能非常有用。此外,如果您在将数据写入 InfluxDB 时遇到问题,您可能会受益于在 Telegraf 配置的 agent 部分中设置 debug=true。该命令如下所示

$ docker logs telegraf -f

Docker Compose

Docker Compose 是“一种用于定义多容器 Docker 应用程序的工具”。它使我们能够启动多个容器并自动将它们连接在一起,我们可以使用它来帮助我们更轻松地部署和管理完整的 TICK Stack。我们将首先在 docker-compose.yml 文件中定义 TICK Stack 的各个服务,然后使用 Compose 命令行工具部署这些服务。

以下是一个 docker-compose.yml 示例(使用 Compose 文件格式版本 3),它定义了三个服务:influxdbinfluxdb_clitelegraf

version: '3'

services:
  influxdb:
    image: influxdb:2.6-alpine
    env_file:
      - influxv2.env
    volumes:
      # Mount for influxdb data directory and configuration
      - influxdbv2:/var/lib/influxdb2:rw
    ports:
      - "8086:8086"
  telegraf:
    image: telegraf:1.25-alpine
    depends_on:
      - influxdb
    volumes:
      # Mount for telegraf config
      - ./telegraf/mytelegraf.conf:/etc/telegraf/telegraf.conf:ro
    env_file:
      - influxv2.env

volumes:
  influxdbv2:

要部署这些服务,请运行 docker-compose up -d(与 docker run 类似,-d 参数在无头“分离”模式下启动容器)。docker-compose 使用执行它的目录来命名它管理的各种组件,因此将您的 docker-compose.yml 文件放入一个命名良好的目录是一个好主意。对于本示例,我们将把我们的 docker-compose.yml 文件放在一个名为 influxv2 的目录中。

运行 docker-compose up -d 将执行多项操作:首先,它将创建一个名为 influxv2_default 的新 Docker 网络,然后它将为我们定义的每个服务启动一个容器,分别命名为 influxv2_influxdb_1influxv2_influxdb_cli_1influxv2_telegraf_1

$ docker-compose up -d
[+] Running 3/3
 ⠿ Network influxdbv2_telegraf_docker_default       Created                0.0s
 ⠿ Container influxdbv2_telegraf_docker-influxdb-1  Started                0.4s
 ⠿ Container influxdbv2_telegraf_docker-telegraf-1  Started                0.7s
$ docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                    PORTS                          NAMES
e6d60ddc155e   telegraf:1.25-alpine   "/entrypoint.sh tele…"   39 seconds ago   Up 37 seconds             8092/udp, 8125/udp, 8094/tcp   influxdbv2_telegraf_docker-telegraf-1
086e06ca4416   influxdb:2.6-alpine    "/entrypoint.sh infl…"   39 seconds ago   Up 38 seconds             0.0.0.0:8086->8086/tcp         influxdbv2_telegraf_docker-influxdb-1
         influxdb

您应该能够通过访问 http://localhost:8086 导航到 InfluxDB UI,并通过输入您的用户名和密码(myu,如 influx setup 命令在 influxdb_cli 服务中 entrypoint 定义中所定义)登录。具体来说,您将分别使用 myusernamepasswordpasswordpassword 作为用户名和密码。请记住,您的密码必须至少为 8 个字符

最后,确保您的 InfluxDB 设置参数与您的 Telegraf 配置参数匹配。例如,mytelegraf.conf 的输出部分将如下所示

# Output Configuration for telegraf agent
[[outputs.influxdb_v2]]	
  ## The URLs of the InfluxDB cluster nodes.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  ## urls exp: http://127.0.0.1:8086
  urls = ["http://influxdb:8086"]

  ## Token for authentication.
  token = "$DOCKER_INFLUXDB_INIT_ADMIN_TOKEN"

  ## Organization is the name of the organization you wish to write to; must exist.
  organization = "$DOCKER_INFLUXDB_INIT_ORG"

  ## Destination bucket to write into.
  bucket = "$DOCKER_INFLUXDB_INIT_BUCKET"

  insecure_skip_verify = true

总结

不要忘记清理您在学习本博客文章时创建的任何容器!使用 docker stopdocker rm 命令来执行此操作。使用 Docker 时需要注意的另一件事是容器镜像本身。Docker 镜像不会自动删除,因此随着时间的推移,当您升级正在使用的软件版本时,旧容器可能会积累并开始占用磁盘空间。有一些脚本可以为您管理此问题,但在大多数情况下,只需意识到潜在问题并偶尔手动清理一下就足够了。

与此博客相关的代码可以在这个 repo 中找到。

我希望您觉得这篇博客有用。如果您有任何问题或产品反馈,请将它们发布在社区站点Slack 频道或在 Twitter 上 @InfluxDB 告诉我们。谢谢!