【Docker】Docker存储卷
文章目录
- 一、什么是存储卷
- 二、为什么需要存储卷
- 三、存储卷分类
- 四、管理卷Volume
- 创建卷
- 方式一:Volume 命令操作
- 方式二:-v 或者--mount 指定
- 方式三:Dockerfile 匿名卷
- 操作案例
- Docker 命令创建管理卷
- Docker -v 创建管理卷
- Docker mount 创建管理卷
- Docker 卷生命周期
- Docker 卷共享
- 五、绑定卷bind mount
- 创建卷
- -v 参数创建卷
- --mount 参数创建绑定卷
- 操作案例
- mount创建绑定卷
- -v创建绑定卷
- 绑定卷共享
- 六、临时卷 tmpfs
- 创建卷
- 方式一:指定--tmpfs 创建
- 方式二: --mount 指定参数创建
- 操作案例
- tmpfs 参数创建临时卷
- mount 创建临时卷
- tmpfs 失踪了
- 七、综合实战-MySQL 灾难恢复
- 八、扩展思考:存储卷在实际研发中带来了哪些问题?
一、什么是存储卷
存储卷 就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
宿主机的 /data/web 目录与容器中的 /container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容, 容器和宿主机的数据读写是同步的。

生活案例
存储卷就相当于租了个地下室,建立对应的映射就相当于有了这个地下室的钥匙,能够使用房子以外的空间。

如果有一天龙卷风来了,房子被吹毁了,但是地下室依然安然无恙,就相当于容器销毁了我们的这个地下室依然没有影响。

二、为什么需要存储卷
- 数据丢失问题
容器按照业务类型,总体可以分为两类:- 无状态的(数据不需要被持久化)
- 有状态的(数据需要被持久化)
显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。
虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、 Kafka 等有状态的业务。因此为了解决有状态业务的需求, Docker 提出了 卷(Volume) 的概念。
- 性能问题
UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如redis 在实现持化存储时,是在底层存储时的性能要求比较高。 - 宿主机和容器互访不方便
宿主机访问容器,或者容器访问要通过 docker cp 来完成,应用很难操作 - 容器和容器共享不方便
三、存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中
volumedocker 管理卷,默认映射到宿主机的/var/lib/docker/volumes目录下, 只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合。bind mount绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径, 在容器中也需要指定一个特定的路径, 两个已知的路径建立关联关系。tmpfs mount临时数据卷,映射到于宿主机内存中,一旦容器停止运行, tmpfs mounts 会被移除,数据就会丢失,用于高性能的临时数据存储。

四、管理卷Volume
创建卷
存储卷可以通过命令方式创建,也可以在创建容器的时候通过 -v and --mount 指定。
方式一:Volume 命令操作
命令清单如下:

docker volume create创建存储卷
- 语法
docker volume create [OPTIONS] [VOLUME]
- 关键参数
-d, --driver: 指定驱动,默认是 local--label: 指定元数据
- 样例
- 创建匿名卷
# 创建匿名卷
docker volume create
# 遍历卷
docker volume ls
# 查看卷的详细信息
docker volume inspect 1a9eb041a8b3b0143b6a58e0470366dfaf6c67ef05715a6d907d00b24e059193

- 创建有名卷
docker volume create myvoltest1

docker volume create --label MYTEST=1 myvoltest2

docker volume inspect查看卷详细信息
- 功能
查看卷的详细信息 - 语法
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
- 关键参数
-f:指定相应个格式,如json
- 样例
docker volume inspect myvotest3 myvotest4

docker volume ls列出卷
- 语法
docker volume ls [OPTIONS]
- 关键参数
--format: 指定相应个格式,如 json,table--filter,-f: 过滤-q: 仅显示名称
- 样例
#列出所有存储卷
docker volume ls
#指定存储卷格式
docker volume ls --format json
#过滤存储卷
docker volume ls -f label=MYTEST
#仅显示存储卷名称
docker volume ls -q

docker volume rm删除卷,需要容器不使用
- 语法
docker volume rm [OPTIONS] VOLUME [VOLUME...]
- 关键参数
-f,--force:强制删除
- 样例
# 删除存储卷
docker volume rm myvotest7 myvotest8
#写文件到宿主机目录下
echo "123" > /data/var/lib/docker/volumes/myvotest7/_data/1.txt

docker volume prune删除不使用的本地卷(匿名卷)
- 语法
docker volume prune [OPTIONS]
- 关键参数
--filter:过滤-f, --force:不提示是否删除
- 样例
docker volume prune

方式二:-v 或者–mount 指定
-v 和-mount 都可以完成管理卷的创建。
-v参数:完成目录映射
- 语法
docker run -v name:directory[:options] .........
- 参数
- 第一个参数:卷名称
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如 ro 表示 readonly
- 样例
- 创建容器时指定参数
docker run -d --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.24.0

- 进入容器中做首页的删除
docker exec -it myvolnginx1 bash
cd /usr/share/nginx/html/
rm index.html

- 查看宿主机存储卷目录下的文件
ls /data/var/lib/docker/volumes/volnginx1/_data

如果指定ro选项,那么容器中的文件是不能删除的。

--mount 参数完成目录映射
- 语法
--mount '<key>=<value>,<key>=<value>'
- 关键参数
type: 类型表示 bind, volume, or tmpfssource, src :对于命名卷,这是卷的名称。对于匿名卷,省略此字段destination, dst,target:文件或目录挂载在容器中的路径ro,readonly: 只读方式挂载
- 样例
💕 创建命名卷
docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.24.0

💕 创建匿名卷
docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.24.0

方式三:Dockerfile 匿名卷
通过 Dockerfile 的 VOLUME 可以创建 docker 管理卷。这个我们后续在 Dockerfile中详细讲解。
我们也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。
操作案例
Docker 命令创建管理卷
- 创建并绑定管理卷
docker volume create test1
docker run -d --name mynginx1 -p 8045:80 -v test1:/usr/share/nginx/html nginx:1.24.0

- 查看容器的具体绑定信息
docker inspect mynginx1

- 在宿主机上修改首页查看容器中的变化



Docker -v 创建管理卷
- 创建并绑定管理卷
docker run -d --name mynginx2 -v test2:/usr/share/nginx/html/:ro -p 8046:80 nginx:1.24.0

- 进入容器中看能否修改首页
docker exec -it mynginx2 bash
cd /usr/share/nginx/html
echo "hello from -v" > index.html

- 进入宿主机看能否修改首页内容

Docker mount 创建管理卷
- 创建管理卷并绑定到容器首页所在的目录
docker run -d --name mynginx3 -p 8047:80 --mount src=test3,dst=/usr/share/nginx/html/ nginx:1.24.0

- 在宿主机中修改首页内容查看发生的变化

Docker 卷生命周期
- 创建管理卷并绑定到容器首页所在的目录
docker run -d --name mynginx3 -p 8047:80 --mount src=test3,dst=/usr/share/nginx/html/ nginx:1.24.0

- 删除掉容器,查看卷中的内容是否被删除掉
#删除存储卷
docker volume rm test3

Docker 卷共享
- 创建三个容器并绑定到同一个管理卷下
docker run -d --name mynginx51 -p 8052:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
docker run -d --name mynginx52 -p 8053:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0
docker run -d --name mynginx53 -p 8054:80 -v test4:/usr/share/nginx/html/ nginx:1.24.0

- 进入宿主机中管理卷下查看首页内容
cd /data/var/lib/docker/volumes/test4/_data

- 在宿主机中修改管理卷下首页内容

同时,浏览器中也发生了改变。

五、绑定卷bind mount
创建卷
-v 参数创建卷
- 功能
完成卷映射 - 语法
docker run -v name:directory[:options] .........
- 参数
- 第一个参数: 宿主机目录,这个和管理卷是不一样的
- 第二个参数:卷映射到容器的目录
- 第三个参数:选项,如 ro 表示 readonly
- 样例
docker run -d --name mynginx6 -v /data/cjl/testbind:/usr/share/nginx/html/ nginx:1.24.0
docker inspect mynginx6

在宿主机上进行修改看容器中是否会发生改变

–mount 参数创建绑定卷
- 功能
完成目录映射 - 语法
--mount '<key>=<value>,<key>=<value>'
- 关键参数
type: 类型表示 bind, volume, or tmpfssource , src: 宿主机目录,这个和管理卷是不一样的。destination, dst,target:文件或目录挂载在容器中的路径ro,readonly: 只读方式挂载
- 样例
docker run -d --name mynginx7 --mount type=bind,src=/data/cjl/testmymountbind,dst=/usr/share/nginx/html/ nginx:1.24.0

在容器中创建文件,看是否会同步到宿主机中。
docker exec -it mynginx7 bash
echo "Hello bind by mount!" > index.html

操作案例
mount创建绑定卷
宿主机中目录不存在时,绑定卷会失败。
docker run -d --name mynginx8 --mount type=bind,src=/data/cjl/testbindmount1/,dst=/usr/share/nginx/html nginx:1.24.0

宿主机中目录存在时,绑定卷成功。
docker run -d --name mynginx8 --mount type=bind,src=/data/cjl/testbindmount2/,dst=/usr/share/nginx/html nginx:1.24.0

-v创建绑定卷
如果宿主机中目录不存在,-v方式可以创建
docker run -d --name mynginx9 -v /data/cjl/testbindmount3:/usr/share/nginx/html/ nginx:1.24.0

如果宿主机和容器中有同样名称的文件,会以宿主机中为主
echo "test -v volume" > index.html
docker run -d --name mynginx10 -v /data/cjl/testbindmount4:/usr/share/nginx/html/ nginx:1.24.0

绑定卷共享
启动两个nginx容器,并绑定到同一个宿主机目录下
docker run -d -p 8061:80 --name mynginx11 -v /data/cjl/testbindmount5/:/usr/share/nginx/html nginx:1.24.0

docker run -d -p 8062:80 --name mynginx12 -v /data/cjl/testbindmount5/:/usr/share/nginx/html nginx:1.24.0

六、临时卷 tmpfs
临时卷数据位于内存中,在容器和宿主机之外。
tmpfs 局限性
- 不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。
- 这个功能只有在 Linux 上运行 Docker 时才可用。
创建卷
方式一:指定–tmpfs 创建
- 功能
完成临时卷映射 - 语法
--tmpfs /app
- 样例
docker run -d --name mynginx15 --tmpfs /test1 nginx:1.24.0

方式二: --mount 指定参数创建
- 功能
完成目录映射 - 语法
--mount '<key>=<value>,<key>=<value>'
- 关键参数
type: 类型表示 bind, volume, or tmpfsdestination, dst,target:挂载在容器中的路径tmpfs-size: tmpfs 挂载的大小(以字节为单位)。默认无限制。tmpfs-mode: tmpfs 的八进制文件模式。例如, 700 或 0770。默认为 1777或全局可写。
- 样例
docker run -d --name mynginx16 --mount type=tmpfs,dst=/test2 nginx:1.24.0

操作案例
tmpfs 参数创建临时卷
docker run -d --name mynginx17 -p 8078:80 --tmpfs /usr/share/nginx/html/ nginx:1.24.0

重启容器后,nginx首页文件将不存在

mount 创建临时卷
docker run -d --name mynginx18 -p 8092:80 --mount type=tmpfs,dst=/usr/share/nginx/html/,tmpfs-size=1m nginx:1.24.0

当我们创建临时卷时指定挂载的大小时,如果有超过该大小的文件拷贝进入容器中不被允许。

tmpfs 失踪了
该案例主要要求我们掌握临时卷的创建方式,了解临时卷的特殊存储方式
运行一个容器,并在容器中创建一个文件,回到宿主机查找该文件,可以找到并且和容器中的一模一样。
docker run -d --name mynginx19 nginx:1.24.0

创建容器并绑定临时卷,在容器中对应的目录下创建标记文件,发现在宿主机中找不到该文件
docker run -d --name mynginx20 --mount type=tmpfs,dst=/test/ nginx:1.24.0

七、综合实战-MySQL 灾难恢复
💕 实战目的
掌握挂载卷的使用,将 mysql 的业务数据存储到外部
💕 实战步骤
使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 mysql-data 用来保存容器中产生的数据。需要在容器中连接 MySQL 服务, 并创建数据库 test, 并在在该数据库中创建一个简单的表并插入一些数据进来。
- 启动mysql容器并绑定到宿主机的指定目录
docker run --name mysql2 -v /data/cjl/mysql2test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
#在容器中登录mysql
mysql -h localhost -uroot -p


- 不小心删除掉mysql容器

- 启动一个新的容器,绑定到宿主机原来的目录
docker run --name mysql2new -v /data/cjl/mysql2test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

- 进入新的容器,检查数据究竟是否还在

因此,存储卷只要我们不是人工删除,它在容器删除后也不会自动销毁。
八、扩展思考:存储卷在实际研发中带来了哪些问题?
- 跨主机使用
docker 存储卷是使用其所在的宿主机上的本地文件系统目录,也就是宿主机有一块磁盘,这块磁盘并没有共享给其他的 docker 主机,容器在这宿主机上停止或删除,是可以重新再创建的,但是不能调度到其他的主机上,这也是 docker 本身没有解决的问题,所以 docker 存储卷默认就是 docker 所在主机的本地,但是自己搭建一个共享的 NFS 来存储 docker 存储的数据,也可以实现, 但是这个过程强依赖于运维人员的能力。
所以未来应用的存储和数据往往分离,越来越多的分布式存储方案出现,如 s3 系列,nfs 等。 - ** 启动参数未知**
容器有一个问题,一般与进程的启动不太一样,就是容器启动时选项比较多,如果下次再启动时,很容器会忘记它启动时的选项,所以最好有一个文件来保存容器的启动,这就是容器编排工具的作用。
一般情况下,是使用命令来启动操作 docker,但是可以通过文件来读,也就读文件来启动,读所需要的存储卷等,但是它也只是操作一个容器,如果要几十上百个容器操作,就需要专业的容器编排工具。
这种一般像开源的 k8s,各个云厂商也有自己的企业版编排软件。 - 复杂场景仍然需要运维
对于有状态要持久的集群化组件,如 mysql 的主从。部署维护一个 Mysql 主从需要运维知识、经验整合进去才能实现所谓的部署,扩展或缩容,出现问题后修复,必须要了解集群的规模有多大,有多少个主节点,有多少个从节点,主节点上有多少个库,这些都要一清二楚,才能修复故障,这些就强依赖于运维经验。
这种复杂的场景往往还是需要人力,很难有完美的工具出现。
相关文章:
【Docker】Docker存储卷
文章目录 一、什么是存储卷二、为什么需要存储卷三、存储卷分类四、管理卷Volume创建卷方式一:Volume 命令操作方式二:-v 或者--mount 指定方式三:Dockerfile 匿名卷 操作案例Docker 命令创建管理卷Docker -v 创建管理卷Docker mount 创建管理…...
基于python的租车管理平台/汽车租赁网站
功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括:首页、详情页、用户中心、家政入驻模块。后台功能包括:总览、车辆管理、分类管理…...
【JVM】双亲委派机制
📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 双亲委派机制 在Java中如何使用代码的方式去主动加载一个类呢? 方式1:使用Class.forName方法,使用当前类的类加载…...
分布式id实战
目录 常用方式 特征 潜在问题 信息安全 高性能 UUID 雪花算法 数据库生成 美团Leaf方案 Leaf-segment 数据库方案 Leaf-snowflake 方案 常用方式 uuid雪花算法数据库主键 特征 全局唯一趋势递增信息安全 潜在问题 信息安全 如果id连续递增, 容易被爬虫, 批量下…...
深入了解 SOCKS5 代理、代理 IP 和 HTTP
在网络通信和数据传输中,代理服务器扮演着至关重要的角色。本文将深入探讨 SOCKS5 代理、代理 IP 和 HTTP,揭示它们的工作原理、应用场景以及优缺点。 1. SOCKS5 代理 SOCKS(Socket Secure)是一种网络协议,允许客户端…...
外包干了3个多月,技术退步明显。。。。
先说一下自己的情况,本科生,19年通过校招进入广州某软件公司,干了接近3年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
Unity之闪电侠大战蓝毒兽(简陋的战斗系统)
目录 🎨一、创建地形 🎮二、创建角色 🏃2.1 动画 🏃2.2 拖尾 🏃2.3 角色控制 🏃2.4 技能释放 🏃2.5 准星 📱三、创建敌人 🐲3.1 选择模型 🐲3.…...
C# 菜鸟级别有关于redis的使用
public IActionResult Index() { ConnectionMultiplexer _conn ConnectionMultiplexer.Connect("127.0.0.1:6379");//初始化 var database _conn.GetDatabase(7);//指定连接的库 0 RedisHelper redisHelper new Redi…...
AlexNet的出现推动深度学习的巨大发展
尽管AlexNet(2012)的代码只比LeNet(1998)多出几行,但学术界花了很多年才接受深度学习这一概念,并应用其出色的实验结果。 AlexNet(由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…...
2024面试offer收割宝典字节篇
1.IO 模型有哪些,讲讲你理解的 nio ,他和 bio,aio 的区别是啥, 谈谈 reactor 模型。 IO 模型主要包括以下几种:1. 阻塞 I/O (BIO): 当一个线程调用 read() 或 write() 系统调用时,如果数据没有准备好或者缓冲区已满,则该线程会被操作系统阻塞,直到有数据可读或写入完…...
冒泡排序及其优化
冒泡排序 int[] arr {1,3,2,9,4,7,2,8};//比较多少轮(n个数字比较n-1次)for(int i0,n arr.length;i<n-1;i) {//每轮比较多少次(n-1-i次)for(int j 0;j<n-1-i;j) {//两两比较if(arr[j] > arr[j1]) { //比较结果为升序排列,如果想要降序排列结果将 >…...
【医学大模型 补全主诉】BioGPT + LSTM 自动补全医院紧急部门主诉
BioGPT LSTM 自动补全医院紧急部门主诉 问题:针对在紧急部门中自动补全主诉的问题子问题1: 提高主诉记录的准确性子问题2: 加快主诉记录的速度子问题3: 统一医疗术语的使用子问题4: 减少打字错误和误解子问题5: 提高非特定主诉的处理能力 解法数据预处理神经网络方…...
HCIE-Datacom证书有效期多久?HCIE考试有哪些内容?
如今越来越多的人开始关注并参与到华为认证的学习中来。 其中,华为认证数据通信专家(HCIE-Datacom)作为华为认证体系中的高级认证,备受瞩目。 那么,关于HCIE-Datacom证书的有效期以及HCIE考试的内容,你知道多少呢?下…...
OpenCV中的边缘检测技术及实现
边缘检测是在电脑如何理解图片这一问题中的一环,它帮助电脑找出照片里的轮廓和分界线。想象一下你在看一幅黑白漫画,轮廓线定义了每一个角色和物体,而电脑要做的,就是通过边缘检测来找出这些线条。这在很多像是图像分析这样的领域…...
机器学习基础(一)理解机器学习的本质
导读:在本文中,将深入探索机器学习的根本原理,包括基本概念、分类及如何通过构建预测模型来应用这些理论。 目录 机器学习 机器学习概念 相关概念 机器学习根本:模型 数据的语言:特征与标签 训练与测试…...
Eclipse - Makefile generation
Eclipse - Makefile generation References right mouse click on the project -> Properties -> C/C Build -> Generate Makefiles automatically 默认会在 Debug 目录下创建 Makefile 文件。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/...
Sora:新一代实时音视频通信框架
一、Sora简介 Sora是一个开源的实时音视频通信框架,旨在提供高效、稳定、可扩展的音视频通信解决方案。它基于WebRTC技术,支持跨平台、跨浏览器的实时音视频通信,并且具备低延迟、高并发、易集成等特点。 --点击进入Sora(一定要科学哦&#x…...
龟兔赛跑算法
一、题目 给定一个长度为 n1 的数组nums,数组中所有的数均在 1∼n1 的范围内,其中 n≥1。 请找出数组中任意一个重复的数。 样例 给定 nums [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。 二、解析 解决这个问题的一种有效方法是使用快慢指针…...
Yii2项目使用composer异常记录
问题描述 在yii2项目中,使用require命令安装依赖时,出现如下错误提示 该提示意思是:composer运行时,执行了yiisoft/yii2-composer目录下的插件,但是该插件使用的API版本是1.0,但是当前的cmposer版本提供的…...
【蓝桥杯 2021】图像模糊
图像模糊 题目描述 小蓝有一张黑白图像,由 nm 个像素组成,其中从上到下共 n 行,每行从左到右 m 列。每个像素由一个 0 到 255 之间的灰度值表示。 现在,小蓝准备对图像进行模糊操作,操作的方法为: 对于…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
