# prometheus + grafana+cAdvisor监控容器

监控容器的运行状态我们需要使用下面三个组件：

**cAdvisor (Container Advisor) :** 用于收集正在运行的容器资源使用和性能信息。 `https://github.com/google/cadvisor`

**Prometheus(普罗米修斯):** 容器监控系统。 `https://prometheus.io` `https://github.com/prometheus`

&#x20;**Grafana:** 是一个开源的度量分析和可视化系统。 `https://grafana.com/grafana`

如果要通过上面三个组件对容器进行监控，我们需要先执行下面三个步骤：

第一步：安装**cAdvisor**容器镜像

`docker run -d \`\
&#x20;`--volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \`\
&#x20;`--detach=true \`\
&#x20;`--name=cadvisor \`\
&#x20;`google/cadvisor:latest`

第二步：安装**grafana**容器镜像

`docker run -d  --name=grafana  -p 3000:3000  grafana/grafana`

第三步：安装**promethous**容器镜像

`docker run -d  --name=prometheus -p  9090:9090 prom/prometheus`

第四步： 查看三个容器是否运行正常。

```
liuyang@liuyangdeiMac ~ % docker ps -f name=prometheus -f name=grafana -f name=cadvisor --format="table {{.Names}}\t{{.Status}}\t{{.Ports}}"
NAMES        STATUS                 PORTS
prometheus   Up About an hour       0.0.0.0:9090->9090/tcp
grafana      Up 3 hours             0.0.0.0:3000->3000/tcp
cadvisor     Up 4 hours (healthy)   0.0.0.0:8080->8080/tcp
```

第五步： 通过浏览器访问\*\*<http://localhost:8080>, <http://localhost:9090>, [http://localhost:3000\*\*分别可以看到图片中显示的内容：](https://camelgemonion.gitbook.io/docker/rong-qi-jian-kong-fang-shi/http:/localhost:3000**分别可以看到图片中显示的内容：)

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqPbkmNliK32RVLWKc%2F-MVqbDLgxiU53yo9Djxx%2F%E6%88%AA%E5%B1%8F2021-03-15%20%E4%B8%8B%E5%8D%8811.58.42.png?alt=media\&token=456227cd-f727-4c44-95e2-0cf9113a9a6b)

上面的页面表示**cAdvisor**运行正常，并正确采集到了数据。**cAdvisor**在采集数据时，除了采集**docker**容器的数据，也会采集运行**docker**的主机的数据。这里我们点&#x51FB;**/docker**来进入到**docker**的数据页面：

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqPbkmNliK32RVLWKc%2F-MVqc2dsgae22YRn82ZC%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.02.27.png?alt=media\&token=e0af865a-ae24-4d96-a2ff-8f43d99fa1fb)

上面罗列出来的就是我们运行在我们主机上的容器。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqPbkmNliK32RVLWKc%2F-MVqcTQELJ__Uvyp0dBM%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.04.38.png?alt=media\&token=c374498c-df66-48be-91d8-5cdff6b96e64)

上图为**prometheus**的图形界面。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqPbkmNliK32RVLWKc%2F-MVqcuUCfHbrHt3OJwEI%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.06.34.png?alt=media\&token=96c62f45-165b-46f9-bd46-99f316da4fce)

上图为**grafana**的图形监控界面。

如果能正常访问上面三个页面，表明我们的容器运行正常。接下来进行第六步。

第六步：通过下面的**docker**指令进入**prometheus**的容器内部，修改它的配置文件：

```
docker exec -it  bf99 /bin/sh
```

进入容器以后，修改`/etc/prometheus/prometheus.yml`配置文件。

```
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'docker'
    static_configs:
    - targets: ['169.254.239.63:8080']
```

在文件中，我们在指定位置添加一个新的任务，如上所示。添加完毕以后退出容器，执行下面的命令来重启容器：

```
docker restart bf99
```

重启以后，通过之前相同的检查手段来确保容器重启成功，防止配置文件语法错误等导致容器异常退出。

**Note：在修改prometheus配置文件时，主机targets中的ip地址必须填主机的ip地址，而不是localhost，否则会导致prometheus无法从cAdvisor获取到数据，因为使用localhost或者127.0.0.1都是去访问普罗米修斯容器的本身；我们要使用宿主机ip+端口。**

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqe1qM2YsK0ea3rfej%2F-MVqfLcuzXqVhC3w08MJ%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.17.14.png?alt=media\&token=4757caac-df35-4a4d-adc3-e1eded53150c)

当上图中的**targets**状态都为**up**时，表明**prometheus**能够正常与目标服务器进行通信并在指定的**ip地址和端口**上获取它的数据。

第七步：确保数据能够成功抓取以后，我们就可以开始使用**grafana**来图形化的显示抓取到的数据。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqgPK4o7CYJ8p8-sso%2F-MVqgajNOePutnDEyM5U%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.22.41.png?alt=media\&token=3872d078-550c-4582-80ed-fcde75b8ca1f)

根据图中所示对**grafana**进行配置，将prometheus作为它的数据源。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqgPK4o7CYJ8p8-sso%2F-MVqgu0Loy8MNONxJQ2t%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.24.00.png?alt=media\&token=0db7a136-86b4-492b-9176-2146e5027444)

在上图中相应的位置填好数据并保存。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqgzgNz4lu8xXwcQD5%2F-MVqhvYzhJCJh1LgqiJU%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.28.29.png?alt=media\&token=7213d936-e2ca-4008-9e7e-f6e2e99f7e1b)

配置好以后创建一个Dashboard。

![](https://3635233293-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVjOb1Mk_y7lcQcI_LJ%2F-MVqgzgNz4lu8xXwcQD5%2F-MVqix-HGmfe4nG5IWRP%2F%E6%88%AA%E5%B1%8F2021-03-16%20%E4%B8%8A%E5%8D%8812.32.58.png?alt=media\&token=28857a13-ab2f-4d20-8c08-2eba2707f2dc)

在图中**Metrics**空格中填入相应的promql语句来获取想要现实的数据。上图显示了**cpu**的相关数据。除了自己创建**Dashboard**，我们也可以从**grafana**官网来导入别人已经配置好的**Dashboard**。具体参考**grafana**官方网站。

通过上面的步骤我们完整的演示了如何通过**grafana+prometheus+cAdvisor**来监控容器的运行指标。

在这里我们通过启动三个容器来配置这些服务。为了减少麻烦，我们也可以将三个容器的配置信息直接写入**docker-compose.yaml**文件中，通过**Compose**来对容器进行管理。
