使用Docker运行InfluxDB 2.0和Telegraf

导航到

此帖子最初于2021年1月发布,我们努力使其保持相关性,于2022年12月进行了更新。

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

虽然Docker的热潮已经消退,被新的词汇如“Kubernetes”和“Serverless”所取代,但无可争议的是,Docker仍然是希望开始使用Linux容器的开发者的默认工具链,因为它相当普遍并且与各种平台紧密集成。

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

如果您想了解更多关于容器的内容,我强烈推荐阅读Julia Evans的《究竟什么是容器》。

个人来说,我在桌面上运行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

该命令使用桥接驱动程序创建一个新的网络,并将其命名为influxdb-telegraf-net

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

--network influxdb-telegraf-net

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

-p 8086:8086

持久存储

接下来,我们需要决定配置文件想要存储的位置,以及我们将存储需要它的容器的容器数据。

在构建InfluxDB的运行命令的过程中,数据库期望它将在Linux上有一个文件位置/root/.influxdb2,它将在此处存储数据和配置。可以自定义这些位置,但对我们来说,默认值已经足够。

我们将通过在docker run中添加卷标志--volume-v将本地文件夹挂载到这些位置。如果您愿意,可以允许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。访问https://127.0.0.1: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 配置。您可以将这些位置进行自定义,但对我们来说,默认值已经足够。

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

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

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

整合一切:将运行 Telegraf 的容器添加到我们的网络中

我们几乎准备启动第一个容器。我们只需要在我们的 docker run 命令中添加一些更多的事情。我们将使用 -d 标志以“分离”模式启动容器,在后台运行,并使用 –name 参数给它命名。最后,我们将运行最新版本的 influxdb 容器。

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 配置的代理部分设置 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_1,influxv2_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

您应该能够通过访问 https://127.0.0.1:8086 来导航到 InfluxDB UI,并通过传递 entrypoint 定义中定义的用户名和密码进行登录(myu 由 influx setup 命令定义)。具体来说,您将使用 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 镜像不会自动删除,因此随着时间的推移,当您升级使用的软件版本时,旧的容器可能会积累并开始消耗磁盘空间。有一些脚本可以帮助您管理这些,但大部分情况下,仅仅意识到潜在的问题并偶尔手动清理就足够了。

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

希望您觉得这篇博客很有用。如果您有任何问题或产品反馈,请在 社区网站Slack 频道或通过 @InfluxDB 推文给我们。谢谢!