Docker 使用下 (二)
Docker 使用下 (二)
文章目录
- Docker 使用下 (二)
- 前言
- 一、初识Docker
- 1.1 、Docker概述
- 1.2 、Docker的历史
- 1.3 、Docker解决了什么问题
- 1.4 、Docker 的优点
- 1.5 、Docker的架构图
- 二、镜像
- 三、容器
- 四、数据卷
- 4.1、数据卷的概念
- 4.2 、数据卷的作用
- 4.3 、配置容器数据卷
- 五、搭建服务
- 5.1、创建容器步骤
- 六、DockerFile
- 6.1 、Docker镜像原理
- 6.2 、Docker镜像如何制作
- 6.2.1、容器转为镜像
- 6.2.2、压缩文件转变为镜像
- 6.3 Dockerfile概念
- 6.4 制作dockerfile文件
- 6.4.1 制作项目jar文件
- 6.4.2 下载idk8镜像
- 6.4.3 创建dockerfile文件
- 6.4.4 编写dockerfile文件
- 6.4.5 执行生成镜像
- 6.4.6 把镜像生成为容器
- 6.4.7 测试
- 七、Docker服务编排
- 7.1 服务编排概念
- 7.2 Docker Compose 概述
- 7.3 Docker Compose安装和使用
- 7.4 Docker compose卸载
- 7.5 使用Docker compose编排项目
- 7.5.1 创建文件夹
- 7.5.2 创建docker-compose.yml
- 7.5.3 编写docker-compose.yml
- 7.5.4 创建./nginx/conf.d日录
- 7.5.5 编写nginx的配置文件
- 7.5.6 使用docker-compose启动容器
- 7.5.7 测试访问
- 八、Docker容器虚拟化与传统虚拟机的比较
- 8.1 什么是虚拟机
- 8.2 什么是Docker
- 8.3 区别
- 8.4 注意区别总结
前言
我们写的代码会接触到好几个环境:开发环境,测试环境以及生产环境,导致代码"水土不服"的问题该怎么解决?开发人员可以把容器(代码+环境)统一发给测试人员,测试人员测试通过后再把容器发给运维人员,从而解决了软件跨环境迁移的所导致的水土不服的问题。
一、初识Docker
1.1 、Docker概述
Docker是一个开源的应用容器引擎,基于 Go 语言并从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中然后发布到任何流行的 Linux机器上,也可以实现虚拟化。容器是完全使用 沙箱 机制,相互之间不会有任何接口(类似 ipPhone 的 app),更重要的是容器性能开销极低。
什么是沙箱?沙箱也叫网络编程虚拟执行环境, 英文名sandbox(sandboxie),可以看做是一种容器,里面所做的一切都可以推倒重来。
原理引用官方网站的一段话:电脑就像一张纸,程序的运行与改动,就像将字写在纸上,而Sandboxie就相当于在纸上放了块玻璃,程序的运行与改动就像写在了那块玻璃上,除去玻璃,纸上还是一点改变都没有的,它创造了一个类似沙盒的独立作业环境,在其内部运行的程序并不能对硬盘产生永久性的影响。其为一个独立的虚拟环境,可以用来测试不受信任的应用程序或上网行为。
Docker从17.3版本之后,分为CE版(社区版),和EE版(企业版)
1.2 、Docker的历史
Docker 公司位于旧金山,由法裔美籍开发者和企业家 Solumon Hykes 创立,其标志如下图所示。
1.3 、Docker解决了什么问题
- 解决了环境配置的难题。软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?
- 用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。
- 如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:“它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。
- 环境配置如此麻烦,换一台机器,就要重来一次,旷日楚时,很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境-模一样地复制过来。
1.4 、Docker 的优点
Docker是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件,借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
1.5 、Docker的架构图
镜像,容器和仓库的关系?
- 镜像(lmage) :Docker镜像,就相当于是一个root文件系统。镜像相当于java中的一个类,是一个模板,一个镜像可以生成多个容器实例。
- 容器(Container): 镜像和容器的关系就像是类与对象的关系一样。镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建,启动,停止,删除,暂停等。
- 仓库(Repository):仓库可以看做是一个代码控制中心,或者Maven中央仓库,用来保存镜像。
二、镜像
相当于还没有安装的app
REPOSITORY
: 表示镜像的仓库源
TAG
: 镜像的标签
IMAGE ID
: 镜像的ID(唯一的主键)
CREATED
: 镜像的创建时间
SIZE
: 镜像的大小
docker images[参数]
-a#列出本地所有的镜像,含中间映像层
-q #只返回镜像Id
-qa #-a与 -q的组合参数
-digests #一些镜像的摘要说明
--no-trunc #显示完整的镜像信息
三、容器
相当于已经安装好的App
镜像与容器,宿主机的关系:
docker的图标就是一个鲸鱼上面装有很多集装箱,鲸鱼游在大海里,大海就是宿主机,鲸鱼背上的集装箱就是一个个的容器实例,这个容器实例就来源于镜像生成的。
有镜像才能创建容器,Docker利用容器独立运行一个或一组应用。容器是用镜像创建的运行实例。它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证平台的安全。
可以把容器看做是一个简易版的linux运行环境,包括运行在里面的应用程序。Docker启动是秒级的,容器只保留了内核,把硬件,网络,打印机不相关的统统去掉了,所以它运行就快。
四、数据卷
4.1、数据卷的概念
- 问题1: docker容器删除后,在容器中产生的数据还在吗?
- 问题2: docker容器和外部机器可以直接交换文件吗?
- 问题3: 容器之间想要进行数据交换该怎么解决?
数据卷是宿主机中的一个目录或文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂载,一个容器也可以挂载多个数据卷。
4.2 、数据卷的作用
- 容器数据持久化
- 外部机器和容器间接通信
- 容器之间数据交换
4.3 、配置容器数据卷
直接使用命令来挂载
需要先使用镜像来启动成为容器
docker run -it -v #主机目录:容器目录
#例如:
docker run -it -v /home/cesi:/home --name=centos0l centos /bin/bash
写入文件
echo "abc">a.txt
查看是否挂载成功
docker inspect 容器ID
双向绑定,数据同步
我们以后修改只需要在本地修改即可,容器内会自动同步!
注意事项:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
五、搭建服务
5.1、创建容器步骤
设置端口、运行容器做数据挂载、端口映射、目录映射
- 容器内的网络服务和外部机不能直接通信
- 外部机器和宿主机可以直接通信
- 宿主机和容器可以直接通信
- 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机的该端口,从而间接访问容器的服这种操作叫做端口映射。
六、DockerFile
思考:
- Docker镜像本质是什么?
- Docker中一个
centos
镜像为什么只有200MB
,而一个centos
操作系统的iso
文件要几个G? - Docker中一个tomcat镜像为什么有
500M
B,而一个tomcat
安装包只有70MB
呢?
6.1 、Docker镜像原理
操作系统组成部分:
- 进程调度子系统
- 进程通信子系统
- 内存管理子系统
- 设备管理子系统
- 网络通信子系统
- 作业控制子系统
- 文件管理子系统
Linux 的文件系统由
bootfs
和rootfs
两部分组成。fs
是fle system
的简写,包含bootloader
(引导加载程序)和kemel(内核)
。roots是root文件系统,包含的就是典型Linux系统中的
/dev,/proc,/bin,/etc
等标准目录与文件。不同的Linux
发行版,boots基本一样,而rootf不同
,如ubuntu与centos等。
docker镜像是由特殊的文件叠加而成,最底端是boots,并使用宿主机的boots,就是说我们启动了一个 Linux 的操作系统,在上面安装了一个docker,Linux 启动的时候要把内核加载起来,而docker的镜像启动的时候,也需要加载内核,boots 但不需要再次加载了,使用宿主机的 bootfs,第二层是 root 文件系统 rootfs ,称为base image
,然后再往上可以叠加其他的镜像文件
当你去下载
tomcat
的时候,它就去检查看看有没有idk
,没有就去下载jdk
,再往下看有没有基础镜像,没有则继续下载,这三部分组合起来称之为tomcat镜像
,对外暴露的tomcat
,它是一个只读镜像,这就是我说的镜像就是一个千层饼。下载好tomcat
以后,我们再要去下载一个nginx
,这时候nginx
也需要基础镜像,它就不会再去下载了,而直接使用下载好的基础镜像,基础的每一层镜像都可以被别人复用。一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像。这些只读镜像都不能改动,因为你改动了,别的镜像就不可以进行复用了。当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
知道了docker的组成结构后,回答3个问题
- Docker镜像本质是什么?
答:是一个分层文件系统
- Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个GB?
答:centos的iso镜像文件包含bootfs和rootfs所以很大,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层,所以就小。
- Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70MB呢?
答:由于docker中镜像是分层的,tomcat虽然只有70MB,但它需要依赖父镜像和基础镜像,所以整个对外暴.的tomcat镜像就是500多MBdocker inspect tomcat:latest #查看镜像的详细信息
docker inspect tomcat:latest #查看镜像的详细信息
6.2 、Docker镜像如何制作
6.2.1、容器转为镜像
docker commit 容器id 镜像名称:版本号
查看镜像
docker images
把容器转成镜像后,再把镜像转成压缩文件,这样就可以直接把压缩文件发给测试人员,测试人员把镜像还原成容器,就可以直接测试了。
镜像不可以直接传输只能转变为压缩文件才能传输。
镜像转变为压缩文件:
docker save -o 压缩文件名称 镜像名称:版本号
6.2.2、压缩文件转变为镜像
docker load -i 压缩文件名称 #i 就是input的意思
示例命令:
docker commit 04adada1e7f5 msi_tomcat:1.0 #把容器转变为镜像
docker save o msj_tomcat.tar msj_tomcat:1.0 #把镜像做成压缩文件
ll #查看生成的文件
#解压测试
docker rmi bef5472c2c00 #删除由容器转换成的镜像
docker oad i msj_tomcat.tar #解压缩镜像
总结:
1、由容器转为镜像
2、镜像转变为压缩文件
3、下载压缩文件,交由测试人员
4、测试人员拿到压缩文件,上传到宿主机
5、把压缩文件转化为镜像
6、由镜像再启动为容器
注意:数据卷挂载的文件,不会连同一起打成压缩文件。
6.3 Dockerfile概念
dockerfle 本质上是一个文本文件,包含了一条条的指令,是用来制作镜像的。每一条指令构建一层镜像,基于基础镜像,最终构建出一个新的镜像,对于开发人员,dockerfile可以为开发团队提供一个完全一致的开发环境。对于运维人员,在部署时,可以实现应用的无缝移植。
去官网上查看其他 dockerfile
https://hub.docker.com
构建mysql的Dockerfile命令行:
https://github.com/CentOs/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /LABEL \org.label-schema.schema-version="1.0" \org.label-schema.name="CentOS Base Image" \org.label-schema.vendor="CentOS" \org.label-schema.license="GPLv2" \org.label-schema.build-date="20201113" \org.opencontainers.image.title="CentOS Base Image" \org.opencontainers.image.vendor="CentOS" \org.opencontainers.image.licenses="GPL-2.0-only" \org.opencontainers.image.created="2020-11-13 00:00:00+00:00"CMD ["/bin/bash"]
常用的 DockerFile 关键字列表
6.4 制作dockerfile文件
dockerfile文件编写命令行步骤
#1 定义父镜像 FROM java:8
#2 定义作者信息 MAINTAINER jShuai <3284484@qq.com>
#3 将jar包添加到容器 ADD docker-demo-01-0.0.1-SNAPSHOT.jar app.jar
#4 定义容器启动执行的命令 CMD java -jar app.jar
#5 通过dockerfile构建镜像 docker build -f dockerfile文件路径 -t 镜像名称:版本
学习目的:制作dockerfile文件,发布并部署springboot项目
6.4.1 制作项目jar文件
制作springboot项目jar文件,上传到根目录的dockerfile文件夹下
6.4.2 下载idk8镜像
docker pull java:8
6.4.3 创建dockerfile文件
vim springboot_dockerfile
6.4.4 编写dockerfile文件
ROM java:8
MAINTAINER jShuai <3284484@qq.com>
ADD docker-demo-01-0.0.1-SNAPSHoT.jar app.jar
CMD java -jar app.jar
6.4.5 执行生成镜像
docker build -f ./springboot_dockerfile -t app
6.4.6 把镜像生成为容器
docker run -id -p 9000:8080 --name=app app
6.4.7 测试
http://192.168.0.101:9000/he71o
七、Docker服务编排
7.1 服务编排概念
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动和停止,维护的工作量会很大。双11的时候,阿里的微服务达到上万个。我们自己部署项目都会部署在docker之中,其中启动的容器不仅仅有我们的项目,还有redis,mysql,nginx,还有tomcat等一些应用软件。
服务编排就是按照一定的业务规则批量的管理容器
7.2 Docker Compose 概述
DockerCompose
是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止,使用步骤:
- 利用
dockerfile
定义运行环境镜像- 利用
docker-compose.yml
定义组成应用的各服务- 运行
docker-compose up
启动应用
7.3 Docker Compose安装和使用
我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:
https://github.com/docker/compose/releases
运行以下命令以下载 Docker Compose 的当前稳定版本:
curl -L "https://github.com/docker /compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o
/usr/local/bin/docker-compose
要安装其他版本的 Compose,请替换1.29.2。
网速较慢的话用
curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m`> /usr/local/bin/docker-compose
将可执行权限应用于二进制文件:
chmod +x/usr/local/bin/docker-compose
测试是否安装成功:
docker-compose -v
7.4 Docker compose卸载
#二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
7.5 使用Docker compose编排项目
7.5.1 创建文件夹
mkdir ~/docker-compose
7.5.2 创建docker-compose.yml
cd ~/docker-compose
vim docker-compose.yml
7.5.3 编写docker-compose.yml
version:'3'
services:nginx:image:nginxports:- 80:80links:- appvolumes :# 数据卷挂载- ./nginx/conf.d:/etc/nginx/conf.dapp:image: appexpose:-"8080"
说明:
Tinks: #当前的nginx可以访问到app项目
volumes: #数据卷挂载
7.5.4 创建./nginx/conf.d日录
mkoir -n./nginx/conf.d
cd ./nginx/cof.d
ll
vim nginx.conf
7.5.5 编写nginx的配置文件
server{listen 80;access_log off;location /{proxy_pass http://app:8080;}
}
7.5.6 使用docker-compose启动容器
cd ../../ #放到docker-compose目录之下
docker-compose up
#或者后台启动
docker-compose up -d
7.5.7 测试访问
http://192.168.0.101/hello
八、Docker容器虚拟化与传统虚拟机的比较
8.1 什么是虚拟机
虚拟机在本质上就是在模拟一台真实的计算机设备,同时遵循同样的程序执行方式。虚拟机能够利用"虚拟机管理程序"运行在物理设备之上。反过来,虚拟机管理
程序则可运行在主机设备或者“裸机”之上。传统的虚拟机需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给他的资源将全部被占用。,每一个虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
8.2 什么是Docker
Docker是一个集开发、打包、运行应用于一体的开放式平台。Docker可以用来快速交付应用。使用Docker,你可以将应用程序从你的基础设施中分离出来,并将基础设施当做一个管理平台。Docker可以加快打包时间,加快测试,加快发布,缩短开发及运行代码之间的周期。Docker通过结合内核容器化特点和工作流,并使之工具化来实现这一切,帮助管理和发布你的应用。
8.3 区别
相同点:
容器与虚拟机具有相似的资源隔离和分配优势
不同:
容器虚拟化的是操作系统,虚拟机虚拟化的是硬件
传统虚拟机可以运行不同的操作系统,容器只能运行同一类型操作系统
8.4 注意区别总结
Docker和虚拟机有各自擅长的领域,在软件开发、测试场景和生产运维场景中各有优劣。
Docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。
Docker需要的资源更少,Docker在操作系统级别进行虚拟化,Docker容器和内核交互,几平没有性能损耗Docker更轻量,Docker的架构可以共用一个内核与共享应用程序库,所占内存极小,同样的硬件环境,DocKer运行的镜像数远多于虑拟机数量,对系统的利用率非常高。
相关文章:
Docker 使用下 (二)
Docker 使用下 (二) 文章目录 Docker 使用下 (二)前言一、初识Docker1.1 、Docker概述1.2 、Docker的历史1.3 、Docker解决了什么问题1.4 、Docker 的优点1.5 、Docker的架构图 二、镜像三、容器四、数据卷4.1、数据卷的概念4.2 、…...
【群晖NAS】Docker + WebStation + DDNS 部署无端口号HTTPs WordPress
前言 群晖提供官方的DDNS服务,可以直接配置一个类似于xxxx.synology.me的DDNS解析IPv4/IPv6到自己的NAS;群晖还有Web Station应用可以配置Docker的端口号映射,但是他自己占用了80端口,如果给自己的应用手动指定其他端口号&#x…...
手机SIM卡打电话时识别对方按下的DTMF按键(二)
手机SIM卡打电话时识别对方按下的DTMF按键(二) --本地AI电话机器人 前言 书接上篇,在上一篇章《手机打电话时如何识别对方按下的DTMF按键的字符》中,我们从理论的角度来论述了DTMF的频率组成。并尝试使用400Kb左右的【TarsosDS…...
N-Gram 模型
N-Gram 模型 什么是N-Gram?为什么叫 N-Gram?N-Gram怎么知道下一个词可能是什么?N-Gram 能做什么?N-Gram的问题 本文回答了四个问题: 一、N-Gram是什么?二、N-Gram为什么叫N-Gram?三、N-Gram具体…...
【漫话机器学习系列】240.真正类率(True Positive Rate,TPR)
理解真正类率(True Positive Rate,TPR):公式、意义与应用 在机器学习与深度学习模型评估中,"真正类率"(True Positive Rate,简称TPR)是一个非常重要的指标。TPR反映了分类…...
ThreadLocal源码深度剖析:内存管理与哈希机制
ThreadLocal是Java并发编程中的重要工具,它为每个线程提供独立的变量存储空间,实现了线程之间的数据隔离。本文将从源码实现角度,深入分析ThreadLocal的内部机制,特别是强弱引用关系、内存泄漏问题、ThreadLocalMap的扩容机制以及…...
Softmax回归与单层感知机对比
(1) 输出形式 Softmax回归 输出是一个概率分布,通过Softmax函数将线性得分转换为概率: 其中 KK 是类别数,模型同时计算所有类别的概率。 单层感知机 输出是二分类的硬决策(如0/1或1): 无概率解释&#x…...
数字社会学家唐兴通谈数字行动主义网络行动主义与标签行动主义,理解它才算抓住AI社会学与网络社会学关键所在
让我们继续探讨一个在数字时代至关重要的概念——数字行动主义(Digital Activism)、网络行动主义(Cyberactivism)以及标签行动主义(Hashtag Activism)。我将尽力从一个数字社会学家的角度,抽丝剥…...
PandasAI:对话式数据分析新时代
PandasAI:对话式数据分析新时代 引言项目概述分析基本信息 核心功能详解1. 自然语言查询处理2. 数据可视化生成3. 多数据源集成分析4. 安全沙箱执行5. 云平台协作功能 安装和使用教程1.环境要求2.安装步骤3.基本使用方法4.切换其他LLM 应用场景和实际价值1.适用业务…...
全球化电商平台AWS云架构设计
业务需求: 支撑全球三大区域(北美/欧洲/亚洲)用户访问,延迟<100ms处理每秒50,000订单的峰值流量混合云架构整合本地ERP系统全年可用性99.99%满足GDPR和PCI DSS合规要求 以下是一个体现AWS专家能力的全球化电商平台架构设计方…...
Linux 怎么使用局域网内电脑的网络访问外部
一次性 export http_proxy"http://192.168.0.188:7890" export https_proxy"http://192.168.0.188:7890"一直生效 写入 ~/.bashrc(或 ~/.bash_profile) nano ~/.bashrc加入这一行: export http_proxy"http://19…...
Python-numpy中ndarray对象创建,数据类型,基本属性
numpy库 numpy中的数据结构ndarrayndarray中的dtypendarray中的dtype的指定方式创建ndarray及指定dtype从列表创建ndarray使用 np.empty(), np.zeros(), np.ones() 和 np.full() 创建特定值的数组使用 np.arange() 创建等差数列数组使用 np.linspace() 创建等差数组使用np.logs…...
Python从入门到高手8.2节-元组的常用操作符
目录 8.2.1 元组的常用操作符 8.2.2 []操作符: 索引访问元组 8.2.3 [:]操作符:元组的切片 8.2.4 操作符:元组的加法 8.2.5 *操作符:元组的乘法 8.2.6 元组的关系运算 8.2.7 in操作符:查找元素 8.2.8 五一她玩了个狗吃…...
Python内置函数
Python作为一门简洁强大的编程语言,提供了丰富的内置函数(Built-in Functions),这些函数无需导入任何模块即可直接使用。本文将介绍Python中最常用、最重要的内置函数,帮助初学者快速掌握这些强大的工具。 官方地址&a…...
一款基于 .NET 开源的多功能的 B 站视频下载工具
前言 哔哩哔哩(B站)是一个知名的视频学习平台,作为程序员而言这是一个非常值得推荐的网站。今天大姚给大家推荐一款基于 .NET 开源的多功能的 B 站视频下载工具:downkyi。 项目介绍 downkyi(哔哩下载姬)…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.2 数据分组与透视(CUBE/ROLLUP/GROUPING SETS)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.2 数据分组与透视:CUBE/ROLLUP/GROUPING SETS深度解析5.2.1 数据准备与分析目标数据集与表结构分析目标 5.2.2 ROLLUP:层级化分组汇总功能与语法示…...
20、数据可视化:魔镜报表——React 19 图表集成
一、魔镜的预言本质 "数据可视化是霍格沃茨的预言水晶球,将混沌的数据星尘转化为可解读的命运轨迹!" 魔法部占卜司官员挥舞魔杖,Echarts与Three.js的图表矩阵在空中交织成动态星图。 ——基于《国际魔法联合会》第9号可视化协议&a…...
笔记本电脑升级计划(2017———2025)
ThinkPad T470 (2017) vs ThinkBook 16 (2025) 完整性能对比报告 一、核心硬件性能对比 1. CPU性能对比(i5-7200U vs Ultra9-285H) 参数i5-7200U (2017)Ultra9-285H (2025)提升百分比核心架构2核4线程 (Skylake)16核16线程 (6P8E2LPE)700%核心数制程工…...
Flutter——数据库Drift开发详细教程(四)
目录 参考正文表达式1.比较2.布尔代数3.算术BigIn 4.空值检查6.日期和时间7.IN和NOT IN8.聚合函数(例如 count 和 sum)8.1比较8.2算术8.4计数8.5group_concat8.9窗口函数 9.数学函数和正则表达式10.子查询10.1 标量子查询10.2 isInQuery10.3 存在10.4完整…...
android-ndk开发(6): 查看反汇编
android-ndk开发(6): 查看反汇编 2025/05/05 1. 概要 android-ndk 是基于 clang 的工具链, clang 则保持了和 gcc 的高度兼容。 在 Linux 开发机上, GCC 套件里的 objdump 提供了反汇编的功能。 实际上 android-ndk 也提供了一份 objdump,…...
浅析AI大模型为何需要向量数据库?【入门基础】
文章目录 引言:大模型时代的存储挑战一、向量数据库:大模型的"海马体"1.1 什么是向量数据库?1.2 为什么大模型离不开向量数据库?(1) 嵌入(Embedding)的本质(2) 突破上下文窗口限制 二、相似性度量:欧氏距离与…...
Java面试:微服务与大数据场景下的技术挑战
面试对话场景 第一轮:基础知识考察 面试官:谢先生,您能简单介绍一下Java SE 8的新特性吗? 谢飞机:当然,Java SE 8引入了Lambda表达式、Stream API和新的日期时间API,大大简化了代码编写。 面…...
[前端]异步请求的竞态问题
竞态条件简介 遇到的问题 切换标签请求数据,但又快速切换标签请求数据,展示的是前一个标签的数据, 需要在切换标签时添加取消请求的机制,使用AbortController来取消正在进行的请求。当用户快速切换标签时,取消之前的请…...
【PDF拆分+提取内容改名】批量拆分PDF提取拆分后的每个PDF物流面单数据改名或导出表格,基于WPF的PDF物流面单批量处理方案
应用场景 物流行业每天需要处理大量包含物流面单的PDF文件,这些文件通常包含运单号、收发货人信息、货物详情等重要数据。传统手动处理方式效率低下且容易出错。本方案通过WPF实现一个自动化工具,能够: 批量拆分多页PDF为单页文件提取每页面单中的关键信息(如运单号、收件人…...
adb无线调试步骤
环境: macOS; 换成 linux 或 windows 也支持的小米15 Pro; 换成其他 android 手机也支持的 电脑和手机接入相同Wifi在电脑上,确保安装了 adb 对于 Android 开发者, 一般是是通过 Android Studio 安装对于 ndk 开发者…...
RocketMQ与Kafka的区别
文章目录 相同之处不同之处存储形式性能对比传输系统调用存储可靠性单机支持的队列数延时消息消息重复消息过滤消息失败重试死信队列 DLQ回溯消息分布式事务服务发现开发语言友好性开源社区活跃度商业支持成熟度 总结Kafka 和 RocketMQ 怎么选? 本文参考:…...
剥开 MP4 的 千层 “数字洋葱”:从外到内拆解通用媒体容器的核心
在当今数字化时代,MP4 格式随处可见,无论是在线视频、手机拍摄的短片,还是从各种渠道获取的音频视频文件,MP4 都占据着主流地位。它就像一个万能的 “数字媒体集装箱”,高效地整合和传输着各种视听内容。接下来&#x…...
设计模式(结构型)-组合模式
定义 组合模式的定义为:将对象组合成树形结构以表示 “部分 - 整体” 的层次结构,并且使得用户对单个对象和组合对象的使用具有一致性。其最关键的实现要点在于,简单对象和复合对象必须实现相同的接口,这一特性正是组合模式能够对…...
使用 IDEA + Maven 搭建传统 Spring MVC + Thymeleaf 项目的详细步骤
使用 IDEA Maven 搭建传统 Spring MVC Thymeleaf 项目 环境准备步骤 1:创建 Maven 项目步骤 2:添加依赖(pom.xml)步骤 3:配置 web.xml步骤 4:Spring 配置类(Java Config)步骤 5&am…...
「Mac畅玩AIGC与多模态19」开发篇15 - 判断节点与工具节点联动示例
一、概述 本篇在引入工具节点的基础上,进一步结合判断节点(条件分支),实现根据用户输入内容动态控制是否调用外部接口。通过构建“用户是否需要天气信息”的条件逻辑,开发人员将掌握如何在 Dify 工作流中通过条件判断…...
docker 外部能访问外网,内部不行(代理问题)
如果宿主机访问外网依赖代理(比如 http_proxy 环境变量),容器默认不会继承。需要显式传入代理: docker run -e http_proxy... -e https_proxy... ...在 docker-compose 中配置 HTTP/HTTPS 代理 version: 3 services:app:image: …...
模糊控制理论(含仿真)
本文讲解模糊控制理论、设计步骤以及案例。 1. 模糊控制原理: 模糊控制(Fuzzy Control)是一种基于模糊逻辑推理的人类经验规则实现的控制方法,适用于对系统模型不精确或难以建立精确数学模型的复杂系统。它利用“如果…那么…”&…...
《 C++ 点滴漫谈: 三十六 》lambda表达式
一、引言 在 C98 和 C03 时代,尽管 C 拥有强大的泛型编程能力和丰富的面向对象特性,但在表达局部逻辑、回调行为或一次性函数处理时,程序员却常常需要冗长的代码来定义函数对象(functor),或者使用函数指针…...
【C/C++】函数模板
🎯 C 学习笔记:函数模板(Function Template) 本文是面向 C 初学者的函数模板学习笔记,内容包括基本概念、定义与使用、实例化过程、注意事项等,附带示例代码,便于理解与复现。 📌 一…...
电赛经验分享——模块篇
1、前言 打算在这一个专栏中,分享一些本科控制题电赛期间的经验,和大家共同探讨,也希望能帮助刚刚参加电赛的同学,了解一些基本的知识。一些见解和看法可能不同或有错误,欢迎批评指正。 在本文中,主要介绍笔…...
LeetCode 热题 100 70. 爬楼梯
LeetCode 热题 100 | 70. 爬楼梯 大家好,今天我们来解决一道经典的动态规划入门题——爬楼梯。这道题在LeetCode上被标记为简单难度,要求我们计算爬到第n阶楼梯的不同方法数,每次可以爬1或2个台阶。下面我将详细讲解解题思路,并附…...
浔川AI测试版内测报告
浔川AI测试版内测报告 一、引言 本次对浔川AI测试版进行内测,旨在全面评估其功能表现与性能状况,为后续的优化升级及正式上线提供有力依据。 二、测试环境 1. 硬件环境:[Windows 10】 2. 软件环境:操作系统为【核桃编程]ÿ…...
Leetcode刷题记录31——旋转图像
题源:https://leetcode.cn/problems/rotate-image/description/?envTypestudy-plan-v2&envIdtop-100-liked 题目描述: 思路一: 💡 解题思路:分两步完成旋转 虽然“直接旋转”看起来有点抽象,但我们…...
攻防世界-php伪协议和文件包含
fileinclude 可以看到正常回显里面显示lan参数有cookie值表示为language 然后进行一个判断,如果参数不是等于英语,就加上.php,那我们就可以在前面进行注入一个参数,即flag, payload:COOKIE:languageflag …...
[C++] 小游戏 决战苍穹
大家好,各位看到这个标题,斗破苍穹什么时候改叫决战苍穹了?其实,因为版权等一系列问题,斗破苍穹正式改名为决战苍穹,这个版本主要更新内容为解决了皇冠竞技场太过影响游戏平衡,并且提高了一些装…...
项目成本管理_挣得进度ES
在项目成本管理的新实践中, 通过挣值管理(EVM) 的扩展,引入 挣得进度ES 这一概念, ES是EVM理论和实践的延伸,挣得进度理论用ES和实际时间(AT) 替代了传统EVM所使用的进度偏差测量指标SV(挣值—计划价值)。 使用这种替代方法计算…...
矩阵快速幂 快速求解递推公式
文章目录 习题790.多米诺和托米诺平铺 对于一个给定的递推公式,例如dp[i] dp[i-1] * a dp[i-2] * b,那么常用的做法,肯定是使用o(n)的时间复杂度进行线性求解,但是如果 n 10 18 n{10}^{18} n1018,那么肯定超时的,这…...
驱动开发硬核特训 · Day 28(上篇):pinctrl 子系统详解与实战分析
📅 日期:2025-05-05 📚 技术平台:嵌入式Jerry(B站) 一、引言 在嵌入式系统中,SoC 芯片的引脚通常具有多种功能,如 GPIO、UART、I2C、SPI 等。为了在不同的应用场景中灵活配置引脚功…...
20250505下载VLC for Android
20250505下载VLC for Android 2025/5/5 14:35 缘起:做Rockchip的RK3566的Android13下的跨网段PING。 酷芯的图传网段 和 softAP/以太网RJ45共享网段之间互相PING通。 图传的原厂/供应商说可以使用ffmpeg进行rtsp流的转发。 后来确认VLC for Android版本只有接受流&a…...
Jetpack Compose 响应式布局实战:BoxWithConstraints 完全指南
深入理解 Jetpack Compose 中的 BoxWithConstraints 前言 在构建现代 Android 应用时,响应式设计已成为必不可少的要求。Jetpack Compose 作为 Android 的现代 UI 工具包,提供了 BoxWithConstraints 这一强大组件,帮助我们轻松创建能够适应…...
ZYNQ笔记(十七):IP核封装与接口定义
版本:Vivado2020.2(Vitis) 任务:将“HDMI彩条显示实验”(正点原子 ZYNQ FPGA 开发视频)中所实现的 RGB2DVI 模块封装成一个 IP 核。 目录 一、介绍 (1)IP核 (2&#x…...
学习笔记msp430f5529lp
注:本文仅用于个人学习使用,记录笔记。 学习视频msp430f5529库函数入门教程 00.序言_哔哩哔哩_bilibili 向大佬致敬理工男小帅-CSDN博客 CCS环境快捷键使用 代码注释:Ctrl/ 提示/补全: CtrlShiftC 放大:Ctrl 缩小:Ctrl- 切换选择模式&…...
人工智能应用:从技术突破到生态重构的演进之路
一、人工智能的发展历程:从符号主义到通用智能探索 人工智能(AI)的发展始于20世纪中叶,其历程可划分为四个关键阶段: 符号主义与早期探索(1950s-1970s) 以逻辑推理和专家系统为核心&…...
【ZYNQ Linux移植】4-内核移植
文章目录 0 写在前面1 内核源码的文件结构2 Linux内核移植2.1 移植配置文件2.2 移植设备树2.3 创建脚本进行编译2.4 备份相关文件 3 测试4 总结5 参考资料 0 写在前面 这是一个系列博客,详细介绍如何在 ZYNQ 与 ZYNQ MP 平台上如何移植 Linux 系统。目前网络上的大部…...
代码随想录算法训练营第三十二天
LeetCode/卡码网题目: 518. 零钱兑换 II377. 组合总和 Ⅳ790. 多米诺和托米诺平铺(每日一题)57. 爬楼梯(第八期模拟笔试) 其他: 今日总结 往期打卡 背包问题特点: 滚动数组背包遍历顺序 完全背包从小到大,即基于当前物品更新过的继续更新01背包从大到…...