Docker的基本使用
Docker
概念
Docker架构
docker分为客户端,Docker服务端,仓库
客户端
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务端发起请求,服务端将完成所有的工作并返回相应结果。
Docker 提供了一个命令行工具 docker
以及一整套 RESTful API。
Docker服务端
Docker服务端 又称为Docker主机,Docker引擎,Docker守护进程。
依托于宿主机
,守护进程,用于管理镜像,容器,执行客户端命令等。
仓库Registry
Docker有两个重要的概念镜像
和容器
。
镜像可以理解为就是软件安装包,容器就是软件安装完成后可运行的状态。
镜像
镜像可以理解为软件安装包,一个Docker镜像是一个完整的操作系统的描述
。
容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。
容器可以被创建、启动、停止、删除、暂停等。
注意:容器运行需要指定镜像,当容器运行后,一个容器就相当于一个虚拟的完整的操作系统,比如你通过mysql的镜像来安装mysql,当mysql的容器启动后,就相当于开启了一个操作系统,mysql只是安装在此容器内部的操作系统中,我们可以进入容器内部操作mysql(和正常操作系统一致),也可以通过docker命令来操作
安装Docker
- 卸载原有的版本
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
-
安装yum-utils
sudo yum install -y yum-utils
-
添加阿里云镜像
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装
sudo yum install docker-ce docker-ce-cli containerd.io
-
启动并加入开机启动
sudo systemctl start dockersudo systemctl enable docker
Docker常用命令
查看镜像
docker images
REPOSITORY
:镜像在仓库中的名称TAG
:镜像标签(一般是软件的版本号)IMAGE ID
:镜像 IDCREATED
:镜像的创建日期(不是获取该镜像的日期)SIZE
:镜像大小
搜索镜像
如果需要下载镜像,但是又不知道docker有没有,可以通过搜索镜像命令进行查看。
docker search 镜像名称
NAME
:镜像名称DESCRIPTION
:镜像描述STARS
:用户评价,反映一个镜像的受欢迎程度OFFICIAL
:是否为官方构建AUTOMATED
:自动构建,表示该镜像由 Docker Hub 自动构建流程创建的。
拉去镜像
拉取镜像就是从中央仓库下载镜像到本地。
docker pull 镜像名称:tag
比如我们要下载centos7的镜像:
docker pull centos:7
配置镜像加速(centos)
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://2bewljww.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
删除镜像
docker rmi 镜像id
docker rmi 镜像名称
docker rmi 镜像名称:tag
使用镜像id删除的时候,输入id的前几位即可
删除镜像的时候,必须保证没有镜像被使用,也就是说没有通过镜像创建容器,如果有,则必须先删除容器
docker images -q
可以查询到所有镜像的 ID
#以下命令可以删除 所有镜像
docker rmi `docker images -q`
查看正在运行的容器
docker ps
ONTAINER ID
:容器 IDIMAGE
:所属镜像COMMAND
:命令CREATED
:创建时间STATUS
:容器状态 Up运行 Exited退出PORTS
:端口NAMES
:容器名称
查询所有容器
docker ps -a
容器启动命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-i
:表示运行容器;-t
:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端;--name
:为创建的容器命名;-v
:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个 -v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上;-d
:在 run 后面加上 -d 参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加 -i -t 两个参数,创建容器后就会自动进容器里);-p
:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个 -p 做多个端口映射。-P
:随机使用宿主机的可用端口与容器内暴露的端口映射。
创建并进入容器
docker run -it --name 容器名称 镜像名称:标签 /bin/bash
Docker 容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为是空闲状态,就会自动退出。
docker run -it --name mszlu_mysql mysql:5.7 /bin/bash
守护方式创建容器
docker run -di --name 容器名称 镜像名称:标签
# 此方式创建完成后,会启动容器,但不会进入容器,容器一直运行,除非使用docker stop命令关闭容器
守护方式进入容器
# 必须是容器正在运行
docker exec -it 容器名称|容器ID /bin/bash
停止与启动容器
# 停止容器
docker stop 容器名称|容器ID
# 启动容器
docker start 容器名称|容器ID
文件拷贝
如果我们需要将文件拷贝到容器内可以使用 cp 命令。
docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来。
docker cp 容器名称:容器目录 需要拷贝的文件或目录
容器数据卷
数据卷这个概念非常重要
比如有以下场景:
- 配置文件需要频繁修改
- 容器内部的数据需要备份
- 删除容器不希望删除数据
上述的需求,有了数据卷之后,变的非常容易。
我们可以在创建容器
的时候,将宿主机的目录与容器内的目录进行映射
,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器,而且这个操作是双向绑定
的,也就是说容器内的操作也会影响到宿主机,实现备份功能。
但是容器被删除的时候,宿主机
的内容并不会被删除
,因为底层是通过拷贝
实现的。如果多个容器挂载同一个目录,其中一个容器被删除,其他容器的内容也不会受到影响,同理,底层是拷贝实现的。
容器与宿主机之间的数据卷属于引用的关系,数据卷是从外界挂载到容器内部中的,所以可以脱离容器的生命周期而独立存在,正是由于数据卷的生命周期并不等同于容器的生命周期,在容器退出或者删除以后,数据卷仍然不会受到影响,数据卷的生命周期会一直持续到没有容器使用它为止。
命令
创建容器添加 -v
参数,格式为宿主机目录:容器目录
,例如:
docker run -di -v /mszlu/docker/centos/data:/usr/local/data --name centos7-01 centos:7
# 多目录挂载
docker run -di -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2 镜像名
注意:目录挂载操作可能会出现权限不足的提示。这是因为 CentOS7 中的安全模块 SELinux 把权限禁掉了,在 docker run 时通过 --privileged=true
给该容器加权限来解决挂载的目录没有权限的问题。
匿名挂载
匿名挂载只需要写容器目录即可,宿主机对应的目录会在 /var/lib/docker/volumes
中生成。
# 匿名挂载
docker run -di -v /usr/local/data --name centos7-02 centos:7
# 查看 volume 数据卷信息
docker volume ls
具名挂载
具名挂载就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume
中生成。
# 具名挂载
docker run -di -v docker_centos_data:/usr/local/data --name centos7-03 centos:7
# 查看 volume 数据卷信息
docker volume ls
只读/读写
# 只读。只能通过修改宿主机内容实现对容器的数据管理。
docker run -it -v /宿主机目录:/容器目录:ro 镜像名
# 读写,默认。宿主机和容器可以双向操作数据。
docker run -it -v /宿主机目录:/容器目录:rw 镜像名
数据卷容器(数据卷继承)
# 容器 centos7-01 指定目录挂载
docker run -di -v /mydata/docker_centos/data:/usr/local/data --name centos7-01 centos:7
# 容器 centos7-04 和 centos7-05 相当于继承 centos7-01 容器的挂载目录
docker run -di --volumes-from centos7-01 --name centos7-04 centos:7
docker run -di --volumes-from centos7-01 --name centos7-05 centos:7
查看容器ip地址
我们可以通过以下命令查看容器的元信息。
docker inspect 容器名称|容器ID
也可以直接执行下面的命令直接输出 IP 地址。
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器ID
删除容器
# 删除指定容器
docker rm 容器名称|容器ID
# 删除多个容器
docker rm 容器名称|容器ID 容器名称|容器ID
Docker部署
mysql部署
-
拉取镜像
docker pull mysql:5.7
-
创建镜像
docker run -id \ -p 3307:3306 \ --name=c_mysql \ -v /mnt/docker/mysql/conf:/etc/mysql/conf.d \ -v /mnt/docker/mysql/logs:/logs \ -v /mnt/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ mysql:5.7
-
可以进入容器访问,也可以通过3307 外部访问
redis部署
- 拉取镜像。
docker pull redis
- 创建容器
docker run -di --name redis -p 6379:6379 redis
连接容器中的 Redis 时,只需要连接宿主机的 IP + 指定的映射端口即可。
RabbitMQ部署
拉取镜像
docker pull rabbitmq
创建容器
docker run -di --name rabbitmq -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq
进入容器并开启管理功能
# 进入容器
docker exec -it rabbitmq /bin/bash
# 开启 RabbitMQ 管理功能
rabbitmq-plugins enable rabbitmq_management
- 访问:http://ip:15672/ 使用
guest
登录账号密码
nginx部署
-
拉取镜像
docker pull nginx
-
创建容器
docker run -di --name nginx -p 80:80 -v /mnt/docker/nginx:/etc/nginx nginx
-
访问 http://ip 即可
-
通过nginx访问tomcat
nginx.conf
user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;location / {proxy_pass http://172.17.0.2:8080;}} }
-
访问http://ip/index.html
Docker镜像构建
Docker commit
平常我们都是从公共仓库拉取镜像,我们也可以从容器中构建我们自己的镜像。
需求:
1. 基础镜像centos
2. 安装jdk
3. 安装nginx
Dockerfile
在 Docker 中构建镜像最常用的方式,就是使用 Dockerfile
。Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
常用指令
FROM
语法:FROM <image>:<tag>
指明构建的新镜像是来自于哪个基础镜像,如果没有选择 tag,那么默认值为 latest。
FROM centos:7
MAINTAINER
语法:MAINTAINER <name>
指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用 LABEL。
**LABEL **
语法:LABEL <key>=<value> <key>=<value> <key>=<value> ...
功能是为镜像指定标签。也可以使用 LABEL 来指定镜像作者。
RUN
语法:RUN <command>
构建镜像时运行的 Shell 命令,比如构建的新镜像中我们想在 /usr/local 目录下创建一个 java 目录。
ADD
语法:ADD <src>... <dest>
拷贝文件或目录到镜像中。src 可以是一个本地文件或者是一个本地压缩文件,压缩文件会自动解压。还可以是一个 url,如果把 src 写成一个 url,那么 ADD 就类似于 wget 命令,然后自动下载和解压。
**COPY **
语法:COPY <src>... <dest>
拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压。
EXPOSE
语法:EXPOSE <port> [<port>/<protocol>...]
暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP。
ENV
语法:ENV <key> <value>
添加单个,ENV <key>=<value> ...
添加多个。
设置容器内环境变量。
CMD
语法:
CMD ["executable","param1","param2"]
,比如:CMD ["/usr/local/tomcat/bin/catalina.sh", "start"]
CMD ["param1","param2"]
,比如:CMD [ "echo", "$JAVA_HOME" ]
CMD command param1 param2
,比如:CMD echo $JAVA_HOME
启动容器时执行的 Shell 命令。在 Dockerfile 中只能有一条 CMD 指令。如果设置了多条 CMD,只有最后一条 CMD 会生效。
**ENTRYPOINT **
语法:
ENTRYPOINT ["executable", "param1", "param2"]
,比如:ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "start"]
ENTRYPOINT command param1 param2
,比如:ENTRYPOINT ehco $JAVA_HOME
启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖。在 Dockerfile 中只能有一条 ENTRYPOINT 指令。如果设置了多条 ENTRYPOINT,只有最后一条 ENTRYPOINT 会生效。
**WORKDIR **
语法:WORKDIR /path/to/workdir
为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录。
构建镜像
Dockerfile 文件编写好以后,真正构建镜像时需要通过 docker build
命令。
docker build
命令用于使用 Dockerfile
创建镜像。
# 使用当前目录的 Dockerfile 创建镜像
docker build -t mycentos:7 .
# 通过 -f Dockerfile 文件的位置创建镜像
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
-f
:指定要使用的 Dockerfile 路径;--tag, -t
:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。
举个例子:我的宿主机 jdk 文件在 /root 目录下,Dockerfile 文件在 /usr/local/dockerfile 目录下,文件内容如下:
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
那么构建镜像时的命令就该这样写:
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 /root
再举个例子:我的宿主机 jdk 文件和 Dockerfile 文件都在 /usr/local/dockerfile 目录下,文件内容如下:
ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java
那么构建镜像时的命令则这样写:
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
实例
接下来我们通过基础镜像 centos:7
,在该镜像中安装 jdk 和 tomcat 以后将其制作为一个新的镜像 mscentos:7
创建目录
mkdir -p /mnt/docker/dockerfile
编写 Dockerfile 文件。
vim Dockerfile
Dockerfile 文件内容如下:
# 指明构建的新镜像是来自于 centos:7 基础镜像
FROM centos:7
# 通过镜像标签声明了作者信息
LABEL maintainer="mszlu.com"
# 设置工作目录
WORKDIR /usr/local
# 新镜像构建成功以后创建指定目录
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷贝文件到镜像中并解压
ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.59.tar.gz /usr/local/tomcat
# 暴露容器运行时的 8080 监听端口给外部
EXPOSE 8080
# 设置容器内 JAVA_HOME 环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.8/
ENV PATH $PATH:$JAVA_HOME/bin
# 启动容器时启动 tomcat
CMD ["/usr/local/tomcat/apache-tomcat-9.0.59/bin/catalina.sh", "run"]
上传jdk和tomcat到Dockerfile一样的目录下
构建镜像
[root@localhost ~]# docker build -f /usr/local/dockerfile/Dockerfile -t mscentos:7 .
使用构建的镜像创建容器
# 创建容器
docker run -di --name mscentos7 -p 8080:8080 mscentos:7
# 访问 http://192.168.200.101:8080/ 看到页面说明环境 OK!
相关文章:

Docker的基本使用
Docker 概念 Docker架构 docker分为客户端,Docker服务端,仓库 客户端 Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务端发起请求,服务端将完成所有的工作并返回相应结果。 Docker …...
paddlenlp安装踩坑记录
错误1 ModuleNotFoundError: No module named paddle.metric我下载paddlepaddle-gpu2.5.0.post117解决了,最开始下载的2.5.1报错,post后面的117是我的cuda版本,不要写你对应的版本号 python3 -m pip install paddlepaddle-gpu2.5.0.post117…...

微服务流程引擎:简单又灵活,实现流程全生命周期管理!
伴随着日益激烈的市场竞争,传统的办公操作已经无法满足发展需要了。如果采用微服务流程引擎加油助力,就可以帮助企业更好地管理数据资源,高效做好各种表单制作,实现高效率办公。流辰信息以市场为导向,用心钻研低代码技…...

Qt表格数据处理
概述 在Qt表格数据处理中,涉及到如下几个具体的类: QAbstractItemModel:这是一个抽象基类,定义了模型(Model)的接口规范。所有的模型类都应该派生自QAbstractItemModel,并实现它的纯虚函数&…...

EasyPOI 实战总结
EasyPOI实战总结 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 使用EasyPOI 环境搭建 # 1.引入相关依…...

【LeetCode-困难题】42. 接雨水
题目 题解一:暴力双重for循环(以行计算水量) 1.先找出最高的柱子有多高(max 3) 2.然后第一个for为行数(1,2,3) 3.第二个for计算每一行的雨水量(关键在于去除…...

npm install 安装依赖,报错 Host key verification failed
设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…...

SOLIDWORKS焊件是什么?
SOLIDWORKS是一款广泛应用于机械设计领域的三维计算机辅助设计软件。SOLIDWORKS提供了强大的焊件功能,可以帮助工程师们以更高的效率设计焊接件。本文将介绍SOLIDWORKS焊件的概念、特点以及使用方法,以期帮助读者更好地理解和应用这一关键技术。 SOLIDWO…...

2023国赛数学建模D题思路模型代码 高教社杯
本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...

git协议实现管理(三个步骤)
GitHub官网访问: https://github.com/dashboard 初次使用git的用户要使用git协议大概需要三个步骤: 一、生成密钥对 二、设置远程仓库(本文以github为例)上的公钥 三、把git的remote url远程仓库URL可访问路径修改为git协议(以上两个步骤初次设置过以后,…...
“深入理解JVM:探索Java虚拟机的内部机制“
标题:深入理解JVM:探索Java虚拟机的内部机制 摘要: Java虚拟机(Java Virtual Machine,JVM)是Java语言的核心,负责将Java源代码编译成可执行的字节码并运行。本篇博客将深入探索JVM的内部机制&a…...
Unity——各种特效的基本使用方法
特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。 某些种类的特效,如动效、贴花,还要编写脚本代码以实现…...

smiley-http-proxy-servlet 实现springboot 反向代理,结合项目鉴权,安全的引入第三方项目服务
项目中反向代理 集成第三方的服务接口或web监控界面,并实现与自身项目相结合的鉴权方法 依赖 smiley-http-proxy-servlet GitHub链接 2.0 版开始,代理切换到jakarta servlet-api<!--HTTP 代理 Servlet--><dependency><groupId>org.mit…...

(vue)多级表头且转为百分比显示
(vue)多级表头且转为百分比显示 <el-table-column align"center" label"近三个月数据情况"><el-table-column align"center" prop"amount" :label"tableLast[0]"><template slot-scope"{ row }"&g…...
Linux下C++开发
Linux下C开发 Linux 系统介绍 简介 Linux属于多用户多任务操作系统,而Windows属于单用户多任务操作系统Linux一切皆文件目录结构 bin 存储二进制可执行文件dev 存放的是外接设备,例如磁盘,光盘等。在其中的外接设备是不能直接被使用的&…...

GPT-3.5——从 人工智障 到 大人工智障
有人说,GPT是从人工智障到人工智能的蜕变,但是。。。 我认为,GPT是从 人工智障 到 大人工智障 的退化。。。 从 人工智障 到 大人工智障 GPT-3.5学术介绍No.1---- 西红柿炒钢丝球基本信息详细制作方法材料步骤 幕后花絮 No.2---- 顶尖数学家…...

创建型(四) - 原型模式
一、概念 原型模式(Prototype Pattern):利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。 使用场景:如果对象的创建成本比较大…...

ABAP 定义复杂的数据结构
最近有个需求是实现ABAP数据类型与JASON类型的转换。想要创建个ABAP的数据类型来接JASON类型是个挺麻烦的事。例如下面这个JASON数据,是个很简单的数据结构。但对ABAP来说有4层了,就有点复杂了。 不过ABAP的数据类型也是支持直接定义数据结构的嵌套的。如…...
HCIP第四节-----------------------------BGP
一、BGP基础 1、BGP得概述 (1)、AS OSPF、IS-IS等IGP路由协议在组织机构网络内部广泛应用,随着网络规模扩大,网络中路由数量不断增长,IGP已无法管理大规模网络,AS的概念由此诞生。 AS指的是在同一个组织…...

Temu闯关日韩受挫?跨境电商卖家如何打磨好营销链路
海外版拼多多 Temu 先后在日本和韩国上线,然而效果不似预期,日韩市场对这套“低价补贴”策略并不买账。作为一个尚未被日韩消费者熟悉的网站,其价格之便宜无法让消费者信任。除此之外更大的问题是,在日本卷不过线下零售与百元店&a…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...