InfluxData Docker on ARM

导航至

最初,Docker 仅支持 amd64 架构,并且只能在 Linux 上运行。后来,Docker 开始支持不同的架构,例如 Windows 64 位和 ARM。您可以在这些平台上运行 Docker,但镜像支持一直在不断完善中。长期以来,一些镜像会创建一个分支来支持 armhf,但这样您就必须为 armhf 架构单独打标签。由于 Docker 默认拉取 latest 标签,因此运行类似 docker pull ubuntu 的命令不会拉取正确的架构。

Docker 最近为注册表创建了一种新的 manifest 格式,允许多个不同架构的镜像共享同一个标签。我们的一位用户 @longquan 在我们的 Docker 镜像上提出了一个 pull request,提供了一种使用单个 Dockerfile 构建多种架构的方法。我们采纳了这个 pull request,并在 @jcberthon 的额外帮助下,合并了对 ARMv7 32 位和 ARMv8 64 位的支持。

这意味着 InfluxData 堆栈可以在 Raspberry Pi 等平台上开箱即用地通过 Docker 运行。如果您想要一台廉价且易于设置的计算机来监控家中的某些事物,这将是完美的!在这篇文章中,我们将在自己的笔记本电脑上运行 InfluxDB,并配置一个 Telegraf 实例,以通过本地网络向我们的笔记本电脑报告数据。

您需要的物品

  • Raspberry Pi
  • 一台电脑(例如笔记本电脑)
  • 一个路由器,两台电脑都连接到同一个路由器
  • 互联网连接

在笔记本电脑上安装 Docker

请按照 Docker 文档 中相应的说明在您的笔记本电脑上安装 Docker。我使用的是 Mac OS X,因此我使用 docker-machine 作为虚拟机。

在您的计算机上安装 Docker 后,请使用 ping 命令验证其工作正常,然后拉取 InfluxDB 镜像。

$ docker ping
$ docker pull influxdb

现在我们可以用几个简单的命令在笔记本电脑上运行 InfluxDB 和 Chronograf。

# Create a shared network for influxdb and chronograf to communicate over.
$ docker network create influxdb
# Launch the influxdb image.
$ docker run -d --name=influxdb --net=influxdb -p 8086:8086 influxdb
# Launch the chronograf image.
$ docker run -d --name=chronograf --net=influxdb -p 8888:8888 chronograf --influxdb-url http://influxdb:8086

我们创建一个共享网络,供 influxdb 和 chronograf 在其上通信。虽然看起来很复杂,但这简化了两个容器的网络连接。然后,我们使用此网络启动每个镜像,并暴露需要暴露给外部世界的端口。对于 InfluxDB,这是端口 8086。对于 Chronograf,这是 8888。现在,尝试使用您计算机的 Web 浏览器访问 Chronograf。如果您在计算机上本地运行 Docker,则只需访问 http://localhost:8888 即可。如果您使用 docker-machine (例如在 Mac OS X 上),您可以使用我为本次演示创建的 https://github.com/jsternberg/docker-machine-proxy。它会将端口从 Docker Machine 代理到 localhost,以便计算机之间的网络连接正常工作。

当一切正常,您可以访问 localhost 上的 Chronograf 时,您应该看到 Chronograf 仪表板,并且 Chronograf 应该显示未找到主机。

在我们添加主机之前,还有一件事我们必须做。

检索 IP 地址

检索您的路由器为您的计算机分配的 IP 地址。如果您使用的是 Linux 或 Mac OS X,可以使用 ifconfig 命令。以下是我的输出示例:

> ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether ac:bc:32:cd:96:f3
        inet6 fe80::1c:121a:e9d5:fe98%en0 prefixlen 64 secured scopeid 0x4
        inet6 2605:6000:1522:c065:854:a83:ba74:7e05 prefixlen 64 autoconf secured
        inet6 2605:6000:1522:c065:9c91:edf6:d09a:e266 prefixlen 64 autoconf temporary
        inet 192.168.1.113 netmask 0xffffff00 broadcast 192.168.1.255
        nd6 options=201<PERFORMNUD,DAD>
        media: autoselect
        status: active
en1: flags=963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX> mtu 1500
        options=60<TSO4,TSO6>
        ether 6a:00:01:52:70:20
        media: autoselect <full-duplex>
        status: active

en0 接口是唯一看起来有 IP 地址的接口,因此我们将在此示例中使用 192.168.1.113。对于您自己的计算机,您需要使用您自己的 IP 地址!我是在 Mac OS X 上运行此命令,因此如果您使用的是其他操作系统,接口名称可能会有所不同。在 Windows 计算机上,您可以使用 cmd.exe 和 ipconfig 来查找您的本地 IP 地址。

请记住,您需要的是路由器分配给计算机的 IP 地址。您不需要您连接到互联网的公共 IP 地址。大多数家庭网络的网络都以 192.168.*.* 开头,但有些也可能以 10.*.*.* 或 172.*.*.* 开头。

启动您的 Raspberry Pi

将您的 Raspberry Pi 连接到您的路由器。如果您从未安装过操作系统,我建议使用 Raspbian。它易于安装和使用,也是我本文中使用的系统。

然后,您可以运行以下命令来安装 Docker。首先,下载 Docker 提供的用于简化操作的脚本。

$ curl https://get.docker.com > get-docker.sh
$ sudo bash get-docker.sh

此命令完成后,您将在输出中看到类似这样的消息:

If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

  sudo usermod -aG docker pi
  
Remember that you will have to log out and back in for this to take effect!

还会有更多信息和一个警告。如果您计划在生产环境中使用,并且安全是您必须考虑的事项,则最好跳过此步骤。为了我们的目的,我们将输入上面的命令,这样我们就不必在 docker 命令前键入 sudo 了。运行上面的命令,然后重启您的 Raspberry Pi。

Pi 重新启动并运行后,再次打开终端并运行以下命令:

$ docker run --rm telegraf telegraf config > telegraf.conf

您刚刚在 Raspberry Pi 上首次运行了 Telegraf!但我们还没有完全完成。我们生成了一个配置文件。打开 telegraf.conf 并转到 [[outputs.influxdb]] 部分。它应该看起来像这样:

[[outputs.influxdb]]
  ## The HTTP or UDP URL for your InfluxDB instance.  Each item should be
  ## of the form:
  ##   scheme "://" host [ ":" port]
  ##
  ## Multiple urls can be specified as part of the same cluster,
  ## this means that only ONE of the urls will be written to each interval.
  # urls = ["udp://localhost:8089"] # UDP endpoint example
  urls = ["http://localhost:8086"] # required
  ## The target database for metrics (telegraf will create it if not exists).
  database = "telegraf" # required

修改 urls 选项,使其看起来像这样,但替换为您之前找到的您自己的 IP 地址:

[[outputs.influxdb]]
  ## The HTTP or UDP URL for your InfluxDB instance.  Each item should be
  ## of the form:
  ##   scheme "://" host [ ":" port]
  ##
  ## Multiple urls can be specified as part of the same cluster,
  ## this means that only ONE of the urls will be written to each interval.
  # urls = ["udp://localhost:8089"] # UDP endpoint example
  urls = ["http://192.168.1.13:8086"] # required
  ## The target database for metrics (telegraf will create it if not exists).
  database = "telegraf" # required

现在我们需要使用我们的自定义配置文件执行 Telegraf。

$ docker run -d --name=telegraf -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro telegraf

现在请稍等片刻。如果您想检查 Telegraf 是否正常工作,可以使用 docker logs -f telegraf 命令,它会跟随日志消息。您可能需要刷新 Chronograf 页面。如果一切顺利,您应该会看到您的 Raspberry Pi 以及来自 Raspberry Pi 上容器的指标正在传入!

虽然此演示展示了如何在 Raspberry Pi 上使用 Telegraf,但所有 InfluxData 产品现在都支持在 ARM 上通过 Docker 运行它们。

帮助和注意事项

对于那些使用没有原生浮点支持的旧 ARM 架构的用户,docker pull 将无法工作。这是因为 Docker 中的多架构支持仍在进行中。从 ARM 32 位 (armhf) 拉取时,它可能会拉取使用模拟浮点支持 (armel) 构建的版本。由于此限制,Dockerfiles 支持在 armel 上构建,但我们不会将这些镜像上传到官方存储库。如果您需要使用 Docker 镜像并且您的架构是 armel,您可以从源代码 此处 构建镜像。

要确定您拥有的架构,您可以运行 dpkg --print-architecture 命令。如果您看到 armhf,那就是我们上传并支持的架构。如果您看到 armel,那就是您需要从源代码构建的架构。

对于需要帮助的用户,请访问我们的 https://community.influxdata.com 网站。如果您认为镜像存在问题,请在 repository 中提交错误报告。