15-Docker可视化

15-Docker可视化管理工具

15.1-DockerUI

DockerUI-Docker的可视化管理工具

DockerUI 是由国内开发者打造的一款优秀的 Docker 可视化管理工具。该工具拥有简洁直观的UI界面,可以轻松进行Docker主机管理、集群管理,以及Docker任务的编排等操作。DockerUI不仅展示了资源利用率、系统信息和更新日志等内容,还提供了镜像管理的功能,能够有效清理中间镜像和残留的垃圾文件。

其UI设计和功能全面覆盖了Docker的核心操作,让用户无需通过命令行,即可方便地管理Docker环境。

GitHub开源地址

https://github.com/gohutool/docker.ui

主要功能

亮点:

Docker主机和集群的可视化管理
资源使用情况监控,实时查看CPU、内存和存储的使用情况
镜像管理,包括拉取、删除、导入导出镜像等操作
容器管理,支持启动、停止、重启和删除容器
网络管理,轻松配置Docker网络设置

缺点:

DockerUI开发者已经不再进行维护了,但对于小白来讲已经够用了

开发者的仓库地址:https://hub.docker.com/r/joinsunsoft/docker.ui

DockerUI直接启动

DockerUI可以通过以下命令直接启动:

docker run --restart always --name docker-ui -d -v /var/run/docker.sock:/var/run/docker.sock -p 18999:8999 joinsunsoft/docker.ui:latest

DockerUI国内镜像源启动

如果你需要使用国内镜像源,可以使用以下命令:

docker run --restart always --name docker-ui -d -v /var/run/docker.sock:/var/run/docker.sock -p 18999:8999 registry.cn-hangzhou.aliyuncs.com/jast-docker/docker.ui:latest

访问地址:http://localhost:18999/login.html,进入登录页面。localhost更改为宿主机ip

默认的用户名和密码为:ginghan / 123456

image-20241005200919754

15.2-Portainer

Portainer轻量级图形化监控

Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。

Portainer分为开源社区版(CE版)和商用版(BE版/EE版)。

Portainer官网
https://www.portainer.io/

Portainer下载

建议使用代理下载

image-20241209004655579

pull示例

image-20241209004801991

Portainer启动

官网步骤

https://docs.portainer.io/start/install-ce/server/docker/linux

Portainer也是一个Docker镜像,可以直接使用Docker运行。

首先,创建 Portainer Server 将用于存储其数据库的卷:

docker volume create portainer_data

image-20241209005208971

然后,下载并安装 Portainer Server 容器(建议使用上述代理的方式pull,然后在进行部署):

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.21.4

–restart=always 如果Docker引擎重启了,那么这个容器实例也会在Docker引擎重启后重启,类似开机自启

image-20241209005226802

访问地址:https://localhost:9443,进入登录页面。localhost更改为宿主机ip

首次进来时,需要创建 admin 的用户名(默认admin)、密码(必须满足校验规则,例如portainer.io123)。

选择 local管理本地docker,即可看到本地Docker的详细信息,包括其中的镜像(images)、容器(containers)、网络(networks)、容器卷(volumes)、compose编排(stacks)等等。

image-20241209005613084

Portainer的汉化后续我会单独出一个教程

15.3-CIG

CIG重量级监控

通过docker stats 命令可以很方便的查看当前宿主机上所有容器的CPU、内存、网络流量等数据,可以满足一些小型应用。

但是 docker stats 统计结果只能是当前宿主机的全部容器,数据资料是实时的,没有地方存储、没有健康指标过线预警等功能。

CAdvisor(监控收集) + InfluxDB(存储数据) + Granfana(展示图表),合称 CIG

image-20241208190823565

CAdvisor

CAdvisor是一个容器资源监控工具,包括容器的内存、CPU、网络IO、磁盘IO等监控,同时提供了一个Web页面用于查看容器的实时运行状态。

CAdvisor默认存储2分钟的数据,而且只是针对单物理机。不过CAdvisor提供了很多数据集成接口,支持 InfluxDB、Redis、Kafka、Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据库存储起来。

CAdvisor主要功能:

  • 展示Host和容器两个层次的监控数据

  • 展示历史变化数据

InfluxDB

InfluxDB是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。

CAdvisor默认只在本机保存2分钟的数据,为了持久化存储数据和统一收集展示监控数据,需要将数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储 CAdvisor 的数据。而且 CAdvisor本身已经提供了InfluxDB的集成方法,在启动容器时指定配置即可。

InfluxDB主要功能:

  • 基于时间序列,支持与时间有关的相关函数(如最大、最小、求和等)

  • 可度量性,可以实时对大量数据进行计算

  • 基于事件,支持任意的事件数据

Granfana

Grafana是一个开源的数据监控分析可视化平台,支持多种数据源配置(支持的数据源包括InfluxDB、MySQL、Elasticsearch、OpenTSDB、Graphite等)和丰富的插件及模板功能,支持图表权限控制和报警。

Granfana主要功能:

  • 灵活丰富的图形化选项

  • 可以混合多种风格

  • 支持白天和夜间模式

  • 多个数据源

安装部署CIG

新建目录

[root@docker ~]# cd /app
[root@docker app]# mkdir cig
[root@docker app]# cd cig
[root@docker cig]# pwd
/app/cig

新建docker-compose.yml文件

[root@docker cig]# vim docker-compose.yml

tutum/influxdb 相比influxdb多了web可视化视图。但是该镜像已被标记为已过时

  • “8083:8083” # 数据库web可视化页面端口
  • “8086:8086” # 数据库端口
  • 编写docker-compose.yml服务编排文件
version: "3.1"

volumes:
  grafana_data: {}

services:
  influxdb:
    image: tutum/influxdb:latest
    restart: always
    environment:
      - PRE_CREATE_DB=cadvisor
    ports:
      - "8083:8083"
      - "8086:8086"
    volumes:
      - ./data/influxdb:/data

  cadvisor:
    image: google/cadvisor:v0.32.0
    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:8.5.2
    user: '104'
    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
  • 检查语法
docker-compose config -q

检查语法出现了以下报错

[root@docker cig]# docker compose config -q
WARN[0000] /app/cig/docker-compose.yml: `version` is obsolete 

那是因为我使用的docker compose的版本比较新,但是新版本会兼容旧版本,暂时不用管

  • 创建并启动容器(建议先把镜像拉取下来再进行启动)
docker-compose up -d

容器启动成功示例

image-20241210233727137

  • 在浏览器打开InfluxDB数据库的页面:http://xxx.xxx.xxx.xxx:8083,使用命令查看当前数据库中的数据库实例:
SHOW DATABASES

查看其中是否自动创建了我们在配置文件中配置的 cadvisor 数据库实例

image-20241210234004082

  • 在浏览器打开CAdvisor页面:http://xxx.xxx.xxx.xxx8080/,查看当前docker中的cpu、内存、网络IO等统计信息。

image-20241210234024505

  • 在浏览器打开Grafana页面:http://xxx.xxx.xxx.xxx:3000/,默认用户名密码是:admin/admin

image-20241210234041486

Grafana配置

添加数据源

Configuration(小齿轮)选项卡中,选择Data Sources,添加一个InfluxDB数据源:

  • name:自定义一个数据源名称,例如InfluxDB

  • Query Language:查询语言,默认InfluxQL即可

  • URL:根据compose中的容器服务名连接,http://influxdb:8086

  • database:我们在InfluxDB中创建的数据库实例,cadvisor

  • User:InfluxDB的默认用户,root

  • Password:root

示例

添加一个InfluxDB数据源

image-20241210234507360

name:自定义一个数据源名称,例如InfluxDB

Query Language:查询语言,默认InfluxQL即可

URL:根据compose中的容器服务名连接,http://influxdb:8086

image-20241210234904608

database:我们在InfluxDB中创建的数据库实例,cadvisor

User:InfluxDB的默认用户,root

Password:root

image-20241210235146486

点击测试并保存

image-20241210235221727

添加工作台

  • Create(加号)选项卡中,选择创建 Dash Board工作台。右上角配置中可以配置创建出来的工作台的标题、文件夹等信息。

  • 在创建出来的工作台中,选择Add panel中的Add a new panel添加一个新的面板。

  1. 在右上角Time series(时序图)位置可以切换展示的图表样式(柱状图、仪表盘、表格、饼图等等)
  2. 右侧边栏为该图表配置相关信息:标题、描述
  3. 图表下方可以配置该图表展示的数据的查询语句,例如:
  • FROM:cpu_usage_total(Grafana会自动获取InfluxDB数据库中的元数据,可以直接选择对应表名)

  • WHERE:添加一个条件,container_name=cig-cadvisor-1

  • ALIAS:配置一个别名,CPU使用情况汇总

示例

在创建出来的工作台中,选择Add panel中的Add a new panel添加一个新的面板

image-20241210235344592

在右上角Time series(时序图)位置可以切换展示的图表样式(柱状图、仪表盘、表格、饼图等等)

image-20241210235435380

右侧边栏为该图表配置相关信息:标题、描述

image-20241210235540482

保存后重新选择编辑

image-20241210235624502

  • FROM:cpu_usage_total(Grafana会自动获取InfluxDB数据库中的元数据,可以直接选择对应表名)

  • WHERE:添加一个条件,container_name=cig-cadvisor-1

  • ALIAS:配置一个别名,CPU使用情况汇总

图示是以内存举例

image-20241211002054644

最终效果

image-20241211001620016

<think>好的,我现在需要帮助用户解决他们关于使用Python处理气象数据的问题。用户希望读取NCEP1的500hPa月平均高度场数据(nc格式)和中国160站的气温数据(txt格式),计算1951-2010年1月份的EU遥相关指数及其标准化值,生成时间序列图,并分析该指数与高度场及气温的空间相关系数分布,最后绘制地图图形。 首先,我需要确认用户提到的任务的具体步骤。EU遥相关指数的计算通常需要定义关键区域的高度场异常,然后通过标准化处理得到指数。用户可能需要先了解EU指数的定义,比如参考文献中的方法。根据我的知识,EU指数可能涉及欧洲和北大西洋地区的几个关键点的高度场差异,但具体的计算方式可能需要查阅相关文献或者标准方法。用户提供的引用中并没有直接提到EU指数的计算方法,所以可能需要依赖外部资料或者假设一个通用的计算方法,比如区域平均的标准化异常差值。 接下来,处理数据部分。用户需要读取nc格式的高度场数据和txt格式的气温数据。对于nc文件,Python中常用的库是xarray,结合netCDF4库。而txt格式的气温数据可能需要使用pandas来读取,尤其是处理表格数据。用户提供的引用[4]中提到了使用xarray打开NetCDF文件,这可以作为参考。因此,代码中需要使用xarray.open_dataset来读取高度场数据,pandas读取txt气温数据。 然后,时间范围是1951-2010年的1月份数据。需要确保数据的时间维度正确,提取每年1月的数据。这里需要注意时间坐标的处理,可能需要对时间变量进行解析,比如使用xarray的日期功能筛选出每年的1月。 计算EU指数可能需要以下步骤:首先提取关键区域的高度场数据,计算区域平均值,然后对每个区域的时间序列进行标准化,最后EU指数可能是两个区域标准化值的差值或者某种组合。例如,假设EU指数是区域A的平均高度场异常减去区域B的平均值。标准化通常是指对每个区域的时间序列减去均值,除以标准差。用户可能需要先计算每个区域的平均高度场异常,再进行标准化,最后得到EU指数。 生成时间序列图表,需要使用matplotlib或seaborn来绘制折线图,并标注标准化后的EU指数随时间的变化。 空间相关系数的计算涉及将EU指数的时间序列与每个格点的高度场异常进行相关系数计算,同样地,与中国160站气温的相关系数也需要逐个站点计算。这里可以使用xarray和pandas的相关函数,比如xarray的corr方法,或者numpy的相关系数函数。计算后的相关系数需要保存为网格场,以便绘制空间分布图。 绘制地图图形需要用到cartopy库来创建地图投影,添加海岸线、经纬度标签等。对于中国160站的气温相关系数,可能需要将站点的经纬度信息与相关系数值对应,用散点图或站点标记来显示。 接下来,我需要考虑用户可能遇到的问题。例如,数据的时间对齐,确保高度场和气温数据的时间维度一致,都是1月份的数据。此外,处理不同分辨率的数据,如高度场是网格数据,而气温是站点数据,如何正确计算相关系数。还有,计算相关系数时的显著性检验是否需要,但用户没有提到,可能暂时不需要。 代码的步骤大致如下: 1. 导入必要的库:xarray, pandas, numpy, matplotlib, cartopy等。 2. 读取高度场nc文件,提取1月数据,时间范围1951-2010。 3. 读取中国160站气温txt文件,同样提取1月数据,可能需要对txt文件的格式进行解析,确保正确读取站点号、经纬度、各年数据。 4. 计算EU指数: a. 定义关键区域的经纬度范围,例如区域1(55°N-65°N, 20°E-40°E)和区域2(40°N-50°N, 80°E-100°E),假设这是EU指数的定义区域。 b. 计算每个区域内的高度场区域平均,得到两个时间序列。 c. 对每个时间序列进行标准化(减去均值,除以标准差)。 d. EU指数为两个标准化序列的差值。 5. 标准化EU指数本身,可能需要再次标准化,或者用户指的标准化是区域平均后的处理。这里需要明确步骤,可能需要根据文献确认。 6. 绘制EU指数的时间序列图。 7. 计算空间相关系数: a. 对高度场,每个格点的月高度场异常与EU指数进行相关计算。 b. 对气温站点,每个站点的气温异常与EU指数进行相关计算。 8. 绘制相关系数的空间分布图: a. 高度场使用填色图,叠加地图特征。 b. 气温站点使用散点图,颜色表示相关系数值。 可能遇到的问题包括: - 数据的时间处理:确保所有数据都是1月份,且年份范围正确。 - 区域平均的计算:使用xarray的sel和mean方法选择区域并计算平均。 - 标准化处理:使用时间序列的均值和标准差进行标准化。 - 相关系数的计算:使用xarray的corr函数或numpy.corrcoef。 - 地图投影的选择:通常使用PlateCarree投影,并正确设置经纬度范围。 需要验证每个步骤的正确性,比如提取1月数据是否正确,区域平均是否计算准确,相关系数的计算是否无误。此外,用户提供的引用[4]中提到了处理hgt.mon.mean.nc数据的方法,可以作为读取和筛选时间段的参考。 关于中国160站气温数据的格式,用户提到是txt格式,可能需要解析每个站的各年1月气温数据。例如,每行代表一个站点,包含站号、经纬度、以及各年1月的气温值。需要用pandas读取并转换为DataFrame,然后提取1951-2010年的数据。 在编写代码时,需要注意异常值的处理,比如缺失数据,可能需要填充或排除。另外,计算相关系数时,要确保两个变量的数据长度一致,且没有NaN值。 最后,整合所有步骤,写出完整的Python代码,并进行测试,确保每个部分运行正常,结果合理。</think>以下是为您设计的气象数据处理Python解决方案,包含完整的代码框架和关键步骤说明: ```python # -*- coding: utf-8 -*- import xarray as xr import pandas as pd import numpy as np import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter # 读取NCEP 500hPa高度场数据 def read_hgt_data(): ds = xr.open_dataset('hgt.mon.mean.nc') # 提取1月数据并裁剪时间范围 hgt_jan = ds.hgt.sel(time=ds['time.month']==1).sel(time=slice('1951-01', '2010-12')) return hgt_jan # 读取中国160站气温数据 def read_temp_data(): cols = ['station'] + [f'{y}' for y in range(1951, 2011)] df = pd.read_csv('China_160_stations.txt', delim_whitespace=True, header=None, names=cols, usecols=range(62)) # 解析站点信息(假设前3列为站号、经度、纬度) stations = df.iloc[:, :3].copy() stations.columns = ['station', 'lon', 'lat'] temp_data = df.iloc[:, 3:].T temp_data.index = pd.date_range('1951-01', periods=60, freq='AS-JAN') return stations, temp_data # 计算EU遥相关指数 def calculate_eu_index(hgt): # 定义EU关键区域(示例区域需根据实际定义调整) regionA = hgt.sel(lat=slice(55,65), lon=slice(20,40)).mean(dim=['lat','lon']) regionB = hgt.sel(lat=slice(40,50), lon=slice(80,100)).mean(dim=['lat','lon']) # 标准化处理 eu_index = (regionA - regionB) eu_norm = (eu_index - eu_index.mean()) / eu_index.std() return eu_norm # 绘制EU指数时间序列 def plot_eu_index(eu): plt.figure(figsize=(12,4)) eu.plot(color='royalblue', lw=2) plt.title('EU Teleconnection Index (1951-2010)', fontsize=14) plt.xlabel('Year') plt.grid(True, alpha=0.3) plt.tight_layout() plt.savefig('EU_Index.png', dpi=300) # 计算空间相关系数 def spatial_correlation(hgt, temp, eu): # 高度场相关 hgt_corr = xr.corr(hgt, eu, dim='time') # 气温相关(假设temp已与eu时间对齐) temp_corr = temp.corrwith(eu.to_series()) return hgt_corr, temp_corr # 绘制空间相关分布图 def plot_correlation(hgt_corr, temp_corr, stations): # 高度场相关图 plt.figure(figsize=(10,6)) ax = plt.axes(projection=ccrs.PlateCarree()) hgt_corr.plot.contourf(ax=ax, levels=np.linspace(-1,1,21), cmap='RdBu_r', add_colorbar=True) ax.add_feature(cfeature.LAND.with_scale('50m')) ax.add_feature(cfeature.COASTLINE.with_scale('50m')) ax.set_xticks(np.arange(0,361,60)) ax.set_yticks(np.arange(-90,91,30)) ax.xaxis.set_major_formatter(LongitudeFormatter()) ax.yaxis.set_major_formatter(LatitudeFormatter()) plt.title('Correlation with 500hPa Height', fontsize=12) plt.savefig('Hgt_Correlation.png', dpi=300) # 气温相关图 plt.figure(figsize=(10,6)) ax = plt.axes(projection=ccrs.PlateCarree()) ax.add_feature(cfeature.COASTLINE.with_scale('50m')) sc = ax.scatter(stations.lon, stations.lat, c=temp_corr, cmap='RdBu_r', s=40, edgecolor='k', vmin=-1, vmax=1) plt.colorbar(sc, orientation='horizontal', pad=0.03) plt.title('Temperature Correlation with EU Index', fontsize=12) plt.savefig('Temp_Correlation.png', dpi=300) # 主程序流程 if __name__ == '__main__': hgt_data = read_hgt_data() stations, temp_data = read_temp_data() eu_index = calculate_eu_index(hgt_data) plot_eu_index(eu_index) hgt_corr, temp_corr = spatial_correlation(hgt_data, temp_data, eu_index) plot_correlation(hgt_corr, temp_corr, stations) ``` ### 关键步骤说明 1. **数据读取**: - 高度场使用xarray处理NetCDF格式,筛选1月数据时采用`time.month`选择器[^4] - 站点数据采用pandas解析文本格式,需注意数据排列方式(假设前3列为站点元数据) 2. **EU指数计算**: - 基于定义的关键区域(需根据实际研究调整经纬度范围) - 标准化处理采用`(X - μ)/σ`公式,确保指数无量纲化 3. **相关分析**: - 高度场相关使用xarray内置的corr函数进行网格点计算 - 气温相关使用pandas的corrwith方法实现站点级计算 4. **可视化**: - 采用Cartopy绘制地理空间分布图 - 使用发散色阶(RdBu_r)突出正负相关关系[^2] ### 数据预处理建议 1. 高度场数据需进行纬度加权处理: ```python weights = np.cos(np.deg2rad(hgt_data.lat)) hgt_weighted = hgt_data * weights ``` 2. 站点数据缺失值处理: ```python temp_data = temp_data.replace(-999.9, np.nan).interpolate(axis=0) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甲柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值