通过 Docker 部署 Grafana 和 Prometheus

11 Feb 2018

目前的系统监控领域,Grafana + Prometheus 的方案得到了很多人的追捧。不得不承认第一眼看到 Grafana 的 dashboard,很难让人把它跟开源项目联系起来,真的是太!漂!亮!了!

这两个项目都提供了官方的 docker 部署方案,我们就以 docker 容器的方式进行部署。

基础环境

无论是把两个 app 部署在同一台 docker 主机还是分布在两台甚至多台主机,都是 OK 的,操作也基本上没有区别。由于我的部署环境为内网,所以采取了先在互联网下载镜像,然后在容器服务器上离线安装的方式。

获取镜像

考虑到版本管理和将来升级,不建议直接抓取镜像的 latest 版本。可以在 Docker Store 上查看镜像当前的最新版本 tag 号。比如此时两个镜像的最新稳定版本分别为:

实际操作中下面的命令应根据查询到的版本进行修订。当然用旧版本也是可以的。

docker pull prom/prometheus:4.6.3
docker pull grafana/grafana:v2.1.0
docker pull busybox:latest

docker save prom/prometheus > prom463.tar.gz
docker save grafana/grafana > grafana210.tar.gz
docker save busybox > busybox.tar.gz

导入镜像

上面导出的这三个包,prom463 是用作 Prometheus 服务的,grafana210 和 busybox 是用作 Grafana 服务的。对于 Prometheus 容器主机:

docker image load < prom463.tar.gz

对于 Grafana 容器主机:

docker image load < grafana210.tar.gz
docker image load < busybox.tar.gz

容器部署

Prometheus 服务

在 Prometheus 容器主机上,我们采取本地持久存储卷来保存 Prometheus 的配置与数据。这样做的好处是数据与配置可以在容器主机上比较方便地进行修改、备份,容器实例本身并不保存任何数据,可以做到随用随弃,便于升级。

首先创建一个本地目录用作持久化卷:

sudo mkdir /prometheus-data

然后在该目录下创建 Prometheus 配置文件 prometheus.yml,例如官方提供的示例内容如下:

```yaml /prometheus-data/prometheus.yml global: scrape_interval: 15s

external_labels: monitor: ‘codelab-monitor’

scrape_configs:

接着就可以启动 Prometheus 容器了(官网的命令有误):

docker run \
  -d \
  -p 9090:9090 \
  --name=prometheus \
  -v /prometheus-data:/prometheus-data \
  prom/prometheus:4.6.3 \
  --config.file=/prometheus-data/prometheus.yml

docker ps 命令可以确定容器启动成功。容器外部暴露端口不一定非得是 9090,可以自由变更。

Grafana 服务

类似的,我们也采取本地持久卷的方式存储 Grafana 的数据。官网推荐使用 busybox 提供卷服务。假设持久化卷位于 /grafana:

sudo mkdir /grafana
docker run \
  -d \
  -v /grafana \
  --name grafana-storage
  busybox:latest

之后启动 Grafana 服务。由于访问 Grafana 网页服务比较频繁,我在这里直接对外暴露容器主机的 80 端口,可以免去每次在地址后输入 :3000 的麻烦。

docker run \
  -d \
  -p 80:3000 \
  --name=grafana \
  --volumes-from grafana-storage \
  grafana/grafana:v2.1.0

在浏览器访问本机 IP 地址,不用任何冒号后缀,如果能显示 Grafana 的登录界面,就表示部署成功啦。

Prometheus 与 Grafana 的集成

To Be Continu’d.