InfluxData Docker on ARM

导航至

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

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

这意味着InfluxData堆栈可以在树莓派等平台上直接使用Docker运行。如果您想在家中低成本、易设置的电脑上进行监控,这再合适不过了!在本篇文章中,我们将要在自己的笔记本电脑上运行InfluxDB,并配置一个Telegraf实例,通过本地网络向笔记本电脑报告。

所需物品

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

在笔记本电脑上安装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。现在,尝试使用您的电脑的网页浏览器访问Chronograf。如果您在电脑上直接运行Docker,这应该像访问https://127.0.0.1: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.exeipconfig来查找您的本地IP地址。

记住,您想要的是路由器分配给电脑的IP地址,而不是直接指向互联网的公共IP地址。大多数家庭网络的网络地址以192.168.*.*开始,但有些也可能以10.*.*.*172.*.*.*开始。

启动树莓派

将树莓派连接到您的路由器。如果您从未安装过操作系统,我建议使用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。

Raspberry 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://127.0.0.1:8089"] # UDP endpoint example
  urls = ["https://127.0.0.1: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://127.0.0.1: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)。由于这个限制,Dockerfile支持在armel上构建,但我们不会将这些镜像上传到官方仓库。如果您需要使用Docker镜像并且架构为armel,可以从源代码构建镜像这里

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

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