Docker使用教程及docker部署Vue项目

什么是Docker及其工作原理

  • 虚拟化技术
  • Docker是什么?
    • 三大基本术语
    • 核心算法原理和具体操作步骤
  • Docker和传统虚拟化技术区别
  • 为什么使用Docker?
  • Docker有什么作用?
    • 1.解决应用部署的环境问题
      • 遇到问题
      • 达到效果
    • 2.容器化
  • docker的各种命令解释
    • 运行机制
      • docker pull 执行过程
      • docker run 执行过程:
    • 基本命令
      • 命令词介绍
        • 管理命令
        • 命令
    • 镜像有关操作
    • 容器有关操作
      • 命令词介绍
    • 数据卷相关操作
  • Dockerfile文件命令概括解释
    • Dockerfile命令例子
      • FROM-初始化一个新的构建阶段,并为后续指令设置基础镜像
      • WORKDIR-设置工作目录
      • COPY-用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中
      • ADD-用于将本地文件、目录、或远程文件 URL 添加到镜像中。
      • RUN-在镜像构建过程中执行命令。它可以执行任何有效的 shell 命令、可执行文件或脚本
      • ENV-定义环境变量
      • EXPOSE-声明容器运行时要监听的端口
      • CMD-配置容器启动时执行的命令
      • ENTRYPOINT-配置容器启动时执行的命令
    • 生成镜像
    • 运行镜像
    • 优化方案
  • docker部署Vue项目
    • 服务器中创建工作目录
    • 构建vue应用镜像
    • 编写 nginx config
    • 编写Dockerfile
    • 执行如下命令

虚拟化技术

虚拟化技术是现代计算机领域的一个重要发展方向,它可以让我们在同一台物理机上运行多个操作系统的实例,提高资源利用率和系统安全性。传统的虚拟化技术主要包括全虚拟化、半虚拟化和容器化等不同的方法

  • 全虚拟化:全虚拟化技术允许多个操作系统实例同时运行在同一台物理机上,每个实例都有自己的虚拟硬件资源。这种方法需要模拟整个操作系统,因此资源消耗较大。
  • 半虚拟化:半虚拟化技术允许多个操作系统实例同时运行在同一台物理机上,但它们共享部分硬件资源。这种方法相对于全虚拟化来说资源消耗较小。
  • 容器化:容器化技术与Docker类似,它将应用程序和其所需的依赖项打包成一个独立的容器,可以在任何支持容器化技术的环境中运行

Docker是什么?

docker官网入口

  • Docker是一种新兴的容器化技术,它基于操作系统的特性,将应用程序和其所需的依赖项打包成一个独立的容器,可以在任何支持Docker的环境中运行。

Docker的思想来自于 集装箱,集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走

三大基本术语

在这里插入图片描述

  • 镜像:理解为软件安装包,可以方便的进行传播和安装,它包含了运行应用程序所需的所有元素,包括代码、运行时环境、库、环境变量和配置文件。
    镜像可以通过Dockerfile来进行创建
    Dockerfile就相当于一个脚本,编写一些命令,他会识别这些命令并且执行
  • 容器:软件安装后的状态,每个软件运行的环境都是独立的、隔离的,称之为容器。
  • 仓库:仓库是存放 Docker 镜像的地方。仓库允许你分享你的镜像,你可以将你的镜像推送(push)到仓库,也可以从仓库拉取(pull)其他人分享的镜像。
    Docker 提供了一个公共的仓库 Docker Hub,你可以在上面上传你的镜像,或者寻找你需要的镜像。

核心算法原理和具体操作步骤

Docker的核心算法原理是基于操作系统的特性,它使用一种名为cgroups(控制组)和namespace(命名空间)的技术来实现容器化。cgroups用于限制和隔离容器的资源使用,而namespace用于隔离容器的文件系统、进程空间和网络空间。

具体操作步骤如下:

  1. 创建一个Docker镜像,镜像包含应用程序和其所需的依赖项。
  2. 从镜像创建一个容器,容器包含应用程序和依赖项的实例。
  3. 使用cgroups和namespace技术来限制和隔离容器的资源使用和空间。
  4. 启动容器,容器可以在任何支持Docker的环境中运行。

Docker和传统虚拟化技术区别

Docker传统虚拟化技术
架构差异使用容器引擎,共享主机操作系统的内核每个虚拟机有独立的操作系统
资源利用率更快启动速度,占用更少资源启动和资源消耗较大
部署和扩展快速部署和启动,容器镜像可复制和共享部署和启动相对耗时
隔离性隔离性较传统虚拟化技术稍差提供较强的隔离性
应用场景构建和部署分布式应用、微服务架构运行需要完全隔离的应用程序
操作系统主要支持LinuX几乎所有(KVM)
内核的使用共享内核独立内核
启动速度秒级(相当于启动一个进程)分钟级(启动操作系统)
系统支持量(单机)上千个几十个

为什么使用Docker?

Docker 的出现主要是为了解决以下问题:“在我的机器上运行正常,但为什么到你的机器上就运行不正常了?
平常开发的时候,项目在本地跑的好好的,但是其他人想要在他的电脑上去跑你的应用程序,但是却跑不起来,他得配置数据库,Web 服务器,插件啥的,非常不方便。Docker的出现解决了这些问题

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝跨平台移植

Docker有什么作用?

1.解决应用部署的环境问题

快速部署和启动、跨平台和可移植性

遇到问题

大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题:

  • 依赖关系复杂,容易出现兼容性问题
  • 开发、测试、生产环境有差异
  • 例如:微服务的拆分通用给部署带来了很大的麻烦。
    分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。
    在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题

达到效果

  • 可以在不同的操作系统和硬件平台上运行,提供了很高的可移植性。开发人员可以在本地开发容器,并将其部署到任何支持 Docker 的环境中,无需担心环境差异导致的问题
  • 可以快速启动、停止和重启,使得应用程序的部署和调试变得非常高效。开发人员可以使用 Docker 定义应用程序的运行时环境,并将其打包成镜像,然后在任何支持 Docker 的主机上快速部署和启动
  • 提供了一种描述应用程序运行环境的标准化方式。通过使用 Docker 镜像,开发人员可以明确定义应用程序的依赖项和配置,确保在不同的环境中具有相同的运行环境,从而实现环境一致性

2.容器化

  • 使用容器技术将应用程序及其所有依赖关系打包到一个独立的运行环境中,形成一个可移植的容器。容器化使得应用程序在不同的环境中具备一致的运行行为,并且可以快速部署和扩展

docker的各种命令解释

运行机制

docker pull 执行过程

  • 客户端将指令发送给docker daemon
  • docker daemon 先检查本地images中有没有相关的镜像
  • 如果本地没有相关的镜像,则向镜像服务器请求,将远程镜像下载到本地

docker run 执行过程:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系(简版linux系统),并在只读的镜像层外面挂载一层可读写层
  • 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个 ip 地址给容器
  • 执行用户指定的应用程序

基本命令

  • docker 帮助命令:docker --help
  • 查看系统内核:uname -r
  • 启动docker :systemctl start docker
  • 查看docker版本: docker verison
  • 显示docker系统的信息:docker info

命令词介绍

管理命令
含义
container管理容器
image管理镜像
network管理网络
命令
含义
attach介入到一个正在运行的容器
build根据 Dockerfile 构建一个镜像
commit根据容器的更改创建一个新的镜像
cp在本地文件系统与容器中复制 文件/文件夹
create创建一个新容器
exec在容器中执行一条命令
images列出镜像
kill杀死一个或多个正在运行的容器
logs取得容器的日志
pause暂停一个或多个容器的所有进程
ps列出所有容器
pull拉取一个镜像或仓库到 registry
push推送一个镜像或仓库到 registry
rename重命名一个容器
restart重新启动一个或多个容器
rm删除一个或多个容器
rmi删除一个或多个镜像
run在一个新的容器中执行一条命令
search在 Docker Hub 中搜索镜像
start启动一个或多个已经停止运行的容器
stats显示一个容器的实时资源占用
stop停止一个或多个正在运行的容器
tag为镜像创建一个新的标签
top显示一个容器内的所有进程
unpause恢复一个或多个容器内所有被暂停的进程

镜像有关操作

  • 拉取镜像 如nginx: docker pull image-name
  • 检索image : docker search image-name
  • 列出镜像列表:docker images
  • 显示一个镜像历史:docker history image-name
  • 保存镜像(将已有镜像导出):docker save -o [保存的目标文件名称] [镜像名称]
  • 加载镜像:docker load -i [已保存的镜像包] 如:docker load -i nginx.tar
  • 删除镜像:docker rmi [镜像名称]
  • 通过容器创建镜像:
    • 从已经创建的容器中更新镜像,并且提交这个镜像
      使用 Dockerfile 指令来创建一个新的镜像 下面通过已存在的容器创建一个新的镜像。
      docker commit -m=“First Image” -a=“ll” 7a15f99695c0 keke/unbantu:17.10.0
      docker commit -m=“[描述信息]” -a=“指定镜像作者” [容器id] [创建的目标镜像名]

容器有关操作

  • 列出当前所有正在运行的container : docker ps
  • 列出所有 container(包括已停止的) : docker ps -a
  • 列出最近一次启动的 container : docker ps -l
  • 创建并运行一个容器(nginx为例):docker run --name containerName -p 80:80 -d nginx
  • 让运行的容器暂停:docker pause [容器名]/ID
  • 让运行容器从暂停恢复:docker unpause [容器名]/ID
  • 停止运行的容器:docker stop [容器名]/ID
  • 让一个停止的容器重新运行:docker start [容器名]/ID
  • 删除所有容器: docker rm docker ps -a -q
  • 强制删除正在运行的容器(使用SIGKILL): docker rm -f
  • 删除指定容器 :docker rm -l
  • 删除与容器有关的数据卷:docker rm -v
  • 从一个容器中取日志,参数:-f, --follow=false Follow log output; -t, --timestamps=false Show timestamps 命令: docker logs [容器名]/ID - 列出一个容器里面被改变的文件或者目录,list列表会显示出三种事件,A 增加的,D 删除的,C 被改变的:docker diff Name/ID
  • 显示一个运行的容器里面的进程信息:docker top Name/ID
  • 从容器里面拷贝文件/目录到本地一个路径: docker cp Name:/container-path to-path
    docker cp ID:/container-path to-path

命令词介绍

含义
docker run创建并运行一个容器
–name给容器起一个名字,比如叫做ll
-p将宿主机端口与容器端口映射,冒号左侧是宿主机端口,右侧是容器端口
-d后台运行容器
nginx镜像名称,例如nginx
docker exec进入容器内部,执行一个命令
-it给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
mn要进入的容器的名称
bash进入容器后执行的命令,bash是一个linux终端交互命令

数据卷相关操作

  • 创建一个数据卷:docker volume create [数据卷名]
  • 显示一个或多个volume信息:docker volume inspect [数据卷名]
  • 列出所有volume:docker volume ls
  • 删除未使用的volume : docker volume prune
  • 删除一个或多个volume : docker volume rm [数据卷名]
  • 创建容器并挂载数据卷:docker run --name [容器名] -v [需要挂载的数据卷名]😕[容器内目录] -p [宿主机端口]:[容器端口] [镜像名] 。对应容器内目录需要去DockerHub找
    例如nginx : docker run --name nginx -v html:/usr/share/nginx/html -p 8080:80 nginx

参考文章

Dockerfile文件命令概括解释

含义
FROM指定基础镜像
RUN在镜像构建过程中执行命令
COPY将文件或目录从构建环境复制到镜像中
ADD类似于 COPY,但更强大,支持 URL 和解压缩操作
WORKDIR设置工作目录
ENV设置环境变量
ARG定义构建时的参数
EXPOSE声明容器运行时要监听的端口
VOLUME创建挂载点,用于持久化数据
CMD指定容器启动时要运行的默认命令
ENTRYPOINT配置容器启动时执行的命令
LABEL添加元数据,用于标记镜像
USER设置容器中运行命令的用户
SHELL配置 shell 类型

Dockerfile命令例子

FROM-初始化一个新的构建阶段,并为后续指令设置基础镜像

FROM [--platform=<platform>] <image> [AS <name>]
  • platform: 构建的 cpu 架构,如 Linux/amd 64,Linux/arm 64。
  • image: 指定 base image 的名称。
  • AS name: 指定构建步骤的名称
FROM node:16-alpine as build-stage

WORKDIR-设置工作目录

WORKDIR <directory>
  • directory 是要设置为工作目录的路径。可以使用绝对路径或相对路径。如果指定的路径不存在,WORKDIR 指令将创建该目录
WORKDIR /app

COPY-用于从 docker 主机复制新文件或者目录至创建的新镜像指定路径中

COPY [--chown=<user>:<group>] [--chmod=<perms>] <src>... <dest>
# 或
COPY [--chown=<user>:<group>] [--chmod=<perms>] ["<src>",... "<dest>"]
  • src 是构建环境中要复制的文件或目录的路径。
  • dest 是要将文件或目录复制到容器中的目标路径。
 COPY package*.json ./  
//复制package.json和package-lock.json(如果存在)
//用 docker 缓存层,先把 package 移进去安装依赖,再把剩余文件复制进去,能最大限度利用到缓存来安装依赖,只要 package 不变则安装依赖很快。这是一个很巧妙的优化点

ADD-用于将本地文件、目录、或远程文件 URL 添加到镜像中。

  • 它类似于 COPY 指令,但具有更多的功能,比如会它可以解压和下载类似于 COPY 指令,但具有更多的功能,比如会它可以解压和下载
ADD <source> <destination>
  • source 是要添加到镜像中的文件、目录或 URL
  • destination是文件系统中的目标路径

RUN-在镜像构建过程中执行命令。它可以执行任何有效的 shell 命令、可执行文件或脚本

RUN <command> && <command> ……
  • command 是要执行的命令。在 Dockerfile 中可以是任何合法的 shell 命令,例如安装软件包、运行脚本、创建目录等
//安装项目生产依赖
RUN npm install --only=production
//  构建应用
RUN npm run build

ENV-定义环境变量

ENV <key1>=<value1> <key2>=<value2> ...
  • key是环境变量的名称
  • value 是环境变量的值。这种格式用于设置单个环境变量,也可以使用通配符
ENV MYROOTDIR=/data/web/html/

EXPOSE-声明容器运行时要监听的端口

EXPOSE <port> [<port>/<protocol>...]
  • port是要暴露的端口号
  • protocol> 是要使用的网络协议,通常是 tcp 或 udp。如果未指定协议,则默认为 tcp

CMD-配置容器启动时执行的命令

CMD ["nginx", "-g", "daemon off;"] 
//启动Nginx服务器
  • CMD 是 Dockerfile 中的一条指令,用于设置容器启动时默认执行的命令。它定义了容器启动时执行的主要命令,但是可以被 Docker 命令行中的 docker run 中的参数覆盖

ENTRYPOINT-配置容器启动时执行的命令

ENTRYPOINT nginx -g 'daemon off;'
  • 类似于 CMD 指令,但ENTRYPOINT 指令设置的命令不会被 Docker 命令行中的 docker run 中的命令覆盖,而是会作为容器的主要命令执行

生成镜像

 docker build -t test:v1 .
  • 这里的 -t 参数用于给镜像命名
  • /. 表示 Dockerfile 所在的当前目录。

运行镜像

docker run -d -p 8088:80  --name test-hello test:v1
//跑在8080端口将test:v1命名为text-hello
  • -d 表示在后台运行容器
  • -p 8088:80 表示将宿主机的 8088 端口映射到容器的 80 端口。

之后就可以发布到上面说的仓库里面

优化方案

  • 优化指令顺序:将不经常变化的指令放在 Dockerfile 的前面,这样可以利用 Docker 的层缓存,加速后续构建过程
# 先复制不经常变动的文件
COPY requirements.txt /app/
# 再复制经常变动的文件
COPY . /app
  • 合并命令行:通过使用逻辑运算符 (&&) 合并命令行,减少镜像层的数量。
 # 不推荐
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2
# 推荐
RUN apt-get update && \apt-get install -y package1 package2 && \rm -rf /var/lib/apt/lists/*
  • 使用多阶段构建
如果应用程序有多个构建阶段,可以使用多个FROM指令构建多个阶段的镜像,以减小最终镜像的大小

docker部署Vue项目

服务器中创建工作目录

在这里插入图片描述

  • 前端打包好dist文件

构建vue应用镜像

  • nginx 是一个高性能的HTTP和反向代理服务器,此处我们选用 nginx 镜像作为基础来构建我们的vue应用镜像
docker pull nginx

编写 nginx config

在这里插入图片描述


server {listen       80;server_name  localhost; # 修改为docker服务宿主机的iplocation /api/ { ##前端接口所有的/api开头的接口都会被这里代理到下方proxy_pass的地址中proxy_pass http://192.168.1.3:9000/api/;   #转发后端请求的地址,前后端分离基本都会用到proxy_connect_timeout 6000;     #链接超时设置proxy_read_timeout 6000;        #访问接口超时设置}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}
}

编写Dockerfile

在这里插入图片描述

FROM nginx:该镜像是基于nginx:latest镜像构建的MAINTAINER onesummer:添加说明RUN rm /etc/nginx/conf.d/default.conf:删除目录下的default.conf文件ADD default.conf /etc/nginx/conf.d/:将default.conf复制到/etc/nginx/conf.d/下,用本地的default.conf配置来替换nginx镜像里的默认配置COPY dist/ /usr/share/nginx/html/:将项目根目录下dist文件夹(构建之后才会生成)下的所有文件复制到镜像/usr/share/nginx/html/目录下

执行如下命令

# 生成镜像
docker build -t [镜像名称] .
//-t 后输入给镜像取的名称,最后的点 (.) 不要忘记,代表给利用当前 dockerfile 构建镜像。 在镜像名称后要空格,再加一点
# 启动
docker run -d -p 88:80 --name [容器名] [镜像名]
  • 我们现在在浏览器中输入IP+端口号,就可以显示出网页。上图中的端口号是88。88是映射出服务器的端口号,可以自行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.GodotCanvasItem、Node2D及自定义节点

CanvasItem节点 CanvasItem节点&#xff0c;CanvasItem -> Node&#xff0c;所以CanvasItem继承了Node的所有功能Canvas是画布的意思&#xff0c;所以CanvasItem代表了就是可以被绘制的节点&#xff0c;可以设置可视化界面和材质的颜色所有的2D节点和GUI节点都继承于CanvasI…

网络行为分析与异常检测

构建防火墙和使用简单的安全解决方案不足以保护网络免受网络异常或攻击&#xff0c;因为DDoS攻击、未知恶意软件和其他安全威胁一直在上升&#xff0c;改变了网络安全格局。网络管理员必须积极主动地分析网络&#xff0c;获得对网络的完全控制&#xff0c;并全面了解网络流量活…

访问云平台中linux系统图形化界面,登录就出现黑屏的问题解决(ubuntu图形界面)

目录 一、问题-图形化界面访问黑屏 二、系统环境 &#xff08;一&#xff09;网络结构示意图 &#xff08;二&#xff09;内部机器版本 三、分析 四、解决过程 &#xff08;一&#xff09;通过MobaXterm远程访问图形化界面(未成功) 1、连接方法 2、连接结果 &#xf…

acwing-y总基础课算法笔记整理

技巧 vector, 变长数组&#xff0c;倍增的思想size() 返回元素个数 capacity() 容量empty() 返回是否为空clear() 清空front()/back()push_back()/pop_back()begin()/end()[]支持比较运算&#xff0c;按字典序pair<int, int>first, 第一个元素second, 第二个元素支持…

pt格式文件转engine小记【yolov5-6.0版本】

背景 项目是使用yolov5-6.0的版本&#xff0c;需要加一个新模型进去&#xff0c;yolov5提供的类别有很多&#xff0c;我这里使用chair椅子。第一步就是先把提供的pt文件转化为tensorrt所需要的engine格式的文件&#xff0c;在官网上有提供转换方法。&#xff08;似乎高版本的y…

查看apk是64位32位(三种方法)

通过检查APK文件&#xff0c;你可以确定该APK支持的架构类型&#xff0c;包括它是为64位&#xff08;例如arm64-v8a、x86_64&#xff09;还是32位&#xff08;例如armeabi-v7a、x86&#xff09;架构准备的。Android应用程序可以包含多个不同的二进制文件&#xff0c;每个文件针…

1097 矩阵行平移(语文题,选做)

输入样例&#xff1a; 7 2 99 11 87 23 67 20 75 89 37 94 27 91 63 50 11 44 38 50 26 40 26 24 73 85 63 28 62 18 68 15 83 27 97 88 25 43 23 78 98 20 30 81 99 77 36 48 59 25 34 22 输出样例&#xff1a; 529 481 479 263 417 342 343 样例解读 需要平移的是第 1、…

【Java】常见锁策略 CAS机制 锁优化策略

前言 在本文会详细介绍各种锁策略、CAS机制以及锁优化策略 不仅仅局限于Java&#xff0c;任何和锁相关的话题&#xff0c;都可能会涉及到下面的内容。 这些特性主要是给锁的实现者来参考的. 普通的程序猿也需要了解一些, 对于合理的使用锁也是有很大帮助的 文章目录 前言✍一、…

Spring Boot 2.x 将 logback 1.2.x 升级至 1.3.x

场景 安全部门针对代码进行漏洞扫描时&#xff0c;发现 logback-core 和 logback-classic 都属于 1.2.x 版本&#xff0c;这个版本存在 CVE 漏洞&#xff0c;并且建议升级到 1.3.x 版本。 问题 将两个包直接升级到 1.3.x 版本时&#xff0c;Spring Boot Web 服务启动直接出现…

CNN卷积神经网络之LeNet-5原理与实战

文章目录 CNN卷积神经网络之LeNet-5原理与实战1、LeNet-5网络结构&#xff1a;1.1、LeNet-5由两个部分组成&#xff1a;1.2、模型单元结构&#xff1a;1.3、数据的传输&#xff1a; 2、LeNet-5网络参数详解&#xff1a; CNN卷积神经网络之LeNet-5原理与实战 1、LeNet-5网络结构…

MySql8快速迁移版的制作过程

首先说明&#xff0c;mysql 8的安装不同与mysql5.x。 做程序的朋友都知道&#xff0c;程序好做&#xff0c;客户难伺候&#xff0c;因为限于用户的情况&#xff0c;如何能让用户把程序运行起来很关键&#xff0c;比如日前我在做 山东高中信息技术 学考 考前练习 系统时&#x…

VirtualBox虚拟机使用win11系统,忘记密码如何重置密码

1. 点击重启同时按住Shift&#xff08;按住不放&#xff09; 2. 直到出现下面的界面&#xff0c;释放Shift&#xff0c;并进入疑难解答 3. 进入高级选项 4. 进入命令提示符 5. 发现当前是在X盘&#xff1f; 6. 进入C:\Windows\System32 c: cd Windows\System32 7. 备份osk.exe…

27个必备的Python技巧,你一定要知道!

目 录 01. 为什么使用缩进来分组语句&#xff1f; Guido van Rossum 认为使用缩进进行分组非常优雅&#xff0c;并且大大提高了普通 Python 程序的清晰度。大多数人在一段时间后就学会并喜欢上这个功能。 由于没有开始/结束括号&#xff0c;因此解析器感知的分组与人…

C++能不能调用C语言的动态库?

能。C当然可以调用C语言编写的动态库。 在C和C开发中&#xff0c;有许多知名的C库被广泛使用&#xff0c;比如C标准库、zlib、libcurl、sqlite、cairo等等等等。这些库在C项目中经常会被用到。在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资…

Rust入门-引用借用

一、引用借用&#xff0c;是什么、为什么、怎么用 所有权上篇我们已经讨论过了&#xff0c;所以这篇我们讨论Rust的引用借用 1、引用借用 是什么&#xff1f; Rust 通过借用(Borrowing) 这个概念来达成上述的目的&#xff0c;获取变量的引用&#xff0c;称之为借用(borrowin…

维护SQLite的私有分支(二十六)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite、MySQL 和 PostgreSQL 数据库速度比较&#xff08;本文阐述时间很早比较&#xff0c;不具有最新参考性&#xff09;&#xff08;二十五&#xff09; 下一篇&#xff1a;SQLite数据库中JSON 函数和运算符 1…

汇编语言 实验10.1

汇编语言 实验10.1 assume cs:code,ds:datasgdatasg segmentdb welcome to masm!,0 datasg endsstack segmentdw 0,0,0,0,0,0,0,0 stack endscode segment ;代码段start: mov dh,8mov dl,3mov cl,2mov ax,datasgmov ds,axmov si,0call show_strmov ax,4c00h ;程序返回int 21hs…

已经下载了pytorch,但在正确使用一段时间后出现No module named torch的错误

问题描述 使用的是叫做m2release的虚拟环境&#xff0c;在此环境下使用conda list可以发现是存在pytorch的&#xff0c;但是运行代码时却报No module named torch的错误。 解决方案 想尝试卸掉这个pytorch重新装一次&#xff0c;但是想卸载会提示找不到&#xff0c;想重新…

Java八股文4

Linux篇 1.free命令-查看内存状态 free命令用于显示内存状态&#xff0c;它可以提供关于系统内存使用情况的详细信息。这个命令会显示出内存的使用情况&#xff0c;包括实体内存、虚拟的交换文件内存、共享内存区段&#xff0c;以及系统核心使用的缓冲区等。 其中&#xff0c;参…

每三人拥有一辆车!车载工业平板电脑五大硬性要求

在今年7月初&#xff0c;公安部发布2022年上半年全国机动车和驾驶人统计数据&#xff0c;数据显示&#xff0c;截至2022年6月底&#xff0c;全国机动车保有量达4.06亿辆&#xff0c;其中汽车3.10亿辆。此外&#xff0c;目前全国拥有驾驶证的人数高达4.92亿人&#xff0c;其中汽…