由于docker compose启动的服务都在同一台宿主机上,对于一个宿主机上运行多个容器应用时,容器的运行情况如:CPU使用率、内存使用率、网络状态、磁盘空间等一系列随时间变化的时许数据信息,都是需要了解的,所以需要监控。
对于容器的监控方案可谓多种多样,本身自带命令docker stats命令,Scout, Data Dog,
Sysdig Cloud, Sensu Monitoring Framework,CAdvisor 等。
通过dockerstats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等
数据。但是docker stats命令的缺点就是统计的只是当前宿主机的所有容器,而获取的监控数
据是实时的,没有地方存储,也没有报警功能。
而Scout、Sysdig Cloud、Data Dog虽然都提供了较完善的服务,但是它们都是托管的服务
而且都收费,Sensu Monitoring Framework集成度较高,也免费,但是部署过于复杂。
综合考虑,我们选择了CAdvisor做容器监控工具。
CAdvisor谷歌出品,优点是开源产品,监控指标齐全,部署方便,而且有官方的docker镜像。
缺点是集成度不高,默认只在本地保存2分钟数据。不过可以加上InfluxDB存储数据,对接
Grafana展示图表,比较便利地搭建好了容器监控系统,数据收集和图表展示效果良好,对系
统性能也几乎没有什么影响。
CAdvisor是一个容器资源监控工具,包括容器的内存,CPU,网络I0,磁盘I0等监控,同时提供
了一个WEB页面用于查看容器的实时运行状态。CAdvisor 默认存储2分钟的数据,而且只是针对
单物理机。不过,CAdvisor 提供了很多数据集成接口,支持InfluxDB,Redis, Kafka,
Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。
CAdvisor功能主要有两点:
–展示Host和容器两个层次的监控数据。
–展示历史变化数据。
InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。
前面说到,CAdvisor 默认只在本机保存最近2分钟的数据,为了持久化存储数据和统一-收集展示监控数据,需要将数据存储到InfluxDB中。InfluxDB 是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor的数据。而且,CAdvisor本身已经提供了InfluxDB的集成方法,在启动容器时指定配置即可。
InfuxDB主要功能:
●基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等) ;
●可度量性:你可以实时对大量数据进行计算;
●基于事件:它支持任意的事件数据;
InfluxDB主要特点:
●无结构(无模式) ;
●可以是任意数量的列;
●可拓展的;
●支持min, max, sum, count, mean, median等一系列函数,方便统计;
●97原生的HTTP支持,内置HTTP API;
●强大的类SQL语法;
●自带管理界面,方便使用
Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(支 持的数据源包括
InfluxDB,MySQL, Elasticsearch, OpenTSDB, Graphite 等)和丰富的插件及模板功能,
支持图表权限控制和报警。
Grafana主要特性:
CAdvisor:负责收集容器的随时间变化的数据
InfluxDB:负责存储时序数据
Grafana:负责分析和展示时序数据
部署InfluxDB服务
docker run -d --name influxdb -p 8086:8086 \
-V /data/influxdb:/var/lib/influxdb \
--hostname=influxdb \
influxdb
说明:
●–name :启运容器分配名字influxdb
●-p:映射端口,8083端口为infuxdb管理端口,8086端口是infuxdb的数据端口
●-v:挂载数据-d:后台运行此容器
●influxdb: 通过这个容器来运行的,默认会在docker官方仓库pull下来
运行成功后
1、浏览器访问influxdb的管理端,http://ip:8083
2、创建test的数据库与root用户,用于后期配granfa
docker exec -it influxdb influx
CREATE DATABASE "test"
CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
部署CAdvisor服务
谷歌的cadvisor可以用于收集Docker容器的时序信息,包括容器运行过程中的资源使
用情况和性能数据。
docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro --volume=/var/ib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro --volume=/cgroup:/cgroup:ro \
--publish=8080:8080 --detach=true --privileged=true --name=cadvisor \
google/cadvisor:latest \
-storage_ driver=influxdb -storage_ _driver_ _host=influxdb:8086 \
-storage_ driver_ db=test -storage_ _driver_ _user=root \
-storage_ _driver_ password=root
说明:
●-d:后台运行此容器
●–name :启运容器分配名字cadvisor
●-p:映射端口8080
●–mout:把宿主机的相文目录绑定到容器中,这些目录都是cadvisor需要采集的目录文件和监控内容
●-storage_ _driver: 需要指定cadvisor的存储驱动、数据库主机、数据库名
可以通过ip+8080端口访问
部署Granfana服务
grafana - -款开源的时序数据分析工具,而且界面专业易用,等部署好了,大家就能感受到。
docker run -d -p 3000:3000 \
-v /data/grafana:/var/lib/grafana \
-link=influxdb:influxdb \
--name grafana \
grafana/grafana
注意:如果使用-V把数据挂载出来会出现容器启动失败,错误为mkdir: cannot create directory ‘/var/lib
grafana/plugins’: Permission denied,此时可以使用docker run --entrypoint “id” grafana/grafana得到
uid,gid, gruops (默认是472) ;
接着使用chown -R 472:472 /data/grafana/修改目录权限就可以启动成功了。
访问通过ip+3000端口 密码为admin/admin
同样的可以使用docker-compose快速部署
version: '3.1'
volumes:
grafana_data: {}
services:
influxdb:
image: tutum/influxdb:0.9
#image: tutum/influxdb
#image: influxdb
restart: always
#user:
environment:
- PRE_CREATE_DB=cadvisor
ports:
- "8083:8083"
- "8086:8086"
expose:
- "8090"
- "8099"
volumes:
- ./data/influxdb:/data
cadvisor:
#image: google/cadvisor:v0.29.0
image: google/cadvisor
links:
- influxdb:influxsrv
command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
restart: always
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
grafana:
#image: grafana/grafana:2.6.0
user: "104"
image: grafana/grafana
user: "104"
#user: "472"
restart: always
links:
- influxdb:influxsrv
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- HTTP_USER=admin
- HTTP_PASS=admin
- INFLUXDB_HOST=influxsrv
- INFLUXDB_PORT=8086
- INFLUXDB_NAME=cadvisor
- INFLUXDB_USER=root
- INFLUXDB_PASS=root
当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到你容器里面进程的标准输出,拿到标准输
出后,它会通过自身的一个LogDriver模块来处理,LogDriver支 持的方式很多,可以写到本地的文件(默认方式),可以发送到syslog等。
Docker会默认收集应用程序的标准输出存储到一个json.log文件中,文件的格式类似下面这种:
{“log”:“root@c835298de6dd:/# ls\r\n”,“stream”.“stdout”,“time”:“xxoo.155863426Z”}
{“log”:“bin boot dev\u0009etc home lib\u0009lib64 media mnt opt\u0009proc root run sbin seli
nux\u0009srv sys tmp usr var\r\n”}
以一行一个作为一条JSON数据存储。Docker 的这种日志存储方式是可以配置的,具体参数可以在执行run启动容器的时候通过log-driver进行配置,具体配置请参考log-driver。
官方地址:https://docs.docker.com/config/container/logging/configure/#supported-logging drivers
Driver | Description |
---|---|
none | No logs are available for the container and docker logs does not return any output. |
json-file | The logs are formatted as JSON. The default logging driver for Docker. |
syslog | Writes logging messages to the syslog facility. The syslog daemon must be running on the host machine. |
journald | Writes log messages to journald . The journald daemon must be running on the host machine. |
gelf | Writes log messages to a Graylog Extended Log Format (GELF) endpoint such as Graylog or Logstash. |
fluentd | Writes log messages to fluentd (forward input). The fluentd daemon must be running on the host machine. |
awslogs | Writes log messages to Amazon CloudWatch Logs. |
splunk | Writes log messages to splunk using the HTTP Event Collector. |
etwlogs | Writes log messages as Event Tracing for Windows (ETW) events. Only available on Windows platforms. |
gcplogs | Writes log messages to Google Cloud Platform (GCP) Logging. |
logentries | Writes log messages to Rapid7 Logentries. |
Docker默认使用了json-file driver作为log driver,而gelf则是我们需要使用的log driver。当容器多了,或者是采用类似swarm集群部署Docker的时候,各种日志分散存在各个json.log文件中,当查找问题或者进行相关统计的时候,分散的日志对我们来说是非常不友好的。我们需要–个能够集中管理Docker日志的工具。
Docker原生支持graylog协议,直接将日志发送到graylog (通过gelf协议)
graylog官方提供了将本身部署在Docker的支持
graylog官方提供了Dockerfile供我们快速的在Docker.上部署日志系统,在这个Docker Hub的地址中,也提供了docker-compose.yml来快速部署整个graylog栈,包含了mongodb、ElasticSearch,而不需要分别单独进行部署。
官方地址: https://hub.docker.com/r/graylog/graylog/
1、创建一个目录用来部署graylog,本文假设目录为/root/graylog,以下所有操作都是在/root/graylog中进行的。
2、初始化目录和配置文件
#创建数据目录
mkdir -p ./graylog/data
#创建配置文件目录
mkdir -p ./graylog/config
cd ./graylog/config
#直接下载官方推荐配置文件
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/graylog.conf
#日志配置文件
wget https://raw.githubusercontent.com/Graylog2/graylog-docker/2.5/config/log4j2.xml
3、修改下载完的graylog.conf中的root__timezone为GMT +0800中国时区
root_timezone = Etc/GMT-8
4、新建docker-compose.yml来供docker-compose快速 启动完整服务
注:由于docker-compose内容较多,以附件形式展示。
5、启动整个服务
docker-compose up
如果没有问题的话,会看到graylog webserver started的终端输出消息。
访问http://{server}:9000/
会看到graylog的web界面,使用用户名admin,密码: admin 来登录后台,至此部署完成。
input配置
graylog的日志收集通过定义input对象来完成,在graylogweb管 理界面按照如下图片进入input对象配置,选择GELF UDP协议来新建一个输入器(input) :
填好相关属性,新建之后保存:
docker配置
如果docker通过命令行启动,可以在run命 令中加上如下参数:
docker run -og driver=gelf -log opt gelf-address=udp://{graylog服务器地址}:12201 -log opt tag=<
当前容器服务标签,用来供graylog查询的时候进行分类> <运行命令>
如果通过docker-compose命令,则可以在docker-compose.yml中加入相关配置,以下用
nginx容器举例:
version:'2'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
logging:
driver: "gelf"
options:
gelf-address: "udp://192.168.183.129:12201"
tag: front-nginx
容器启动的时候可能会有下面这个提示:
nginx_ 1_ _4bd0934b4b62| WARNING: no logs are available with the ‘gelf’ log driver
可以无视这个警告,日志还是会继续发送过去的。
到这里为止我们可以在graylog的web后台中看到nginx所产生的日志了
Docker Swarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。
注意: Docker 1.12.0+ Swarm mode已经内嵌入Docker引擎,成为了docker子命令docker swarm,绝大多数用户已经开始使用Swarm mode,Docker 引擎API已经删除Docker Swarm。
Swarm是使用SwarmKit构建的Docker引擎内置(原生)的集群管理和编排工具。
使用Swarm集群之前需要了解以下几个概念。
1.节点
运行Docker的主机可以主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点( node )。
节点分为管理( manager)节点和工作(worker)节点。
管理节点用于Swarm集群的管理,docker swarm命令基本只能在管理节点执行。
工作节点是任务执行节点,管理节点将服务( service)下发至工作节点执行。
集群中管理节点与工作节点的关系
2.服务和任务
任务( Task)是Swarm中的最小的调度单位,目前来说就是一个单一的容器
服务( Services)是指一 -组任务的集合,服务定义了任务的属性。
服务有两种模式:
●replicated services按照一-定规则在各个工作节点上运行指定个数的任务。
●globalservices每个工作节点上运行一个任务
两种模式通过docker service create的–mode参数指定。
容器、任务、服务的关系:
了解Swarm集群由管理节点和工作节点组成后,我们来创建一个包含一个管理节点和两个工作节点的最小Swarm集群。
初始化集群
使用docker swarm init 在本机初始化一一个 Swarm集群。
docker swarm init --advertise-addr 192.168.168.129
如果你的Docker主机有多个网卡,拥有多个IP,必须使用–advertise- addr指定IP。
执行dockerswarminit命令的节点自动成为管理节点。
增加工作节点
在另外两台服务器.上执行.上一步创建管理节点时候的输出的加入swarm集群的命令
docker swarm join \
--token SWMTKN-1 49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8r
ssmk743ojnwacrr2e7c \
192.168.100.249:2377
查看集群
在管理节点使用docker node Is查看集群。
docker node ls
使用docker service命令来管理Swarm集群中的服务,该命令只能在管理节点运行。
新建服务
在创建好的Swarm集群中运行一一个 名为nginx服务。
docker service create --replicas 3 -p 80:80 --name nginx nginx:latest
现在我们使用浏览器,输入任意节点IP ,即可看到nginx默认页面。
查看服务
使用dockerservicels来查看当前Swarm集群运行的服务。
docker service Is
使用docker service ps来查看某个服务的详情。
docker service ps nginx
使用docker service logs来查看某个服务的日志。
docker service logs nginx
删除服务
使用docker service rm来从Swarm集群移除某个服务。
docker service rm nginx
上面利用Docker Swarm快速搭建一个 最小集群,也可以在集群上部署服务,但是会发现swarm中并没有提供统- -入口查看节点的资源使用情况。这个时候有一个图形化管理工具来帮我们管理swarm集群,portainer 就是这样的一个工具。
Portainer是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括. 上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本
能满足中小型单位对容器管理的全部需求。
下载portainer镜像
#查询当前有哪些Portainer镜像
docker search portainer
docker pull portainer/portainer
安装portainer
docker run -d -p 9000:9000 \
--name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock\
portainer/portainer
1、命令方式
在 创建好的Swarm集群中运行一-个名为nginx服务,并使用–replicas参数
指定启动的副本数。
docker service create --replicas 3 -p 80:80 --name nginx nginx:latest
或者
docker service create -p 80:80 --name nginx nginx:latest
docker service scale nginx=3
docker servicels #查看副本情况
2、portainer 方式
可以使用portainer的方式在web界面上创建服务并指定副本数,同时可以
随时动态增减副本数。