Navigation
  • Print
  • Share
  • Copy URL
  • Breadcrumb

    Docker 配置监控管理系统

    本文讲解了使用 Docker 配置 Prometheus+Alertmanager+Grafana+Mysql

    Ash

    Prometheus

    1、下载镜像包:

    docker pull prom/prometheus
    

    2、配置 Prometheus

    mkdir /opt/prometheus
    cd /opt/prometheus/
    vim prometheus.yml
    
    #opt是linux中存放第三方软件的文件夹
    

    内容如下:

    global:
      scrape_interval:     60s
      evaluation_interval: 60s
    
    
    scrape_configs:
    
      - job_name: prometheus
        static_configs:
          - targets: ['localhost:9090']
            labels:
              instance: prometheus
    
      - job_name: Data
        static_configs:
          - targets: ['192.168.37.184:5000']	#python中对应的端口号是5000,所以从主机5000端口接收数据
            labels:
              instance: Data
    
    alerting:
      alertmanagers:
        - static_configs:
          - targets: ['172.17.0.1:9093']	#这里的ip是docker的ip地址,也可以改为宿主机的ip地址,但对应暴露的端口号也要改变
    
    rule_files:
      - rules.yml
    

    3、配置 rules.yml,即 alert 的规则

    vim /opt/prometheus/rules.yml
    

    内容如下:

    groups:
      - name: server-alarm
        rules:
          - alert: "内存告警"
            expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
            for: 1m
            labels:
              severity: warning
            annotations:
              summary: "{{$labels.instance}}: 检测到 高内存 使用率!"
              description: "{{$labels.instance}}: 内存使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
          - alert: "CPU告警"
            expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[2m])) by(instance)) * 100 > 80
            for: 1m
            labels:
              severity: warning
            annotations:
              summary: "{{$labels.instance}}: 检测到 高CPU 使用率!"
              description: "{{$labels.instance}}: CPU使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
          - alert: "磁盘告警"
            expr: 100 - (node_filesystem_free_bytes{fstype=~"tmpfs|ext4"} / node_filesystem_size_bytes{fstype=~"tmpfs|ext4"} * 100) > 5
            for: 1m
            labels:
              severity: warning
            annotations:
              summary: "{{$labels.instance}}: 检测到 高磁盘 使用率!"
              description: "{{$labels.instance}}: 磁盘使用率在 80% 以上 (当前使用值为:{{ $value }})"
    
          - alert: "InstanceUp"
            expr: up == 1
            for: 1m
            labels:
              severity: warning
            annotations:
              summary: "{{ $labels.instance }}"
              description: "{{ $labels.instance }} of job {{ $labels.job }} has been up for more than 1 minutes."
    

    4、网络准备

    因为需要在本地运行两个容器,且两个容器需要互相能否访问,所以这里创建一个 network。

    docker network create prom
    

    查看:

    [root@centos01 ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    086bf47d28da   bridge    bridge    local
    19357bf4da6f   host      host      local
    14df82a9ab10   none      null      local
    e09f984b92bc   prom      bridge    local
    
    [root@centos01 ~]# docker inspect e09f984b92bc
    [
        {
            "Name": "prom",
            "Id": "e09f984b92bc77fcaa9b5c6b1090938dde918f739b5eb67a18e56eb1f8c4eead",
            "Created": "2022-07-13T15:02:27.09181599+08:00",
            "Scope": "local",
            "Driver": "bridge",
            "EnableIPv6": false,
            "IPAM": {
                "Driver": "default",
                "Options": {},
                "Config": [
                    {
                        "Subnet": "172.18.0.0/16",
                        "Gateway": "172.18.0.1"
                    }
                ]
            },
            "Internal": false,
            "Attachable": false,
            "Ingress": false,
            "ConfigFrom": {
                "Network": ""
            },
            "ConfigOnly": false,
            "Containers": {},
            "Options": {},
            "Labels": {}
        }
    ]
    

    5、启动 Prometheus

    docker run  -d --name prometheus --restart=always -p 9090:9090 -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v  /opt/prometheus/rules.yml:/etc/prometheus/rules.yml  prom/prometheus
    

    AlertManager

    环境配置及运行

    1、准备镜像

    docker pull prom/alertmanager
    

    2、Alertmanager 配置:

    • 先用 docker 将其运行起来
    docker run -d --name alertmanager --network prom -p 9093:9093 prom/alertmanager
    
    • 再将容器中的的 alertmanager 文件夹复制到宿主机内的/opt/alertmanager 中
    docker cp alertmanager:/etc/alertmanager /opt/alertmanager
    
    • 修改 alertmanager.yml 配置文件
    vim /opt/alertmanager/alertmanager.yml
    

    如下: alertmanager 配置详解 match_re 可以用正则表达式匹配

    global:
      resolve_timeout: 5m
      smtp_smarthost: "xxxx"
      smtp_from: "xxxx"
      smtp_auth_username: "xxxx"
      smtp_auth_password: "xxxx"
      smtp_require_tls: false
    
    route:
      group_by: ["IP", "alertname"]
      group_wait: 20s
      group_interval: 5m
      repeat_interval: 30m
      receiver: Test
      routes:
        - match:
            IP: xxxx|xxxx
          receiver: Tom
        - match:
            IP: xxxx|xxxx|xxxx
          receiver: Corey
        - match:
            IP: xxxx
          receiver: Ash
        - match_re:
            system_name: ".*Kirk.*"
          receiver: Kirk
    
    receivers:
      - name: "Tom"
        email_configs:
          - to: "123@qq.com"
            send_resolved: true
    
      - name: "Corey"
        email_configs:
          - to: "222@qq.com"
            send_resolved: true
    
      - name: "Ash"
        email_configs:
          - to: "333@qq.com"
            send_resolved: true
    
      - name: "Kirk"
        email_configs:
          - to: "444@qq.com"
            send_resolved: true
    
    inhibit_rules:
      - source_match:
          severity: "critical"
        target_match:
          severity: "warning"
        equal: ["alertname", "dev", "instance"]
    
    • 把宿主机的文件夹挂载到容器上,再运行,这样修改宿主机的 yml 文件就能容器内文件也对应改变
    docker run -itd --name alertmanager -p 9093:9093 -v /opt/alertmanager:/etc/alertmanager prom/alertmanager
    

    Grafana

    1、拉取镜像

    docker pull grafana/grafana
    

    新建空文件夹 grafana-storage,用来存储数据

    mkdir /opt/grafana-storage
    

    2、添加权限

    chmod 777 -R /opt/grafana-storage
    

    3、启动 grafana

    docker run -d --name grafana --restart=always -p 521:3000 --name=grafana -v /opt/grafana-storage:/var/lib/grafana grafana/grafana
    

    4、访问 url:

    http://ip:521/

    5、登陆

    默认的用户密码都是:admin

    移植

    将/var/lib/grafana 下的:

    • plugins 文件夹
    • grafana.db 文件

    复制到新的 grafana 上面就行

    Mysql

    安装和配置

    1、安装 mysql

    docker pull mysql
    

    2、创建必要的文件夹

    cd /opt # 我的软件都安装在/opt目录下。
    mkdir mysql_docker
    cd mysql_docker/
    echo $PWD # 当前位置的绝对路径
    

    3、启动 mysql 容器

    docker run --name mysqlserver --restart=always --privileged=true -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3306:3306 mysql:latest
    
    # $PWD是当前位置的绝对路径,所以必须在2中创建的文件夹下执行该命令
    # --privileged=true:在docker run中加入 --privileged=true 给容器加上特定权限
    # --name mysqlserver :指定容器的名字为mysqlserver
    # -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
    # -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
    # -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
    

    4、测试 mysql 登录

    docker exec -it mysqlserver /bin/bash # 也可以把容器名"mysqlserver"改为容器id
    mysql -uroot -p
    #设置了初始化密码是123456
    

    5、测试远程连接

    firewall-cmd --zone=public --add-port=3306/tcp --permanent # 开放3306端口
    firewall-cmd --reload # 配置立即生效
    firewall-cmd --zone=public --list-ports
    

    复制 mysql(本地到虚拟机)

    1、在虚拟机创建一个数据库用来导入(最好数据库名字与本机中的相同)

    2、从虚拟机登录本地 mysql

    mysql -uroot -p -h192.168.37.184 -P3306	#这一步是进入mysql的,可以不做,直接到第三步
    

    3、备份本地数据库到虚拟机

    以下都是在虚拟机 mysql 命令行执行,不在登录后的"mysql>“中执行

    • 导出:连接本地 mysql,导出数据库
    mysqldump -h192.168.37.184 -P3306 -uroot -proot monitor > bak.sql;
    #格式:mysqldump -h链接ip -P(大写)端口 -u用户名 -p密码 数据库名>d:XX.sql(路径)
    
    • 导入:导入到虚拟机 mysql
    mysql -uroot -ppassword monitor <bak.sql
    

    注意:-p 可以放在最后,因为密码显式输入会报 warning

    遇到的问题

    • Host * is not allowed to connect to this MySQL server(多次登陆失败)
    #在要访问的那个远程mysql中执行以下命令
    mysql -u root -p
    
    mysql>use mysql;
    
    mysql>update user set host ='%'where user ='root';
    
    mysql>flush privileges;
    

    Docker 遇到的问题

    • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
    service docker restart
    
    • Prometheus 时间不同步
    ntpdate ntp.aliyun.com