Docker的数据持久化;Docker网络;Dockerfile编写
Docker的数据持久化;Docker网络;Dockerfile编写;
文章目录
- Docker的数据持久化;Docker网络;Dockerfile编写;
- **Docker的数据持久化**
- 1)将本地目录映射到容器里
- 2)数据卷
- 3)将宿主机上的文件快速传输进容器里
- **Docker网络**
- 1)host模式
- 2)container模式(使用指定容器网络)
- 3)none模式
- 4)bridge模式(nat模式)
- 5)端口映射
- **Dockerfile编写**
- Dockerfile 格式
- CDM示例:
- EXPOSE示例:
- Dockerfile示例:
- 核心知识点/面试考点:
- ● 容器与主机之间的数据如何传输?
- ● Docker有哪几种网络模型?
- ● Dockerfile相关:
- **○ ADD和COPY的区别是什么?**
- **○ CMD和ENTRYPOINT的区别是什么?**
- 扩展知识点:
- ● 同样的业务逻辑如何优化Dockerfile
- 优化一:把不需要的命令丢入/dev/null
- 优化二:减少RUN构建
- 优化三:多阶段构建
- 优化方法四:使用更为轻量级的linux 发行版本
Docker的数据持久化
在 Docker 中,数据持久化是指将容器中的数据保存到宿主机或其他外部存储介质,以确保数据在容器重新创建、更新或删除时不会丢失。以下是一些常见的 Docker 数据持久化方法
1)将本地目录映射到容器里
mkdir -p /data/ #-p就可以创建多层目录
docker run -tid -v /data/:/data ubuntu bash ## -v 用来指定挂载目录 :前面的/data/为宿主机本地目录 :后面的/data/为容器里的目录,会在容器中自动创建
可以在/data/里创建一个文件
echo '123456' > /data/1.txt
然后到容器里查看
docker exec -it 4152046a bash -c "cat /data/1.txt"
2)数据卷
创建数据卷
docker volume create testvol ##testvol为数据卷名字
列出数据卷
docker volume ls
查看数据卷信息
docker volume inspect testvol
使用数据卷
docker run -itd --name tang01 -v testvol:/data/ ubuntu ##和前面直接映射本地目录不同,冒号左边为数据卷名字
多个容器共享一个数据卷
docker run -itd --name tang1 -v testvol:/data/ ubuntu
3)将宿主机上的文件快速传输进容器里
docker cp test111.txt tang1:/data/12345.txt
docker exec -it tang1 ls /data/docker cp tang1:/data/12345.txt /tmp/ #可以反过来拷贝
Docker网络
Docker服务启动时会生成一个docker0的网卡,这个网卡是实现容器网络通信的根本。 默认容器使用的网络类型为桥接(bridge)模式,这个桥接和我们的vmware里的桥接可不是一回事。它更像是vmware的NAT模式。
每启动一个容器,都会产生一个虚拟网卡 vethxxx
iptables -nvL -t nat ##可以看到DOCKER相关规则,容器之所以可以联网,是靠这些规则实现的
-nvL 是三个选项的组合:
-n:禁用 IP 地址和端口的解析,以显示原始的数字格式。
-v:显示详细的信息,包括数据包和字节计数。
-L:列出规则,即显示防火墙的规则列表。
-t nat 指定查看的表为 NAT 表。NAT 表是 iptables 的一个表,用于处理网络地址转换 (Network Address Translation) 规则。
1)host模式
docker run -itd --net=host --name tang2 ubuntu bash #共享宿主机,新生成的后面要加bash
可以进入容器内,查看hostname,查看ip地址。 这种模式,容器和宿主机共享主机名、IP。
docker rm -f tang3 #强制删除容器,就算已经开启的也能删除
修改主机名
hostnamectl set-hostname tang3
2)container模式(使用指定容器网络)
该模式下,在启动容器时,需要指定目标容器ID或者name,意思是将要启动的容器使用和目标容器一样的网络,即它们的IP一样
docker run -itd --net=container:/tang01 --name tang03 ubuntu #使用tang01的网络新建tang03
可以进入容器查看tang01和tnag03的网络情况
3)none模式
apt undate
apt install -y net-tools #这样才能使用ifconfig命令
即不需要配置网络
docker run -itd --net=none --name=tang01 naginx_ubuntu bash
查看:
docker exec -it tang01 bash -c "ip add"
4)bridge模式(nat模式)
也就是默认模式,可以–net=bridge 也可以不指定–net,默认就是bridge
5)端口映射
docker run -itd -v /data/:/var/www/html/ -p 8080:80 --name tang05 nginx_ubuntu:1.0 bash
说明: -p后面跟 宿主机监听端口:容器监听端口
docker exec -it tang05 bash
开启nginx
/etc/init.d/nginx start
测试是否开启nginx,/var/www/html目录下有一个text1.txt
apt install curl
curl localhost/text1.txt #成功获取里面内容
回到宿主机,安装网络工具
yum install net-tools
发现8080端口已经打开
netstat -ltnp|grep 8080
访问网站内容成功
curl localhost:8080/text1.txt
Dockerfile编写
什么是Dockerfile?是实现自定镜像的一种手段,通过编写Dockerfile,来编译成自己想要的镜像。
Dockerfile 格式
1)FROM 指定基于哪个基础镜像,例如:
FROM ubuntu:latest
2)MAINTAINER 指定作者信息,例如:
MAINTAINER tang [tang@tanglinux.com](mailto:tang@tanglinux.com)
3)RUN 后面跟具体的命令,例如:
RUN apt update
RUN apt install -y curl
RUN ["apt","install","-y","curl" ] ##这种写法偏复杂
4)CMD 用来指定容器启动时用到的命令,只能有一条,格式如下:
CMD ["executable", "param1", "param2"]
CMD command param1 param2
CMD ["param1", "param2"]
CDM示例:
CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
5)EXPOSE 指定要映射的端口,格式:
EXPOSE <port> [<port>...]
EXPOSE示例:
EXPOSE 22 80 8443 ##要暴露22,80,8443三个端口
说明:这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。
6)ENV 为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量,例如
ENV MYSQL_version 5.7
7)ADD 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。例如:
ADD conf/vhosts /usr/local/nginx/conf
8)COPY 类似于ADD,将本地文件拷贝到容器里,不过它不支持URL,例如:
COPY 123.txt /data/456.txt
9)ENTRYPOINT 格式类似CMD
容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。
和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。
比如,容器名字为tang 我们在Dockerfile中指定如下CMD:
CMD ["/bin/echo", "test"]
假如启动容器的命令是
docker run tang
则会输出 test
假如启动容器的命令是
docker run -it tang /bin/bash
则什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
ENTRYPOINT ["echo", "test"]
假如启动容器的命令是
docker run -it tang 123
则会输出 test 123 ,这相当于要执行命令 echo test 123
10)VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点。
VOLUME ["/data"]
11)USER指定RUN、CMD或者ENTRYPOINT运行时使用的用户
USER tang
12)WORKDIR 为后续的RUN、CMD或者ENTRYPOINT指定工作目录
WORKDIR /tmp/
Dockerfile示例:
mkdir docker_test #创建一个目录
vi Dockerfile
FROM ubuntu
MAINTAINER tang peng yuan
RUN apt update
RUN apt install -y libpcre2-dev net-tools gcc zlib1g-dev make
ADD http://nginx.org/download/nginx-1.23.2.tar.gz .
RUN tar zxvf nginx-1.23.2.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.23.2 && ./configure --prefix=/usr/local/nginx && make && make install
COPY index.html /usr/local/nginx/html/index.html
# COPY index2.html /usr/local/nginx/html/2.html
EXPOSE 80
ENTRYPOINT /usr/local/nginx/sbin/nginx -g "daemon off;" #-g这个的意思是让程序在前台启动,不到后台,如果程序到后台运行了,容器也就自己关闭了
创建好后再创建一个index.html文件
echo "This is file" > index.html
编译成镜像
docker build -t tang_nginx:1.1 . #后面的点是到什么目录下找,这是当前目录下
说明: -t 后面跟镜像名字:tag, 这里的. 表示使用当前目录下的Dockerfile,并且工作目录也为当前目录,如果想使用其它目录下的Dockerfile,还可以使用-f选项来指定,例如
mkdir /data/docker
cp Dockerfile /data/docker/nginx.dkf
cd /data/docker/ # vi编辑一下,让第二个copy取消注释
docker build -t tang2_nginx:1.2 -f /data/docker/nginx.dkf /tmp/ ##这里/tmp/目录为工作目录,比如COPY文件的时候,到/tmp/下面去找
使用镜像
docker run -itd --name nginx -P tang_nginx:1.1 ##使用-P(大写P)可以随机映射一个端口到宿主机,也可以使用-p(小p)指定具体端口
docker ps #可以看到随机生成的端口号了
核心知识点/面试考点:
● 容器与主机之间的数据如何传输?
docker cp test111.txt tang1:/data/12345.txt #主机向容器docker cp tang1:/data/12345.txt /tmp/ #容器向主机传输
● Docker有哪几种网络模型?
host模式:共享主机名,ip,网络等一系列信息
container模式:使用指定容器网络
none模式:没有网络
bridge模式:类似vm虚拟机的nat模式
● Dockerfile相关:
○ ADD和COPY的区别是什么?
ADD
和 COPY
是用于将文件从主机复制到容器内部的指令。它们之间的区别如下:
- 语法:
ADD
指令的语法为ADD <source> <destination>
,而COPY
指令的语法为COPY <source> <destination>
。可以看到,两者的语法非常相似,只是指令名称不同。 - 自动解压缩:
ADD
指令具有一个特殊的功能,即它可以自动解压缩被复制的文件。如果<source>
参数指向一个压缩文件(例如.tar
,.tar.gz
,.tar.bz2
,.tar.xz
,.zip
),则在复制过程中,Docker 会自动解压缩该文件并将其内容复制到容器内部的<destination>
。而COPY
指令则不具备自动解压缩的功能,它仅仅是将文件或目录从主机复制到容器内部。 - URL 支持:
ADD
指令还支持从指定的 URL 下载文件并复制到容器内部。当<source>
参数是一个 URL 时,Docker 会自动下载该文件并将其复制到容器内部的<destination>
。而COPY
指令不支持直接从 URL 下载文件。 - 构建缓存: 在构建镜像的过程中,如果使用
COPY
指令复制文件,且源文件没有发生变化,Docker 会使用构建缓存,从而加快构建速度。但是,如果使用ADD
指令复制文件,即使源文件没有发生变化,Docker 也会无条件地重新执行该指令,因为它具有解压缩和下载功能,可能会导致构建结果不同。
○ CMD和ENTRYPOINT的区别是什么?
CMD
和 ENTRYPOINT
是用于指定容器启动时要执行的命令或程序的指令。它们之间的区别如下:
- 命令执行方式:
CMD
指令用于指定容器默认的执行命令,可以被 Dockerfile 中的其他指令覆盖。而ENTRYPOINT
指令也用于指定容器启动时要执行的命令,但它更为固定,不容易被其他指令覆盖,通常用于定义容器的主要执行命令或程序。 - 参数传递:
CMD
指令可以包含多个参数,其中每个参数都会被解释为命令的一部分。这意味着可以在运行容器时覆盖CMD
指令中的某些参数。而ENTRYPOINT
指令一般会被视为不可变的一部分,容器在运行时提供的参数会被附加到ENTRYPOINT
指令的末尾,而不是覆盖它。 - Shell 执行:
CMD
指令可以使用 shell 执行命令,将命令作为字符串传递给 shell 进行解释和执行。这意味着可以使用诸如变量替换、重定向和管道等 shell 特性。而ENTRYPOINT
指令默认情况下是不通过 shell 执行的,它以原样接收参数并直接执行命令,不经过 shell 解释。 - 扩展性和覆盖:
CMD
指令的内容可以被 Dockerfile 中的其他指令(如RUN
)覆盖,因此可以更容易地更改容器的默认命令。而ENTRYPOINT
指令的内容通常是不易被覆盖的,因为它被视为容器的主要执行命令或程序。
扩展知识点:
● 同样的业务逻辑如何优化Dockerfile
原文:https://blog.csdn.net/WuDan_1112/article/details/125857676
以构建nginx为例
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
#关闭debug日志
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@docker nginx]# docker build -f Dockerfile -t centos:v1 .
优化一:把不需要的命令丢入/dev/null
[root@docker nginx]# mkdir -p nginx/nginx_v1 nginx/nginx_v2 nginx/nginx_v3
[root@docker nginx]# cp nginx-1.21.6.tar.gz nginx/nginx_v1
[root@docker nginx]# cd nginx_v1/
[root@docker nginx_v1]# ls
Dockerfile nginx-1.21.6.tar.gz
[root@docker nginx_v1]# docker build -f Dockerfile -t nginx:v2 .
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
优化二:减少RUN构建
RUM命令比较多得时候
FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &> /dev/null && make install &> /dev/null &&\
rm -rf /mnt/nginx-1.21.6
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
优化三:多阶段构建
使用FRON命令生成多个镜像,将指定的镜像做为其他镜像的基础镜像环境来构建
FROM centos:7 as build
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
yum clean all && \
sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
./configure --prefix=/usr/local/nginx &> /dev/null && \
make &> /dev/null && make install &> /dev/null &&\
rm -rf /mnt/nginx-1.21.6
FROM centos:7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
优化方法四:使用更为轻量级的linux 发行版本
- debian
- alpine
- apt add
相关文章:

Docker的数据持久化;Docker网络;Dockerfile编写
Docker的数据持久化;Docker网络;Dockerfile编写; 文章目录 Docker的数据持久化;Docker网络;Dockerfile编写;**Docker的数据持久化**1)将本地目录映射到容器里2)数据卷3)将…...

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展
11月25日,MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的,旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony(简称“OpenHarmony”&a…...

windows11 调整鼠标灵敏度方法
首先 我们打开电脑设置 或者在 此电脑/此计算机/我的电脑 右击选择属性 然后 有的电脑 左侧菜单中 直接就有 设备 然后在设备中直接就可以找到 鼠标 选项 调整光标速度即可 如果操作系统和我的一样 可以直接搜索鼠标 然后 选择 鼠标设置 然后 调整上面的鼠标指针速度即可...

贪心算法个人见解
目录 基本思想: 贪心算法的步骤: 示例: 贪心算法(Greedy Algorithm)是一种基于贪心策略的算法范式,它在每一步选择中都采取当前状态下的最优选择,而不考虑全局最优解。贪心算法通常适用于那些…...

Win中Redis部署与配置
1.下载msi版本 下载传送门 2.双击next-->next安装安装 3.密码配置以及开机自启 在配置文件中配置相应配置进行配置密码以及端口和ip port 6379指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口&…...

vue el-button 封装及使用
使用了 Element UI 中的 el-button 组件,并对其进行了封装和定制。 创建组件index.vue (src/common-ui/button/index.vue) <template><el-buttonclass"h-button":type"type":icon"hIcon":disabled"disabled"clic…...

QT之QMediaPlayer的用法
QT之QMediaPlayer的用法 成员函数例程 成员函数 1)setMedia(const QMediaContent &media, QIODevice *stream nullptr) 设置要播放的媒体内容,其中参数media指定了媒体内容,stream参数指定了用于读取媒体的输入设备(如文件流࿰…...

TCP_报文格式解读
报文格式 header部分字段含义解析 固定字段 对于header中固定部分字段含义,见之前的blog《TCP报文分析》; 对部分字段含义补充说明 Data Offset:4bit,tcp header的长度,单位:32bit(4字节&…...

C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词下篇)
一.枚举( enum) 枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚…...

Java学习第十三天
Java多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作 多态性是对象多种表现形式的体现。 多态的优点 1. 消除类型之间的耦合关系2. 可替换性3. 可扩充性4. 接口性5. 灵活性6. 简化性 多态存在的三个…...

【Delphi】实现彩色日志显示框(TRichEdit Helper)
目录 一、前言 二、实现方法 1. 第一步 2. 第二步 3. 第三步 三、主程序代码 四、下载 1. 可执行程序 2. 程序源代码 一、前言 在用Delphi做日常开发的时候,经常需要显示程序运行的日志,一般我们会使用TMemo,使用起来简单,…...

Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!
1、背景 集群配置为:8 个 node 节点,16 核 32G,索引 4 分片 1 副本。应用程序的查询逻辑是按经纬度排序后找前 200 条文档。 1、应用对查询要求比较高,search 没有慢查询的状态。 2、集群压测性能不能上去,cpu 使用未打…...

图像批量设计软件Retrobatch Pro mac中文版功能特色
Retrobatch Mac是一款灵活的批量图像处理工具。用户可以自由创建Workflow来实现相应的功能,这些Workflow能取代大量的重复劳动,提高生产力。Retrobatch Mac的一般操作是从左边栏拖动相应动作到工作区形成节点(Nodes),节…...

python第3天之函数
深入理解 Python 中的函数 简介 在编程中,函数是组织和复用代码的基本单元。Python 作为一门高级编程语言,提供了丰富的函数特性来帮助开发者编写清晰、模块化和高效的代码。在本文中,我们将深入探讨 Python 函数的定义、调用、参数、返回值…...

SQL Server 数据库,为products表添加数据
在插入数据的时候,需要注意以下事项。 > 每次插入一整行数据,不可能只插入半行或几列数据。 > 数据值的数目必须与列数相同,每个数据值的数据类型、精度和小数位数也必须与相应的 列匹配。 > INSERT语句不能为标识列指定值&#…...

C语言结构体详解(二)(能看懂文字就能明白系列)文章很长,慢慢品尝
系列文章目录 第一章 结构体的介绍和基本使用 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 文章目录 系列文章目录🌈 *信念如阳光,照亮前行的每一步* 前言前面一篇文章主要介绍了结构体的基础…...

WPF不使用AllowsTransparency实现高性能透明背景异形窗体
前言 最近在WPF项目中使用到异形窗体结合Webbroswer组件做web界面的公告展示,当时不想太麻烦引入Cef组件,就想用自带的Webbroswer来做展示,为了美观还做了异形窗体,结果测试就杯具了,自带的Webbroswer在AllowsTransparency=“True” 模式下根本就无法显示,界面一片空白,…...

唯创知音WT2605C语音芯片MP3音频IC:轻松实现指令随机播放与无缝循环播放等功能
在现代化的电子产品中,音频功能的重要性日益凸显。无论是智能家居、玩具、医疗设备还是仪器仪表,富有吸引力的音效与语音提示都能显著提升用户体验。唯创知音WT2605C语音芯片MP3音频IC便是为了满足这一需求而诞生的,它具备指令随机播放、无缝…...

uniapp+微信小程序监听返回事件
代码附在最后 适用场景:uniapp开发微信小程序 需求是我点击列表进入数据信息的详情界面,点击详情界面的收藏,返回上一界面后,更新列表中的收藏情况。 目录 一、使用onUnload监听页面卸载 二、使用getCurrentPages()获取当前页…...

Python函数的高级用法
Python 的函数是“一等公民”,因此函数本身也是一个对象,函数既可用于赋值,也可用作其他函数的参数,还可作为其他函数的返回值。 使用函数变量 Python 的函数也是一种值:所有函数都是 function 对象,这意…...

excel单元格内换行按什么快捷键
如果我们使用excel软件的时候,因为一些日常的操作太过繁琐想要简化自己的操作步骤的话,其实是有很多快捷方式在其中的。那么对excel单元格内换行按什么快捷键这个问题,据小编所知我们可以在表格中使用Alt Enter来进行换行。详细内容就来看下…...

docker容器内部文件挂载主机
docker images执行该命令可以发现一个centos镜像 docker run --namemycentos -itd --privilegedtrue --restartalways -p 88:80 -v C:\Users\Administrator\Desktop\dockerTest:/bin/gh:ro centosdocker run 命令用于在 Docker 上创建和运行容器。 --namemycentos 指定容器…...

python 实现一个简单的计算器
python 实现一个简单的计算器 本文主要整合下tkinter ,实现下简单的计算器. 代码如下: #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/12/2 下午13:01 .Email:Describe: """ import tkinter as tk# 创建计算器窗口 ro…...

前端对浏览器的理解
浏览器的主要构成 用户界面 - 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分。 浏览器引擎 - 用来查询及操作渲染引擎的接口。 渲染引擎 - 用来显示请求的内容&#…...

Linux(openssl):X509_verify通过ca证书的public key验证证书的签名
/docs/man3.0/man3/X509_verify.html (openssl.org) 提供了方法用于通过ca证书的public key验证证书的签名 //verify_cert.hpp #include <string> #include <memory> #include <filesystem> #include <openssl/pem.h>using namespace std; namespace …...

全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
JSSDK使用步骤 步骤一:绑定安全域名: 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件: 在需要调用JS接口的页面引入如下JS文件,(支持https):http://…...

深入了解汉字转拼音转换工具:原理与应用
一、引言 汉字作为世界上最古老、最具象形意的文字之一,承载了数千年的历史文明。然而,在现代信息技术环境下,汉字的输入、输出和检索等方面存在一定的局限性。拼音作为汉字的一种音标表达方式,能够有效地解决这些问题。本文将为…...

沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析
目录 前言:临近期末,接下来给大家分享一些经典的编程题,方便大家复习。不一定难,但都是入门的好题,尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。 对于一些语言我是用c来写的,不妨碍理解…...

【面试攻略】Oracle中blob和clob的区别及查询修改方法
大家好,我是小米,欢迎来到小米的技术小屋!今天我们要一起来聊聊一个在面试中常常被问到的问题——“Oracle中Blob和Clob有啥区别,在代码中怎么查询和修改这两个类型的字段里的内容?”别急,跟着小米一步步揭…...

An illegal reflective access operation has occurred问题记录
报错 2023-11-30T01:08:18.7440800 [ERROR] [system.err] WARNING: An illegal reflective access operation has occurred 2023-11-30T01:08:18.7450800 [ERROR] [system.err] WARNING: Illegal reflective access by com.intellij.ui.JreHiDpiUtil to method sun.java2d.Sun…...