【docker实战】02 用docker安装mysql

本示例采用bitnami的镜像进行安装MySQL,官网链接:https://bitnami.com/stacks

一、镜像搜索

先搜索一下mysql有哪些镜像

[root@localhost ~]# docker search mysql
NAME                            DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   14734     [OK]       
mariadb                         MariaDB Server is a high performing open sou…   5621      [OK]       
percona                         Percona Server is a fork of the MySQL relati…   623       [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   919       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                       105                  [OK]

bitnami是一个比较好的镜像制作机构,其文档也比较完善,所以我们用bitnami/mysql作为示例来安装mysql,点击查看官网的说明文档链接

二、拉取镜像

拉取

[root@localhost ~]# docker pull bitnami/mysql

查看镜像

[root@localhost ~]# docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
bitnami/mysql       latest    cc987bd64212   4 weeks ago     680MB

三、运行msyql容器

可以通过两种方式来运行我们的容器docker run命令行,或者docker-compose

通过docker run

官网的一个示例是这么运行

docker run \-e ALLOW_EMPTY_PASSWORD=yes \-v /path/to/mysql-persistence:/bitnami/mysql/data \bitnami/mysql:latest

通过docker-compose

需要提前安装好docker-compose,如果不清楚怎么安装,点击这里查看安装说明

version: '2'networks:app-tier:driver: bridgeservices:mysql:image: 'bitnami/mysql:latest'environment:- ALLOW_EMPTY_PASSWORD=yesnetworks:- app-tiermyapp:image: 'YOUR_APPLICATION_IMAGE'networks:- app-tier

四、重要的环境变量

下面的示例中,展示了在docker run 启动容器时,通过-e参数设置了一系列的环境变量

docker run -d \-p 3306:3306 \--name mysql \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=yourrootpassword \-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e MYSQL_ENABLE_SLOW_QUERY=1 \-e MYSQL_LONG_QUERY_TIME=5.0 \-e TZ=Asia/Shanghai \-v /path/to/persitence-data:/bitnami/mysql/data \-v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:latest
-d 后台运行
-p 3306:3306: 把docker镜像内部的3306端口映射到宿主机的3306端口.
--name mysql docker实例的名字
-e ALLOW_EMPTY_PASSWORD=yes 让mysql可以使用空密码进行链接. 即可以使用没有密码的账号.
-e MYSQL_ROOT_PASSWORD=yourrootpassword 设置好新mysql 实例的root 账号密码.
-e MYSQL_CHARACTER_SET=utf8mb4 把数据库的默认字符编码修改为utf8b4 , 如果不修改,默认的设置是utf8
-e MYSQL_COLLATE=utf8mb4_general_ci 同上.
-e MYSQL_ENABLE_SLOW_QUERY=1 开启慢查询日志.
-e MYSQL_LONG_QUERY_TIME=5.0 慢查询日志的query 时间阈值. 默认值是10.0秒, 这里设置为5秒
-e TZ=Asia/Shanghai 重要: 设置 Mysql Docker实例的系统时区. 如果不设置,其默认的时区将会为UTC
-v /path/to/persitence-data:/bitnami/mysql/data 持久化配置. 把mysql的数据存储到宿主机的相关的目录.
-v /path/to/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro 把镜像内部的自定义的my_custom.cnf文件映射到宿主机上.且docker内部是只读权限.
bitnami/mysql:5.7.43-debian-11-r73 最后的镜像名称.

五、修改配置文件

bitnami的mysql配置文件是在容器的
/opt/bitnami/mysql/conf/my_custom.cnf 这个位置
如何修改这个配置文件呢
第一步:宿主机上新建一个my_custom.cnf 文件
以下的启动参数基本是一个可以实际使用的命令.但是还需要配置一些其它的额外参数. 这里贴出我的配置:

[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'

一个是修改最大的包大小,这个在一些特别大的数据插入与查询时会用到. RC 隔离级别是 Confluence所要求的. 最后的 default_time_zone = ‘+08:00’ 是为中国区的程序员准备的. 这样可以写入正确的默认值.

第二步:将宿主机上的文件挂载到容器内部

docker run --name mysql \-p 3306:3306 \-e ALLOW_EMPTY_PASSWORD=yes \-v /path/to/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \-v /path/to/mysql-persistence:/bitnami/mysql/data \bitnami/mysql:latest

配置参数 - my_custom.cnf

六、日志

通过docker启动的,可以通过下面命令查看日志

docker logs mysql

通过docker-compose启动的,可以通过下面命令查看日志

docker-compose logs mysql

七、实操

我们给自己定下如下目标:

  • 使用mysql8.0版本
  • 设置好数据存储的挂载到宿主机
  • 设置好用户名和密码
  • 端口号映射到宿主机的3306
  • 自定义一个配置文件挂载到容器my_custom.cnf
  • 系统重启时,自动启动mysql容器
  • 容器被误删除时,数据还在

通过docker run 启动一个mysql容器,实现上述功能

准备工作

#拉取镜像
[root@localhost ~]# docker pull bitnami/mysql
#创建配置文件
[root@localhost ~]# mkdir -p /opt/bitnami/mysql/conf
[root@localhost ~]# cd /opt/bitnami/mysql/conf
[root@localhost conf]# touch my_custom.cnf
[root@localhost conf]# vim my_custom.cnf 
[root@localhost conf]# cat my_custom.cnf 
#配置文件如下
[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'
#创建一个挂载目录
[root@localhost conf]# mkdir -p /bitnami/mysql/data
#设置目录和文件的权限
[root@localhost data]# chmod 777 /bitnami/mysql/data/
[root@localhost data]# chmod 777 /opt/bitnami/mysql/conf/my_custom.cnf

运行容器

其中–restart=always表示,重启系统后,只要docker进程自动启动,那就可以把mysql启动起来

docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0

查看一下日志,主要看看有没有报错啥的,有报错的话,根据报错信息,修改上面的启动命令,比如环境变量有没有设置错的

#先看有没有启动成功
[root@localhost data]# docker ps
CONTAINER ID   IMAGE                  COMMAND                   CREATED              STATUS              PORTS                                       NAMES
9f8eadad1226   bitnami/mysql:latest   "/opt/bitnami/script…"   About a minute ago   Up About a minute   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql
#再查看日志
[root@localhost conf]# docker logs mysql
mysql 20:54:45.86 INFO  ==> 
mysql 20:54:45.86 INFO  ==> Welcome to the Bitnami mysql container
mysql 20:54:45.86 INFO  ==> Subscribe to project updates by watching https://github.com/bitnami/containers
mysql 20:54:45.86 INFO  ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues
mysql 20:54:45.86 INFO  ==> 
mysql 20:54:45.86 INFO  ==> ** Starting MySQL setup **
mysql 20:54:45.90 INFO  ==> Validating settings in MYSQL_*/MARIADB_* env vars
mysql 20:54:45.90 WARN  ==> You set the environment variable ALLOW_EMPTY_PASSWORD=yes. For safety reasons, do not use this flag in a production environment.
mysql 20:54:45.90 ERROR ==> root user is already created in the database and you can't use it as username for user creation.
...略...

查看一下我们的宿主机的挂载目录,是不是有了数据库的文件了
可以看到文件都有了

[root@localhost data]# pwd
/bitnami/mysql/data
[root@localhost data]# ls -al
总用量 95700
drwxrwxrwx. 7 root root     4096 1227 08:13  .
drwxr-xr-x. 3 root root       18 1227 07:53  ..
-rw-r-----. 1 1001 root       56 1227 08:12  auto.cnf
-rw-r-----. 1 1001 root     1814 1227 08:13  binlog.000001
-rw-r-----. 1 1001 root      180 1227 08:13  binlog.000002
-rw-r-----. 1 1001 root      157 1227 08:13  binlog.000003
-rw-r-----. 1 1001 root       48 1227 08:13  binlog.index
-rw-------. 1 1001 root     1680 1227 08:12  ca-key.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  ca.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  client-cert.pem
-rw-------. 1 1001 root     1680 1227 08:12  client-key.pem
-rw-r-----. 1 1001 root   196608 1227 08:13 '#ib_16384_0.dblwr'
-rw-r-----. 1 1001 root  8585216 1227 08:13 '#ib_16384_1.dblwr'
-rw-r-----. 1 1001 root     8001 1227 08:13  ib_buffer_pool
-rw-r-----. 1 1001 root 12582912 1227 08:13  ibdata1
-rw-r-----. 1 1001 root 12582912 1227 08:13  ibtmp1
drwxr-x---. 2 1001 root     4096 1227 08:13 '#innodb_redo'
drwxr-x---. 2 1001 root      187 1227 08:13 '#innodb_temp'
drwxr-x---. 2 1001 root      143 1227 08:13  mysql
-rw-r-----. 1 1001 root 30408704 1227 08:13  mysql.ibd
-rw-r-----. 1 1001 root        5 1227 08:13  mysql_upgrade_info
drwxr-x---. 2 1001 root     8192 1227 08:12  performance_schema
-rw-------. 1 1001 root     1680 1227 08:12  private_key.pem
-rw-r--r--. 1 1001 root      452 1227 08:12  public_key.pem
-rw-r--r--. 1 1001 root     1108 1227 08:12  server-cert.pem
-rw-------. 1 1001 root     1680 1227 08:12  server-key.pem
drwxr-x---. 2 1001 root       28 1227 08:13  sys
-rw-r-----. 1 1001 root 16777216 1227 08:13  undo_001
-rw-r-----. 1 1001 root 16777216 1227 08:13  undo_002

数据库操作

远程连接数据库,创建一个数据库,一个表
在这里插入图片描述
发现远程连接宿主机的3306端口连接不上,这是什么原因呢
查了一下,说的是,在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
dbeaver连接设置如下,设置好后,连接成功了
在这里插入图片描述
通过dbeaver来创建一个数据库,一个表

CREATE DATABASE `test`;
USE test;
CREATE TABLE `project` (`id` bigint(20) NOT NULL,`name` varchar(255) NOT NULL,`status` bit(1) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO test.project (id,name,status) VALUES(1,'项目1',1);

进入容器通过命令行查看数据

[root@localhost data]# docker exec -it mysql /bin/bash
I have no name!@9f8eadad1226:/$ mysql -uroot -p
Enter password: 
...略...
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from project;
+----+---------+----------------+
| id | name    | status         |
+----+---------+----------------+
|  1 | 项目1   | 0x01           |
+----+---------+----------------+
1 row in set (0.00 sec)

mysql容器误删演练

重点:删除容器,宿主机的挂载文件不会删除

[root@localhost data]# docker stop mysql
mysql
[root@localhost data]# docker rm mysql
mysql

再重新启动容器

docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0

参数–restart=always,我们等会重启系统时,mysql会自动重启(前提开启docker进程自动启动 systemctl enable docker)

新建一个容器,指定数据文件挂载点,检查数据是否还在。经过测试,数据依然还在的。

服务器重启演练

前提开启docker进程自动启动

 systemctl enable docker

重启操作系统,可以看到mysql随着系统启动,自动启起来了

其它问题

在用我的java应用程序连接mysql8.0时,连接Mysql8时 报错:
java.sql.SQLException: Unable to load authentication plugin ‘caching_sha2_password’

原因
不同版本的认证插件不同造成的
8版本前是:default_authentication_plugin=mysql_native_password
8版本后是:default_authentication_plugin=caching_sha2_password

解决办法
修改认证plugin,即添加环境变量MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password

docker run -d \-p 3306:3306 \--name mysql \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456\-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATE=utf8mb4_general_ci \-e TZ=Asia/Shanghai \-e MYSQL_AUTHENTICATION_PLUGIN=mysql_native_password \-v /bitnami/mysql/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:8.0

到这里,我们的MySQL就安装完成了

附:安装mysql5.7版本

[root@localhost ~]# mkdir -p /bitnami/mysql57/data
[root@localhost ~]# chmod 777 /bitnami/mysql57/datadocker run -d \-p 5566:3306 \--name mysql57 \--restart=always \-e ALLOW_EMPTY_PASSWORD=yes \-e MYSQL_ROOT_PASSWORD=123456 \-e MYSQL_CHARACTER_SET=utf8mb4 \-e MYSQL_COLLATION=utf8mb4_general_ci \-e MYSQL_ENABLE_SLOW_QUERY=1 \-e MYSQL_LONG_QUERY_TIME=5.0 \-e TZ=Asia/Shanghai \-v /bitnami/mysql57/data:/bitnami/mysql/data \-v /opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf:ro \bitnami/mysql:5.7

在启动应用程序连接MySQL时,发现报错了,查了一下,原来是MySQL表名大小写敏感的问题
可以在SQL命令行查询一下这个配置值

show variables like 'lower_case_table_names%';

lower_case_table_names=0说明对表名大小写敏感,故需要进行配置。
修改方式:在[mysqld]下加入一行:lower_case_table_names=1
最终my_custom.cnf文件如下

[root@localhost data]# cat /opt/bitnami/mysql/conf/my_custom.cnf
[mysqld]
max_allowed_packet    = 256M
innodb_log_file_size  = 256M
transaction-isolation = READ-COMMITTED
default_time_zone     = '+08:00'
lower_case_table_names=1

思考

如果通过docker-compose,那这个yaml应该怎么写呢

version: '2'
services:mysql:image: 'bitnami/mysql:8.0'environment:- ALLOW_EMPTY_PASSWORD=yes - MYSQL_ROOT_PASSWORD=123456- MYSQL_CHARACTER_SET=utf8mb4 - MYSQL_COLLATE=utf8mb4_general_ci - TZ=Asia/Shanghai ports:- '3306:3306'volumes:- '/opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf'- '/bitnami/mysql/data:/bitnami/mysql/data'

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

啊?这也算事务?!

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

【SAM系列】Auto-Prompting SAM for Mobile Friendly 3D Medical Image Segmentation

论文链接:https://arxiv.org/pdf/2308.14936.pdf 核心: finetune SAM,为了不依赖外部prompt,通过将深层的特征经过一个编-解码器来得到prompt embedding;finetune完之后做蒸馏

c语言:用指针输入两个数组|练习题

一、题目 利用指针&#xff0c;输入两个数组 如图&#xff1a; 二、代码截图【带注释】 三、源代码【带注释】 #include <stdio.h> int main() { int a[50]; int b[50]; int *paa,*pbb; //输入第一组数组 printf("请输入第一组5个数字&#xff1a;…

骑砍战团MOD开发(27)-module_tableau_materials.py材质

一.配置材质资源 OpenBrf寻找对应材质资源. tableau配置材质资源 ("round_shield_1", 0, "sample_shield_round_1", 512, 256, 0, 0, 0, 0,[(store_script_param, ":banner_mesh", 1),(set_fixed_point_multiplier, 100),(init_position, pos1),…

【中南林业科技大学】计算机组成原理复习包括题目讲解(超详细)

来都来了点个赞收藏关注一下再走呗&#x1f339;&#x1f339;&#x1f339;&#x1f339; 第1章&#xff1a;绪论 1.冯诺依曼机特点&#xff0c;与现代计算机的区别 冯诺依曼计算机的基本思想是&#xff1a;程序和数据以二进制形式表示&#xff0c;存储程序控制。在计算机中&…

ctfshow——文件上传

文章目录 文件上传思路web 151web 152web 153知识点解题 web 154web 155web 156web 157web 158web 159web160web 161 文件上传思路 web 151 打开页面显示&#xff1a;前台校验不可靠。说明这题是前端验证。 右键查看源代码&#xff0c;找到与上传点有关的前端代码&#xff1a…

Android 13 默认关闭 快速打开相机

介绍 在设置菜单的手势界面里&#xff0c;快速打开相机是默认开启的&#xff0c;此功能当开启时连续点击两次电源键会打开相机&#xff0c;现在客户需要默认关闭。 效果展示 修改 这里一开始想到的就是配置文件&#xff0c;在路径下果然找到了,从注释中看使我们需要的&#x…

Vue中使用JavaScript中的requestAnimationFrame动画循环实现循环滚动效果-demo

效果 requestAnimationFrame是一个由浏览器提供的 JavaScript 方法&#xff0c;用于在下一次浏览器重绘之前执行指定的回调函数。它接受一个回调函数作为参数&#xff0c;并返回一个整数值&#xff0c;可以用于取消动画循环。 使用 requestAnimationFrame 可以创建平滑的动画效…

机器学习分类

1. 监督学习 监督学习指的是人们给机器一大堆标记好的数据&#xff0c;比如&#xff1a; 一大堆照片&#xff0c;标记出哪些是猫的照片&#xff0c;哪些是狗的照片 让机器自己学习归纳出算法或模型 使用该算法或模型判断出其他没有标记的照片是否是猫或狗 上述流程如下图所…

二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)

目录 一、树概念及结构(了解) 1.1树的概念 1.2树的表示 二、二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3数据结构中的二叉树&#xff1a; 2.4特殊的二叉树&#xff1a; 2.5 二叉树的存储结构 2.51 顺序存储&#xff1a; 2.5.2 链式存储&…

1月2日代码随想录二叉树的最小深度及层序遍历总结

个人认为这么一个层序遍历的章节放这么多基本一样的题目算是很没意思的了 填充每个节点的下一个右侧节点和二叉树最大深度和前面的代码几乎完全一样&#xff0c;所以我就跳过了 代码随想录 (programmercarl.com) 代码随想录 (programmercarl.com) 111.二叉树的最小深度 给…

Ant Design Vue 编译后的网页特点是什么,怎么确认他是用的前端 Ant Design Vue 技术栈的呢?

Ant Design Vue 是一个前端 UI 框架&#xff0c;使用 Vue.js 构建。它包含了大量的预设样式和组件&#xff0c;如按钮、表单、表格等&#xff0c;可以帮助开发者快速构建出优雅且功能丰富的网页。但是&#xff0c;要确定一个编译后的网页是否使用了 Ant Design Vue&#xff0c;…

【解决】电脑上的WIFI图标不见了咋整?

相信不少同学都遇到过这种情况&#xff1a;电脑上的wifi图标莫名不见了&#xff0c;甚至有时候还是在使用的中途突然断网消失的。 遇到这种情况一般有两种解决方案&#xff1a; 1. 在开机状态下长按电源键30秒以上 这种办法应该是给主板放电&#xff0c;一般应用在wifi6上面。…

OpenCV实战 -- 维生素药片的检测记数

文章目录 检测记数原图经过操作开始进行消除粘连性--形态学变换总结实现方法1. 读取图片&#xff1a;2. 形态学处理&#xff1a;3. 二值化&#xff1a;4. 提取轮廓&#xff1a;5. 轮廓筛选和计数&#xff1a; 分水岭算法&#xff1a;逐行解释在基于距离变换的分水岭算法中&…

WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

文章目录 前言相关链接项目专栏运行环境匹配图片矩形鼠标绘制Halcon添加右键事件Task封装运行结果个人引用问题原因推测 圆形鼠标绘制代码运行结果 课程完结&#xff1a; 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原因无非是想换个工作。相关的教学视…

CUDA驱动深度学习发展 - 技术全解与实战

全面介绍CUDA与pytorch cuda实战 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c;项目管理专业人士&…

Flink实时电商数仓之DWS层

需求分析 关键词 统计关键词出现的频率 IK分词 进行分词需要引入IK分词器&#xff0c;使用它时需要引入相关的依赖。它能够将搜索的关键字按照日常的使用习惯进行拆分。比如将苹果iphone 手机&#xff0c;拆分为苹果&#xff0c;iphone, 手机。 <dependency><grou…

【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

目标&#xff1a;实现STM32连接阿里云物联网平台发送数据同时接收数据&#xff0c;IOT studio界面显示数据。具体来说&#xff1a;使用ESP8266 ESP-01来连接网络&#xff0c;获取设备数据发送到阿里云物联网平台并显示且oled显示屏当前的设备数据&#xff0c;通过IOT studio界面…

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…

Opencv(C++)学习之cv::calcHist 任意bin数量进行直方图计算

**背景&#xff1a;**当前网上常见的直方图使用方法都是默认使用256的范围&#xff0c;而对于使用特定范围的直方图方法讲的不够清楚。仔细研究后总结如下&#xff1a; 1、常见使用方法&#xff0c;直接对灰度图按256个Bin进行计算。 Mat mHistUn; int channels[1] { 0 }; {…