Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排

news2025/1/9 16:12:56

在这里插入图片描述

前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

  • 高质量博客汇总

然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!

  • Docker从认识到实践再到底层原理

Docker Compose

1. 概览

参考:比特就业课

1.1 Docker Compose是什么

docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。

docker-compose 中有两个非常重要的概念:

  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义, 整个docker-compose.yml定义一个项目。

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。通过compose可以方便的管理多个服务。

1.2 为什么要 Docker Compose

Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一个进程。

如果一个应用需要涉及到 MySQL、nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。

另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker 容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。

2. Docker Compose 的安装

我们安装docker的时候已经顺便安装了,大家可以看看前面的章节(第一章)。

检查是否安装上了。

root@ALiCentos7:~$ docker compose version
Docker Compose version v2.20.2
You have new mail in /var/spool/mail/root
root@ALiCentos7:~$

3. Docker Compose 的功能简介

3.1 使用步骤

Compose 使用的步骤:

  • 使用docker-compose.yml定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker compose up 命令来启动并运行整个应用程序。

3.2 核心功能

Compose 具有管理应用程序整个生命周期的命令:

  • 启动,停止和重建服务

  • 查看正在运行的服务的状态

  • 流式传输运行服务的日志输出

  • 在服务上运行一次性命令

4. Docker Compose 文件(docker-compose.yml

4.1 文件语法版本

目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已经被废弃掉了。当前最新的版本是 3.8,它支持的 Docker Engine 版本不得低于 19.03.0。

官方文档:

  • https://docs.docker.com/compose/compose-file/compose-versioning/

4.2 文件的基本结构

version: "3.8" # 定义版本, 表示当前使用的 docker-compose 语法的版本
services: # 服务,可以存在多个
servicename: # 服务名字,它也是内部bridge 网络可以使用的DNS name,如果不是集群模式相当于 docker run的时候指定的一个名称
#集群(Swarm)模式是多个容器的逻辑抽象
image: # 必选,镜像的名字
command: # 可选,如果设置,则会覆盖默认镜像里的 CMD 命令
environment: # 可选,等价于 docker container run 里的 --env 选项设置环境变量
volumes: # 可选,等价于docker container run 里的 -v 选项 绑定数据卷
networks: # 可选,等价于 docker container run 里的 --network 选项指定网络
ports: # 可选,等价于 docker container run 里的 -p 选项指定端口映射
expose: # 可选,指定容器暴露的端口
build: #构建目录
depends_on: #服务依赖配置
env_file: #环境变量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create

4.3 常见字段格式语法

4.3.1 image
image: redis
image: redis:5
image:
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis

先准备好目录先。

在这里插入图片描述

把配置文件写好。

在这里插入图片描述

启动配置文件里面的所有东西。

在这里插入图片描述

会默认创建一个桥网络的,然后把工程相关的容器加入到这个项目的网络里面去,和docker默认网络分开的。

在这里插入图片描述
在这里插入图片描述

停止和删除。

在这里插入图片描述

4.3.2 command

覆盖容器启动的默认命令。

command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3.3 entrypoint

覆盖容器默认的 entrypoint。

两种格式。

entrypoint: /code/entrypoint.sh
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit

在这里插入图片描述
在这里插入图片描述

4.3.4 environment

添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。

# map语法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
# 数组语法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT

在这里插入图片描述

在这里插入图片描述

4.3.5 networks

指定容器运行的网络。

在这里插入图片描述

在这里插入图片描述

要调整网络的信息也很容易。如下面的例子所示即可。

services:
  frontend:
    image: awesome/webapp
    networks:
      front-tier:
        ipv4_address: 172.16.238.10
networks:
  front-tier:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/24"
4.3.6 volumes

将主机的数据卷或者文件挂载到容器里。

#短语法 对应 -v 的精简的配置
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"
#完整语法 对应 --mount 的详细的配置
services:
  backend:
    image: awesome/backend
    volumes:
    	- type: volume
        #命名卷
        source: db-data
        target: /data
        volume:
          nocopy: true
    	#绑定卷
   		- type: bind
        source: /var/run/postgres/postgres.sock
        target: /var/run/postgres/postgres.sock
volumes:
  db-data:
4.3.7 ports

端口映射,其实就是命令中的-p选项。

#完整语法
ports:
  - target: 80
    host_ip: 127.0.0.1 # 设置成 0.0.0.0 就是所有机器都能来访问
    published: 8080
    protocol: tcp
    mode: host
  - target: 80
    host_ip: 127.0.0.1
    published: 8000-9000
    protocol: tcp
    mode: host
#短语法
ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"
4.3.8 expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

expose:
- "3000"
- "8000"
4.3.9 build

这个参数我们学完dockerFile之后就能理解了,现在先不讲。

4.3.10 depends_on

设置依赖关系。

  • docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和redis ,才会启动 web。

  • docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker compose up web 还将创建并启动 db 和 redis。

  • docker compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和redis 之前停止。

这个参数比较复杂,大家来看看例子。

version: "3.7"
  services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
  	image: redis
  db:
  	image: postgres

可以指定条件,healthy 需要配置 healthcheck 来完成。

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres

healthcheck案例。

version: "3.8"
  services:
    web:
      image: nginx:1.24.0
      environment:
      	TEST: 1
      depends_on:
      	mysql:
      		condition: service_healthy
    mysql:
      image: mysql:5.7
      environment:
      	MYSQL_ROOT_PASSWORD: "bit@123"
      volumes:
      	- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
      healthcheck:
        test: mysql --user=root --password='bit@123' -e "SELECT 1;"
        interval: 10s
        timeout: 5s
        retries: 10

在这里插入图片描述

在这里插入图片描述

4.3.11 env_file

从文件添加环境变量。可以是单个值或列表的多个值。

env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

在这里插入图片描述

5. Docker Compose 命令

5.1 命令清单

命令功能
docker compose build构建服务
docker compose config规范的格式来显示服务配置
docker compose cp在本地系统和服务容器直接拷贝文件
docker compose create创建服务的容器
docker compose down停止所有容器,并删除容器
docker compose events从服务器获取实时时间
docker compose exec在容器中执行命令
docker compose images列出所有容器使用的镜像
docker compose kill强制停止服务的容器
docker compose logs显示日志
docker compose ls显示所有项目
docker compose pause暂停服务
docker compose port列出所有的端口映射
docker compose ps该命令可以列出项目中目前的所有容器
docker compose pull拉取服务镜像
docker compose push推送服务镜像
docker compose restart重启或者重启某个服务
docker compose rm删除服务停止的容器
docker compose run在指定服务容器上执行相关的命令
docker compose start 启动当前停止的某个容器
docker compose stop停止当前运行的某个容器
docker compose top显示运行的进程
docker compose unpause恢复服务
docker compose upup 命令会构建,(重新)创建,启动,
链接一个服务相关的容器。
默认情况下如果容器已经存在,
将会停止并尝试重新创建他们。并使用之前挂载的卷。
–no-recreate 参数可以让容器不被停止或者重新创建,
-d 表示后台运行
docker compose version查看版本

5.2 命令格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。docker-compose 命令的基本的使用格式为如下所示。

docker compose [OPTIONS] COMMAND [ARGS...]

5.3 常用选项

  • -f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。

  • -p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名。

5.4 常见命令

5.4.1 up

该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。

docker compose up [options] [SERVICE...]

参数。

-d 在后台运行服务容器, 推荐在生产环境下使用该选项
--force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
--no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用
5.4.2 down

停止所有容器,并删除容器和网络。

docker compose down [options] [SERVICE...]

参数。

-v, --volumes 删除容器同时删除目录映射
5.4.3 run

该命令可以在指定服务容器上执行相关的命令。

# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]

参数。

-d 后台运行容器
--name NAME 为容器指定一个名字
--entrypoint CMD 覆盖默认的容器启动指令
-e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
-u, --user="" 指定运行容器的用户名或者 uid
--rm 运行命令后自动删除容器
-p, --publish=[] 映射容器端口到本地主机

6. 综合案例

6.1 综合案例一

nginx
系统服务
MySQL
  • nginx反向代理到我们的web服务,对外提供浏览服务
  • 查询mysql数据库用户信息返回用户数据
  • 创建用户库,写入用户数据
6.1.1 编写数据初始化脚本

设计数据非常简单的一个表信息,写入两条数据,文件为init.sql

drop database if exists test;
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8mb4 ;
use `test`;
CREATE TABLE `users` (
  `sno` int(11) DEFAULT NULL,
  `sname` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO users (sno,sname) VALUES (1,'pony'), (2,'maxhou');

在这里插入图片描述

这样手动操作是可以的。但是我们希望,每次启动服务的时候,会直接运行这些,初始化我的数据。所以这些东西要写到一个sql文件里面去。

这个就叫做数据初始化脚本!

在这里插入图片描述

6.1.2 创建一个 springboot 应用, 配置 maven 项目
6.1.3 添加启动类
6.1.4 配置数据库信息

注意本地测试的时候红色部分调整为 ip 地址,而我们实际的服务使用的 mysql 的一个服务名称。

6.1.5 配置用户控制器

简单配置,不再去涉及 mapper 那些内容通过 jdbc 直接完成操作。

6.1.6 编译打包
6.1.7 本地测试
6.1.8 编写 docker-compose.yml
6.1.9 创建工程目录和卷目录
6.1.10 将 nginx 的反向代理配置 bit.conf 放入到./nginx/conf.d
6.1.11 将数据库初始化文件 init.sql 放入到./mysql/init 目录
6.1.12 将应用 jar 包放入到./app 目录
6.1.13 启动我们的项目

6.2 综合案例二

6.2.1 什么是 WordPress

WordPress 是使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设属于自己的网站。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一款个人博客系统,并逐步演化成一款内容管理系统软件,它是使用PHP 语言和 MySQL 数据库开发的,用户可以在支持 PHP 和 MySQL 数据库的服务器上使用自己的博客。

WordPress 有许多第三方开发的免费模板,安装方式简单易用。不过要做一个自己的模板,则需要你有一定的专业知识。比如你至少要懂的标准通用标记语言下的一个应用 HTML 代码、CSS、PHP 等相关知识。WordPress 官方支持中文版,同时有爱好者开发的第三方中文语言包,如 wopus 中文语言包。WordPress 拥有成千上万个各式插件和不计其数的主题模板样式。

6.2.2 编写 docker compose

在这里插入图片描述

version: "3.8"
services:
    wordpress:
      image: wordpress
      restart: always
      depends_on:
        db:
          condition: service_healthy
      ports:
        - 8080:80
      environment:
        WORDPRESS_DB_HOST: db
        WORDPRESS_DB_USER: mywordpressuser
        WORDPRESS_DB_PASSWORD: mywordpresspass
        WORDPRESS_DB_NAME: wordpress
      volumes:
        - ./wordpress/:/var/www/html
    db:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: wordpress
        MYSQL_USER: mywordpressuser
        MYSQL_PASSWORD: mywordpresspass
      volumes:
        - ./mysqlvarlib/:/var/lib/mysql
      healthcheck:
        test: mysql -u root -proot -e "select 1;"
        interval: 10s
        timeout: 5s
        retries: 10

通过这个命令检查这个文件的语法是否有问题。

docker compose config
6.2.3 启动服务+安装博客系统
docker compose up -d

在这里插入图片描述

直接用8080端口访问。

在这里插入图片描述

输入东西,然后安装。

在这里插入图片描述

在这里插入图片描述

其实我们所有东西都存在这里了。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练-Q1-大数加法-20231001

目录 1.题目描述 2.输入描述 3.示例提示 4.问题分析 5.通过代码 1.题目描述 大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。 2.输入描述 第一行输入整数n&#xff0c;第二行输入整数m。 (1<number<1e100)…

Leetcode 224. 基本计算器

文章目录 题目代码&#xff08;10.1 首刷看解析&#xff09; 题目 Leetcode 224. 基本计算器 代码&#xff08;10.1 首刷看解析&#xff09; class Solution { public:int calculate(string s) {stack<int> sk; // 存储正负号sk.push(1);int sign 1;int res 0;int i…

优维低代码实践:应用级配置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

【Vue】Vuex详解,一文读懂并使用Vuex

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《ELement》。&#x1f3af;&#x1f3af; &#x1…

一图带你了解封装与分用

一、前缀知识 IP地址&#xff1a;用于定位主机的网络地址。 端口号&#xff1a;区分主机上不同的应用程序。 协议&#xff1a;描述了网络通信传输的数据的含义。 二、TCP/IP五层网络模型 物理层&#xff1a;描述了网络通信中基础设施的规范。 数据链路层&#xff1a;相邻节点之…

fcntl函数 非阻塞轮询

fcntl&#xff08;&#xff09; 在打开的文件描述符 FD 上执行下面描述的操作之一。 操作由 cmd 确定。 fcntl&#xff08;&#xff09; 可以采用可选的第三个参数。 是否需要此参数由 cmd 确定。 所需的参数类型在后面的括号中指示。 每个cmd名称&#xff08;在大多数情况下&…

公众号迁移是什么?

公众号账号迁移的作用是什么&#xff1f;只能变更主体吗&#xff1f;微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

博弈论——劳资博弈

劳资博弈 0 引言 前一篇文章介绍了静态博弈中常见的几个案例以及场景&#xff0c;并且在此之前也还介绍过斯塔克尔伯格博弈等动态博弈&#xff0c;以及相关的解决方法——反应函数法。今天我们继续介绍一个常见的动态博弈——劳资博弈&#xff0c;并利用反应函数解决&#xff…

视觉人机器视觉线下培训遵循十大原则

1.​上课期间&#xff0c;自习时间没收手机&#xff0c;偷偷使用手机&#xff0c;将会被通报严重批评。 2.完善的教学设备&#xff0c;与具备现场落地设备要求。 3.教学与实操结合&#xff0c;老师教学的同时&#xff0c;要求你按照老师的效果&#xff0c;进行复现&#xff0…

黑马程序员RabbitMQ入门到实战教程【基础篇】学习笔记

目录 一、初始MQ 1.1、同步调用 1.2、异步调用 1.3、MQ技术选型 二、RabbitMQ 2.1、安装 2.2、收发消息 2.2.1、交换机 2.2.2、队列 2.2.3、绑定关系 2.2.4、发送消息 2.3、数据隔离 2.3.1、用户管理 2.3.2、virtual host 三、SpringAMQP 3.1、导入Demo工程 3…

【中国知名企业高管团队】系列23:金山软件KINGSOFT

今天是2023年10月1日&#xff0c;第74个国庆节&#xff0c;华研荟祝各位小伙伴节日快乐&#xff01;阖家幸福&#xff01; 这个特别的日子里&#xff0c;我们来了解金山软件的高管团队。 说到金山软件&#xff0c;可能很多非IT圈的人或者年轻的朋友们不一定知道&#xff0c;但…

【LeetCode热题100】--101.对称二叉树

101.对称二叉树 使用递归&#xff1a; 实现一个递归函数&#xff0c;通过同步移动两个指针的方法来遍历这颗树&#xff0c;p 指针和 q 指针一开始都指向这棵树的根&#xff0c;随后 p 右移时&#xff0c;q左移&#xff0c;ppp 左移时&#xff0c;q 右移。每次检查当前 p 和 q节…

【STM32 LVGL基础教程】初识LVGL

文章目录 前言一、什么是LVGL&#xff1f;二、LVGL的诞生历程三、LVGL的用途四、模拟器使用LVGL4.1 下载codeblocks并运行模拟器lvgl4.2 更改lvgl设置更改帧数更改颜色深度 五、STM32使用LVGL总结 前言 嵌入式系统中的图形用户界面&#xff08;GUI&#xff09;已经成为现代设备…

小说推文和短剧推广以及电影达人带货电影票

小说推文、短剧推广、电影达人&#xff08;带或电影票&#xff09;都可以通过“巨量推文“进行申请授权 小说推文和短剧推广是什么&#xff1f; 小说推文和短剧推广的逻辑其实一样&#xff0c;分为cpa拉新和cps分成的推广形式 cpa拉新是你推广的用户必须为新用户&#xff0c…

【 SuperPoint 】图像特征提取上的对比实验

1. SIFT&#xff0c;SuperPoint 都具有提取图片特征点&#xff0c;并且输出特征描述子的特性&#xff0c;本篇文章从特征点的提取数量&#xff0c;特征点的正确匹配数量来探索一下二者的优劣。 SuperPoint提取到的特征点数量要少一些&#xff0c;可以理解&#xff0c;我想原因大…

mac如何卸载应用并删除文件,2023年最新妙招大公开!

大家好&#xff0c;今天小编要为大家分享一些关于mac电脑的小技巧&#xff0c;特别是关于如何正确卸载应用程序以及清理卸载后的残留文件。你知道吗&#xff1f;很多人都不知道&#xff0c;mac系统默认的卸载方式可能会导致一些残留文件滞留在你的电脑上&#xff0c;慢慢地占用…

算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题 905.区间选点 给定N个闭区间[ai, bi]&#xff0c;请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量&#xff0c;位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每…

VS Code 如何搭建 C/C++开发环境

目录 VScode是什么? VScode的下载和安装? 2.1 下载和安装 安装&#xff1a; 2.2 环境的介绍 环境介绍&#xff1a;​编辑 安装中文插件&#xff1a; VScode配置 C/C 开发环境 3.1 下载和配置MinGW-w64 编译器套件 下载&#xff1a; 配置MinGW64&#xff1a; 3.2 安…

排序篇(六)----排序小结

排序篇(六)----排序小结 排序算法复杂度及稳定性分析 直接插入排序的算法复杂度&#xff1a; 最好情况下&#xff0c;当数组已经有序时&#xff0c;直接插入排序的时间复杂度为O(n)&#xff0c;其中n是数组的大小。最坏情况下&#xff0c;当数组逆序排列时&#xff0c;直接插…

【python海洋专题二】读取水深nc文件并水深地形图

【python海洋专题二】读取水深nc文件并水深地形图 海洋与大气科学 导入函数包 from netCDF4 import Dataset import numpy as np import matplotlib.pyplot as plt 前两个上期更新说明了&#xff1a;第一个读取nc文件&#xff0c;第二个用于计算。 matplotlib.pyplot&#xf…