当前位置: 首页 > news >正文

Docker学习

介绍

概念

背景

环境配置不一致、安装复杂、多台集群、扩容和缩容

解决方法

将所有源码、配置、环境、版本等都打包成为一个镜像文件放在docker引擎中

docker:过去所产出的结果是能够编译执行的二进制字节码,所以需要手动再去配置环境。但是Docker透过镜像将作业系统核心外,运作应用程序所需要的系统环境,由下而上打包,达到应用程式夸平台的无缝连接,类似搬家————>搬楼。

理念

类似在虚拟机VMware上下载的CentOS_7.iso的操作系统一样,只要下载的镜像文件版本一致那么它的环境变量等都一样。
综上的VMware就是Docekr的概念。达到了一次镜像处处运行的目的。
是一种基于Go语言实现的开源的云项目

容器和虚拟机的区别

容器发展:磁盘————>卡台机————>虚拟机————>Docker(容器虚拟化技术)
虚拟机:带环境安装的一种解决方案 缺点:占用资源大、冗余步骤多、开机时间慢
容器虚拟化:Linux容器不是一个完整的操作系统,而是在操作系统层面上实现虚拟化,直接复用了本地主机的操作系统。是内核级虚拟化
在这里插入图片描述

安装

1.官网
2.docker hub:安装docker的镜像仓库

Docker的实质就是在已经运行的Linux下制造一个隔离的文件环境,因此他执行的效率几乎等同于所部署的Linux主机。所以是部署在Linux内核上的
在这里插入图片描述

Docker三要素

1.镜像

一个只读的模版,一个镜像可以创建多个容器。

2.容器

实列对象——基于镜像生成的实际对象,是运行实体。一个简易版本的Linux实体。

3.仓库

集中存项镜像文件的仓库Docker Hub中,分为公开仓库和私有仓库。

架构图

在这里插入图片描述

运行原理

Docker是一个客户端-服务端结构的系统,Docker的后台守护进程运行在主机上,守护进程从客户端接受命令并管理运行在主机上的容器。客户端类似前端界面。

高阶架构体

介绍

是一个C/S模式的架构,后段是一个松耦合结构,众多模块各司其职。
工作详细步骤:
1.在客户端发送/Docker Client与后段守护进程/Docker Daemon建立通信,并发送请求给后者。
2.守护进程作为架构的主题部分,首先提供服务的功能让他能接受客户端的请求。
3.Docker Engine 执行Docker内部的一系列工作,每一项工作都是以job的形式存在。
4.Job的运行过程当需要容器镜像时候,则从Docker Registry/仓库将镜像以Graph的形式存储。
5.需要为Docker容器配置网络环境,通过网络管理驱动Network driver创建并配置Docker容器网络环境。
6.限制Docker容器运行资源或执行用户指令等操作时,则通过Exec drive来完成
7.Libcontainer 是一项独立的容器管理包,Network dirver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作

在这里插入图片描述

具体安装

具体步骤可以学习下面的博客:
https://blog.csdn.net/a1010256340/article/details/144828982
1.确认虚拟机系统CentOS7机以上版本
cat /etc/redhat-release
2.卸载过去就版本的Docker
sudo yum remove dicker
3.yum安装gcc配置、环境配置 科学上网或者更换yum源
yum -y install gcc gcc-c++
4.安装需要的软件包
a.安装Docker的远程仓库/下载shell脚本

yum install -y yum-utils   #安装yum的工具类  
yum-config-manager \ 
--add-repo\ 
https://download.docker.com/linux/centos/docker-ce.repo         #设置静态本地仓库外国会很慢    

yum-config-manager \ 
--add-repo\ 
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    #设置国内的静态仓库  

yum makecache fast  #使更新yum仓库重建索引  

yum install docker-ce  #开始下载docker引擎  

systemctl start docker #启动服务  

docker version  #查看版本,客户端和服务端的版本号相同  
docker run hello-world #执行本地的hellowold  如过本地没有hello这个文件那么就会去远程仓库里面拉到本地再去执行

#配置本地镜像加速器  

system stop docker  #关闭服务
yum remove docker-ce docker-ce-cli containerd.io  #删除依赖包  
rm -rf /var/lib/docker  /var/lib/containerd  #删除本地文件  


docker 比虚拟机的快的原因
1.docker比虚拟机有更少的抽象层:因为docker不需要像虚拟机一样实现硬件资源虚拟化,而是直接使用实际物理机的硬件资源
2.docker直接利用宿主机的内核,从而不需要加载操作系统内核

Docker常用命令

启动命令

systemctl start docker  #启动docker
systemctl stop docker #暂停dokcer
systemctl restart docker #重启docker 
systemctl staus  docker  #查看docker的状态  
systemctl enable docker  #开机时候启动docker 
docker  info #查看docker的状态  
docker --help  #查看docker的总体帮助文档  

为docker镜像源配置

镜像命令

docker images #列出本地主机的镜像
在这里插入图片描述

REPOSITORY:镜像的仓库源
TAG:镜像的标签版本号,如果不具体说明默认为最新版本的。可以有多个版本号
IMAGE ID: 镜像ID
CREAYED:镜像创建时间
SIZE:镜像大小
docker images -a 查看所有镜像
docker images -q 只展示镜像ID

docekr search xxx #查询xxx镜像,即搜索xxx是否在远程仓库。
在这里插入图片描述

NAME:镜像名称
DESCRIPTION:镜像说明
STARS:点赞数量
OFFICIAL:是否官方
AUTOMATED:是否自动构成(可选)
docker search --limit 5 xxx #表示只显示前5个

下载镜像:
docker pull xxx #拉取xxx镜像,即从远程仓库拉取xxx镜像。
docekr pull xxx:TAG #拉取xxx镜像版本TAG.

docker system df
在这里插入图片描述

TYPE:类型
TOTAL:占用总空间大小
ACTIVE:正在活动的容器数量
SIZE:每个对象的实际大小
BECLAIMABLE:可伸缩性,可以回收的空间大小

docker rmi xxx/xxx_id 删除镜像利用名字/id,不是强制删除
docker rmi -f xxx/xxx_id 强制删除
docker rmi -f $(docker images)可以嵌套命令,这个相当于删除了所有

docker虚悬镜像:仓库名、标签都是的镜像有ID、大小、时间,就是虚悬镜像————工作中没有太大用处

容器命令

在docker中安装一个ubunt操作系统
在这里插入图片描述

1.前提
docker search --limit 5 ubuntu 
docker pull ubuntu  
2.新建+启动容器

docker run [OPTION] IMAGE [COMMAND]{ARG...} 按照镜像生成一个一个的容器
OPTION:可选项——————
–name=“容器名称”。
-d :后台运行容器并且返回容器ID,启动守护式容器(后台运行)。
启动交互式容器(前台命令行):-i:以交互模式运行容器,-t:为容器重新分配一个伪输入端口,通常与-i一起使用。相当于对一个容器生成后要对容器内部进行操作,所以需要交互并且拥有输入端口。
docker run -it ubuntu:last /bin/bash 因为是交互模式相当于启动一个shell脚本的命令输入口,所以需要规定对应的命令解释器
在这里插入图片描述

因为前缀的更改,相当于进入容器内部了,输入exit退出终端回到虚拟机中,容器停止————ctrl+p+q退出,容器不停止

端口映射:当外部需要访问docker容器的服务的端口为80,他其实访问主机的端口是808端口。
-p:指定端口映射即 -p 8080:80 也可以加上ip -p 127.0.0.1:8080:80
-P:随机端口映射

3.其他指令

docker ps [OPTION] 列出所有正在运行的容器实列
docker ps -a 列出所有活动过的容器实列,包括被删除的
docker restart 容器名称/ID 重启容器
docker stop 容器名称/ID 停止容器
docker kill 容器名称/ID 强制停止容器
docker rm 容器名称/ID 删除已停止容器
docker rm -f 容器名称/ID 强制删除容器

4.重要指令

docker run -d 容器名称 启动守护式容器(服务运行是在后台运行的)————需要注意的是:Docker容器后台运行,就必须要一个前台进程,就是如果不是一直挂起的命令,就会自动退出,因为我们只需要启动服务就可以了,但是docker前台没有运行的应用,这样容器会立即自杀,因为它觉得没事可做。————解决方法:运行的程序以前台进程的形式运行-it
docker ps 检查一下是否运行了
docker top 容器ID查看容器内运行的进程
docker inspect 容器ID查看容器的详细信息

docker exec -it 容器ID /bin/bash进入正在运行的容器并且使用bash命令解释器。
docker attach 容器ID 进入正在运行容器
这两个的区别是:attach直接进入容器启动命令的终端不会启动新的进程,exit退出会导致容器停止。而exec是在容器打开新的终端,并且可以启动新的进程,exit退出不会导致容器停止。

在这里插入图片描述

所以exec进入的会是命令解释器开个新进程不是之前那个命令解释器了。

5.备份内容

从容器拷贝内容到主机上
docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
export导出容器的内容留作为一个tar归档文件————备份整个容器[对应improt命令]
docker export 容器ID > 文件名.tar默认导出到当前目录下面
import从tar包中的内容创建一个新的文件系统再导入为镜像[对应export]
cat 文件名.tar | docker import - 镜像用户/镜像名称:版本号导入之后生成的是一个镜像

docker镜像底层原理

UnionFS(联合文件系统):是一种轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,同时将不同目录挂载到同一个虚拟文件系统下。因此镜像可以通过分层来进行继承,基于基础镜像可以制作各种具体的应用镜像。
特点:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终文件系统就会包括所有底层的文件和目录。

Docker镜像加载原理:实际上采用的就是UnionFS的文件系统。
分层结构:每个Docker镜像是由一系列只读的层组成的,这些层可以理解为不同的文件系统。当你在创建镜像时,每执行一条指令(例如RUN、COPY、ADD等),都会在之前的层之上添加一个新的层。这使得镜像具有分层结构。
读写层:当你基于某个镜像启动容器时,Docker会在镜像的最上层添加一个读写层(容器层)。在这个读写层中,你可以对容器进行修改,比如创建新文件、修改已有文件等。但这些更改仅影响该容器,并不会影响到原始镜像或其他基于同一镜像运行的容器。

底层原理:bootfs(boot文件系统)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层就是引导bootfs。当boot加载完成过整个内核就在内存中,此时内存的使用权就由boot转交给内核,然后卸载boot。

在Linux系统中,/boot 是用来存放引导加载程序(boot loader)相关的文件和内核映像的。这些文件对于系统的启动过程非常重要:
引导加载程序:这是位于 MBR(主引导记录)或 GPT(GUID分区表)分区上的小程序,它负责加载操作系统的内核到内存中。常见的引导加载程序有 GRUB(Grand Unified Bootloader)和LILO(Linux Loader)。GRUB2 是现代Linux发行版中最常用的引导加载程序。
内核映像:这些是操作系统的核心组件,通常命名为 vmlinuz 或者类似的名字。它们包含了操作系统运行所需的基本功能和服务,并负责管理系统资源、提供硬件抽象层等。
初始化RAM盘 (initrd):为了在挂载根文件系统之前加载必要的驱动程序,使用了一个临时的文件系统,称为初始化RAM盘。这个文件通常叫做 initrd.img 或 initramfs.img。
配置文件:例如,GRUB 的配置文件 grub.cfg 也存放在 /boot 目录下,虽然该文件通常是自动生成的,但它定义了引导加载程序的行为,比如如何显示菜单、超时时间以及各个操作系统的内核参数等。
其他支持文件:这包括了各种模块和驱动程序,确保内核能够在尽可能多的硬件平台上成功启动。

优点:
共享基础层、高效利用存储、快速部署

进阶指令

为仓库添加一个新的自己定义的镜像(容器层–>镜像层)
docker commit -m="提交的描述信息" -a="作者" 容器ID 创建的目标镜像名:[标签名]
在这里插入图片描述

本地镜像发布到阿里云
阿里云的ESC流程图
在这里插入图片描述

1.生成本地镜像(如上面的步骤)
2.在ailiyun图形化界面完成一系列的创建(命名空间——包名、镜像仓库——类)
3.按照后面指引即可——需要注意要授权固定密码(在仓库管理的访问凭证)

$ docker login --username=xxxx xxxxxxx.cn-chengdu.personal.cr.aliyuncs.com
$ docker tag [ImageId] crpi-n0g9bg8c4s7bu6xe.cn-chengdu.personal.cr.aliyuncs.com/zx-centos/myunbutu1.3:[镜像版本号]
$ docker push crpi-n0g9bg8c4s7bu6xe.cn-chengdu.personal.cr.aliyuncs.com/zx-centos/myunbutu1.3:[镜像版本号]

本地镜像发布到Docker Hub 同理https://hub.docker.com/
构建本地的Docker Registry-- 自己搭建的本地私有的Docker Hub
1.docker pull registrt 下载镜像
2.docker run -d -p5000:5000 -v /xxx/xxxx/:/tmp/registry --privileged=true registry 主机的5000端口映射到docker的5000端口 -v后面表示的是容器卷放在何处,不写就是默认/var/lib/registry(端口是虚拟的,为了方便服务的)
3.在容器外执行docker commit -m="config add" -a="zx" 容器ID:[版本号]
4.利用curl验证私服库上有什么请求

curl 是一个在 Linux 系统中广泛使用的命令行工具,用于在网络中传输数据。它支持多种协议,包括 HTTP、HTTPS、FTP 等,并且能够通过不同的选项来定制请求。
基本用法
获取网页内容:curl http://example.com
这条命令会从指定的 URL 下载内容并将其显示在标准输出(通常是终端)。
常用选项
-o:将输出保存到文件中。
示例:curl -o savedpage.html http://example.com
此命令会将 http://example.com 的内容保存到 savedpage.html 文件中。
-O:使用远程文件名保存下载的内容。
示例:curl -O http://example.com/file.zip
此命令会直接以 file.zip 为名保存文件。
-X:指定请求方法(GET, POST, PUT, DELETE 等)。
示例:curl -X POST http://example.com/api
-d:发送数据。通常与 -X POST 一起使用。
示例:curl -X POST -d "param1=value1&param2=value2" http://example.com/resource
-H:添加请求头。
示例:curl -H "Content-Type: application/json" http://example.com
-u:提供用户名和密码进行认证。
示例:curl -u username:password http://example.com/protected

综上指令为:
curl -XGET http://registry容器的ip:5000/v2/_catalog
ubuntu上下载更新ifconfig指令为:
apt-get update 更新源
apt-get install net-tools更新工具结束

  1. 克隆镜像(规范)
    docker tag 原镜像名称:[版本号] 仓库ip:端口/镜像名称:[版本号]
    在这里插入图片描述

6.docker默认不支持http请求推送镜像

vim /etc/docker/deamon.json   #配置这文件
{
    "registry-mirrors":["镜像加速器"],  ##可配可不配
    "insecure-registries":["镜像仓库的ip:端口"] #添加信任的仓库
    }
systemctl restart docker #重启docker/docker仓库  

7.推送到私服仓库
docker push 规范后的容器名称

8.再次验证
curl -XGET http://registry容器的ip:5000/v2/_catalog

9.拉取本地
docker pull 容器名称(因为规范了名称所以可以直接拉取)

容器数据卷

docker run -d -p5000:5000 -v /xxx/xxxx/:/tmp/registry --privileged=true registry
这是在上述操作的第2步中生存仓库中使用了容器卷
-v /xxx/xxx/:/xxx/xxx: 左边的表示宿主机的路径,右边表示容器内部的路径,表示实现了宿主机和容器内部的资源共享和信息共通————容器数据卷

--privileged=true 标志会赋予容器几乎所有的能力,并解除大部分的安全限制,这意味着容器内部的应用程序可以执行需要更高权限的操作,例如挂载文件系统、访问设备等,它可以处理自己挂载区域的数据并且权限更高级,哪一块区域就属于它的了

定义:是对容器数据进行备份。对宿主机目录——>容器目录的映射,将容器的数据备份+持久化到本地主机目录。
卷就是目录/文件,存在于一个或者多个容器中,由docker挂载到容器,但他不属于联合文件系统,是完全独立于容器的生命周期,因此Docker不会在容器删除时删除其挂载的数据卷,就相当于插了个U盘用来保存数据

宿主机和容器的互通指令: docker run -it -v 宿主机绝对路径:容器内目录 --privileged=true 镜像名称 -v 可以写多个

特点:1.容器的数据更改可以直接使主机的生效、主机的更改容器内也可以生效(自动备份)
2.容器卷的更改不会包含在镜像的更新中。
3.数据卷的生命周期一直持续到没有容器使用为止
4.容器停止后,宿主机对共享区域进行修改,容器启动后会自动更新

上面描述的是采用的默认规则:
docker run -it --privileged=true -v /宿主机的绝对路径:/容器内绝对路径:rw 镜像名
这里的rw=没写就是表示默认规则————可读可写。
当只能读取不能写入,表示这块数据不能从容器内修改-但宿主机可读可写不会被限制
docker run -it --privileged=true -v /宿主机的绝对路径:/容器内绝对路径:ro 镜像名

卷的继承和共享

1.u1容器完成和宿主机的映射
docker run -it --privileged=true -v /宿主机的绝对路径:/容器内绝对路径 --name u1 镜像名
2.u2容器继承u1容器的卷规则(–volumes-from)
docker run -it --privileged=true --volumes-from 父类(u1) --name u2 镜像名
此时主机的和u1 、u2实现了容器共享。
假如关闭u1容器的运行状态,那么u2共享的依旧不影响

Docker常规安装

总体步骤:
搜索-拉取-查看-启动(端口对应)-停止容器-移动容器

tomcat安装
docker search tomcat  
docker pull tomcat  
docker  images tomcat 
docker run -d -p 8080:8080 --name tomcat1 tomcat 

在网站上访问:localhost:8080 但是此时访问的是404
可能原因1.没有映射端口、没有关闭防火墙
2.webapp.dist目录换出webapps

新版tomcat想要看到那只猫需要把webapp.dist改成webapps
在这里插入图片描述

因此不需要下载这么高级的tomcat

docker pull billygoo/tomcat-jdk8  
docker run -d -p 8080:8080  --name mytomcat_8  billygoo/tomcat-jdk8  
mysql 安装
docker search mysql 
docker pull mysql:5.7
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=13456 -d mysql:5.7   #-e后面表示用户名为root 密码为123456  
docker exec -it mysql容器_id /bin/bash   
#进入mysql容器 
mysql -uroot -p 
123456  
#进入mysql  
show databases  ;
create database db01;  
use db01  ;
create table t1(id int ,name varchar(20)); 
insert into t1 values(18,"张三");
select * from t1 ;

问题:1.中文乱码——docker上默认字符集编码隐患
mysql容器中输入SHOW VARIABLES LIKE 'character%'

2.删除mysql容器后,里面的mysql数据如何办

解决:
1.重新输入定义mysql容器

docker run -d -p 3306:3306 --privileged=true -v /宿主机用户名/mysql/log:/var/log/mysql  
-v /宿主机用户名/mysql/conf:/etc/mysql/conf.d  
-v /宿主机用户名/mysql/data:/var/lib/mysql 
-e MYSQL_ROOT_PASSWORD=123456 --name my_mysql mysql:5.7   
#相当于备份了日志和配置、数据    

2.新建my.cnf
通过容器卷同步给mysql容器实例——因为宿主机拥有工具所以可以解决该问题

cd /用户名/mysql/conf/  
vim my.cnf  #mysql的配置文件  


[client]
default-character-set = utf8mb4
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

:wq  
#配置文件完成

docker restart my_mysql  

docker exec -it my_mysql /bin/bash  
mysql -uroot -p 

#解决了中文乱码问题-并且数据保存了  

DockerFile解析

定义:Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。——类似shell脚本

作用:因为之前每次修改都要一次commit一次很麻烦,所以给出一个list清单,后续需要加入任何功能直接在list清单里面即可

如图是一种独立于的
在这里插入图片描述

步骤:
1.编写Dockerfile文件
2.docker build命令构建镜像
3.docker run 依镜像运行容器为实例

基础知识:
1.每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2.指令按照从上到下,顺序执行
3.#表示注释
4.每条指令都会创建以恶搞新的镜像层并对镜像进行提交

Dockerfile执行的大致流程:
1.docker从基础镜像运行一个容器
2.执行一条指令并对容器进行修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令直到所有指令都执行完成

保留字指令

补充:1.shell格式<命令>
2.exec格式[“可执行文件”,“参数1”,“参数2”…]
从网上拉取的其实就是dockerfile文件

FROM:基础镜像,当前的新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模版,第一条必须是from
MAINTAINER:镜像维护者的姓名和邮箱
RUN: 在容器构建(build)的时需要运行的命令 ——两种格式:shel、exec 。构建就相当于生成了一个容器之后执行了RUN后面的指令 RUN yum -y install vim
EXPOSE:当前容器对外暴露出的端口
WOEKDIR:指定在创建容器后,终端默认登陆进来的工作目录、一个落脚点
USER: 指定镜像以什么样的用户去执行,如果都不指定默认为root
ENV: 这个环境变量可以在后续的任何RUN指令使用,就如同制定了环境变量前缀一样,也可以在其他指令中使用这些环境变量。ENV MY_PATH /usr/mytest #定义了环境变量,键值对新式
VOLUME: 容器数据卷。
ADD :将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包——可以拷贝jdk8之类的,相当于COPY+解压
COPY:拷贝文件和目录到镜像中
CMD:指定容器启动后干的事情——两种格式:shel、exec 。注意:Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
就类似于 docker run -p 8080:8080 -d 镜像id /bin/bash 那么此时的/bin/bash会覆盖原本的CMD里面的内容

ENTRYPOINT:类似CMD但是他不会被docker run后面的指令覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT指令指定的程序
在这里插入图片描述

目的给镜像添加jdk等工具
jdk的地址:https://www.oracle.com/java/technologied/downloads/#/java8

docker pull centos:7  
#在虚拟机中下载好了jdk的安装包放在my_file中
mkdir my_file
/myfile/jdk-8u171-linux-x64.tar.gz   
#编写Dokerfile文件
vim Dockerfile

# 使用一个轻量级的基础镜像
FROM centos
MAINTAINER zx<zx@163.com>

ENV MYPATH /usr/local 
WORKDIR $MYPATH

# 安装必要的软件包和JDK 8
RUN yum install vim  -y 
#安装网络配置
RUN yum install net-tools  -y
#安装java8以及lib库
RUN yum install glibc.i686  -y
RUN mkdir /usr/local/java  
#ADD是相对路径.jar,把jdk添加到容器中,安装包必须要和Dockerfile文件在同一位置  
ADD jdk-8u171-linux-x64.tar.gz  /usr/local/java/    
#配置环境变量  
ENV JAVA_HMOE /usr/local/java/jdk1.8.0_171  
ENV JRE_HMOE $JAVA_HOME/jre  
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH  
ENV PATH $JAVA_HOME/bin:$PATH  

EXPOSE 80  

CMD echo $MYPATH
CMD echo "success ------- ok"  
CMD /bin/bash  

#编译完成Dockerfile文件
:wq

#在/my_file目录下执行 这个.表示的是当前路径,如果不想当前路径docker build -t centos:1.0 -f /path/to/Dockerfile /path/to/build/context
 
docker buliud -t centos_java8:1.0 .

#就会在镜像中出现centos_java8:1.0
docker images 


#CMD指令在构建的时候会一个一个执行的,
最后显示successful

在这里插入图片描述
学习视频:尚硅谷

http://www.dtcms.com/a/20105.html

相关文章:

  • dma_ddr 的编写 通过mig控制ddr3
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 13
  • 掌握SQL多表连接查询_轻松处理复杂数据关系
  • [0689].第04节:Kafka与第三方的集成 – Kafka集成SpringBoot
  • 《Spring实战》(第6版)第1章 Spring起步
  • 【数据结构】(9) 优先级队列(堆)
  • floodfill算法系列一>太平洋大西洋水流问题
  • 【第3章:卷积神经网络(CNN)——3.6 CNN的高级特性与优化策略】
  • 如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?
  • EasyExcel 复杂填充
  • DeepSeek接入网络安全领域,AI高效驱动,重新定义网络防御边界!
  • UniApp 中制作一个横向滚动工具栏
  • MyBatis:动态SQL高级标签使用方法指南
  • 数据管理的四大基石:通俗解读数据中台、数据仓库、数据治理和主数据
  • 《千多桃花一世开》:南胥月为何爱暮悬铃
  • 输电杆塔沉降智能监测系统:如何用数据守护电网安全
  • ASP.NET Core SixLabors.ImageSharp v1.0 的图像实用程序类 web示例
  • uniapp可视化-活动报名表单系统-代码生成器
  • 【云安全】云原生- K8S kubeconfig 文件泄露
  • java中map实现函数式编程的原理
  • LVDS接口总结--(5)IDELAY3仿真
  • CEF132 编译指南 Linux 篇 - 开启 CEF 之旅:框架概览(一)
  • 微信小程序的请求函数封装(ts版本,uniapp开发)
  • 【电路笔记】-双向计数器
  • 【VUE】前端工程化与前端工程化与webpack
  • css简介
  • 哈希表(C语言版)
  • 【stm32】定时器输出PWM波形(hal库)
  • Qt的QPushButton样式设置
  • 半遮挡检测算法 Detecting Binocular Half-Occlusions