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

Linux容器技术详解

容器技术基础

什么是容器

容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。

Docker官网:https://www.docker.com/

与传统虚拟机相比,容器具有以下特点:

  1. 轻量级:容器共享主机操作系统内核,不需要完整的操作系统副本,因此启动速度快、资源占用少。
  2. 可移植性:容器封装了应用及其依赖,可以在不同环境中一致运行,解决了"在我的机器上能运行"的问题。
  3. 隔离性:容器提供了进程、文件系统、网络等资源的隔离,但隔离程度低于虚拟机。
  4. 高效性:容器可以在同一主机上高密度部署,提高资源利用率。
  5. 快速部署:容器可以快速启动和停止,支持快速扩展和缩减。

容器与虚拟机的区别

容器和虚拟机是两种不同的虚拟化技术,它们有以下主要区别:

特性容器虚拟机
虚拟化级别操作系统级虚拟化硬件级虚拟化
内核共享主机内核每个VM有独立内核
资源开销轻量级,MB级别重量级,GB级别
启动时间秒级分钟级
隔离性进程级隔离完全隔离
安全性相对较低较高
性能接近原生有一定损耗
操作系统支持限于主机内核兼容的OS几乎任何OS

Linux容器的核心技术

Linux容器技术基于以下几个核心内核特性:

1. Namespaces(命名空间)

命名空间提供了进程隔离的基础,Linux内核支持以下几种命名空间:

  • PID Namespace:进程ID隔离,容器内的进程看不到容器外的进程。
  • Network Namespace:网络栈隔离,每个容器有自己的网络设备、IP地址、路由表等。
  • Mount Namespace:文件系统挂载点隔离,容器有自己的文件系统视图。
  • UTS Namespace:主机名和域名隔离,容器可以有自己的主机名。
  • IPC Namespace:进程间通信资源隔离,容器内的进程只能与同一容器内的进程通信。
  • User Namespace:用户和组ID隔离,容器内外的用户ID可以映射,提高安全性。
  • Cgroup Namespace:控制组隔离,简化容器内进程对Cgroup的视图。
2. Cgroups(控制组)

Cgroups允许限制和监控进程组使用的资源,包括:

  • CPU:限制CPU使用率和调度优先级。
  • 内存:限制内存使用量和交换空间。
  • 磁盘I/O:限制读写速率和优先级。
  • 网络:通过tc(Traffic Control)限制网络带宽。
  • 设备:控制对设备的访问权限。
3. Union File System(联合文件系统)

联合文件系统允许将多个目录层叠在一起,形成一个统一的视图,是容器镜像分层存储的基础:

  • OverlayFS:现代Linux发行版中最常用的联合文件系统。
  • AUFS:早期Docker使用的联合文件系统。
  • Btrfs:支持写时复制和快照功能的文件系统。
  • ZFS:高级文件系统,支持数据压缩、重复数据删除等特性。
4. Seccomp(安全计算模式)

Seccomp限制容器内进程可以使用的系统调用,减少攻击面:

# 示例:使用seccomp配置文件启动容器
docker run --security-opt seccomp=/path/to/seccomp.json nginx
5. Capabilities(能力)

Linux Capabilities将传统的超级用户权限分解为更细粒度的权限集合,容器可以只获得必要的权限:

# 示例:移除所有能力并只添加必要的能力
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

Docker容器技术

Docker是最流行的容器平台,它简化了容器的创建、部署和管理。

Docker架构

Docker采用客户端-服务器架构,主要组件包括:

  1. Docker客户端(Client):用户通过命令行或API与Docker交互的接口。
  2. Docker守护进程(Daemon):运行在主机上的后台服务,管理容器的构建、运行和分发。
  3. Docker镜像(Images):容器的只读模板,包含运行容器所需的文件系统和配置。
  4. Docker容器(Containers):镜像的运行实例,包含应用及其运行环境。
  5. Docker仓库(Registry):存储和分发Docker镜像的服务,如Docker Hub。

Docker安装

在不同Linux发行版上安装Docker:

Ubuntu/Debian
# 更新包索引
sudo apt update# 安装依赖
sudo apt install apt-transport-https ca-certificates curl software-properties-common# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加Docker仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 更新包索引
sudo apt update# 安装Docker
sudo apt install docker-ce docker-ce-cli containerd.io# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker# 验证安装
sudo docker run hello-world
CentOS/RHEL
# 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker# 验证安装
sudo docker run hello-world
Fedora
# 安装依赖
sudo dnf -y install dnf-plugins-core# 添加Docker仓库
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo# 安装Docker
sudo dnf install docker-ce docker-ce-cli containerd.io# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker# 验证安装
sudo docker run hello-world

Docker基本命令

镜像管理
# 搜索镜像
docker search nginx# 拉取镜像
docker pull nginx:latest# 列出本地镜像
docker images# 删除镜像
docker rmi nginx:latest# 构建镜像
docker build -t myapp:1.0 .# 保存镜像到文件
docker save -o nginx.tar nginx:latest# 从文件加载镜像
docker load -i nginx.tar# 标记镜像
docker tag nginx:latest myregistry.com/nginx:v1
容器管理
# 创建并启动容器
docker run -d --name webserver -p 80:80 nginx# 列出运行中的容器
docker ps# 列出所有容器(包括已停止的)
docker ps -a# 启动/停止/重启容器
docker start webserver
docker stop webserver
docker restart webserver# 删除容器
docker rm webserver# 进入容器
docker exec -it webserver bash# 查看容器日志
docker logs webserver# 查看容器详细信息
docker inspect webserver# 查看容器资源使用情况
docker stats webserver
数据管理
# 创建数据卷
docker volume create mydata# 列出数据卷
docker volume ls# 查看数据卷详情
docker volume inspect mydata# 删除数据卷
docker volume rm mydata# 使用数据卷挂载
docker run -d --name db -v mydata:/var/lib/mysql mysql:5.7# 使用主机目录挂载
docker run -d --name web -v /host/path:/container/path nginx
网络管理
# 创建网络
docker network create mynetwork# 列出网络
docker network ls# 查看网络详情
docker network inspect mynetwork# 删除网络
docker network rm mynetwork# 连接容器到网络
docker network connect mynetwork webserver# 断开容器与网络的连接
docker network disconnect mynetwork webserver# 使用特定网络启动容器
docker run -d --name db --network mynetwork mysql:5.7

Dockerfile详解

Dockerfile是构建Docker镜像的脚本,包含一系列指令和参数。

基本指令
# 基础镜像
FROM ubuntu:20.04# 维护者信息
LABEL maintainer="your-email@example.com"# 设置工作目录
WORKDIR /app# 复制文件
COPY . .
ADD https://example.com/file.tar.gz /app/# 运行命令
RUN apt-get update && \apt-get install -y python3 python3-pip && \pip3 install -r requirements.txt && \apt-get clean && \rm -rf /var/lib/apt/lists/*# 设置环境变量
ENV NODE_ENV=production \PORT=3000# 暴露端口
EXPOSE 3000# 定义卷
VOLUME ["/data"]# 设置用户
USER nobody# 健康检查
HEALTHCHECK --interval=5m --timeout=3s \CMD curl -f http://localhost:3000/ || exit 1# 入口点
ENTRYPOINT ["python3"]# 默认命令
CMD ["app.py"]
最佳实践
  1. 使用多阶段构建:减小最终镜像大小
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 生产阶段
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. 合并RUN指令:减少镜像层数
# 不推荐
RUN apt-get update
RUN apt-get install -y package1
RUN apt-get install -y package2
RUN apt-get clean# 推荐
RUN apt-get update && \apt-get install -y package1 package2 && \apt-get clean && \rm -rf /var/lib/apt/lists/*
  1. 使用.dockerignore:排除不需要的文件
# .dockerignore示例
node_modules
npm-debug.log
Dockerfile
.git
.gitignore
README.md
  1. 使用特定标签而非latest:确保版本一致性
# 不推荐
FROM ubuntu# 推荐
FROM ubuntu:20.04
  1. 最小化层数和大小:优化构建速度和镜像大小
# 使用轻量级基础镜像
FROM alpine:3.14# 安装必要的包并清理
RUN apk add --no-cache python3 py3-pip

Docker Compose

Docker Compose是一个用于定义和运行多容器Docker应用的工具。

安装Docker Compose
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose --version
docker-compose.yml示例
version: '3'services:web:build: ./webports:- "80:80"depends_on:- dbenvironment:- DATABASE_URL=postgres://postgres:password@db:5432/mydbvolumes:- ./web:/codenetworks:- frontend- backenddb:image: postgres:13environment:- POSTGRES_PASSWORD=password- POSTGRES_DB=mydbvolumes:- postgres_data:/var/lib/postgresql/datanetworks:- backendredis:image: redis:6networks:- backendnetworks:frontend:backend:volumes:postgres_data:
Docker Compose命令
# 启动服务
docker-compose up -d# 查看服务状态
docker-compose ps# 查看服务日志
docker-compose logs# 停止服务
docker-compose stop# 启动服务
docker-compose start# 重启服务
docker-compose restart# 停止并删除容器、网络
docker-compose down# 停止并删除容器、网络、卷
docker-compose down -v# 构建或重建服务
docker-compose build# 执行命令
docker-compose exec web bash# 查看配置
docker-compose config

Kubernetes容器编排

Kubernetes(K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。

Kubernetes架构

Kubernetes集群由以下组件组成:

  1. 控制平面组件

    • kube-apiserver:API服务器,是控制平面的前端。
    • etcd:一致且高可用的键值存储,用于存储集群数据。
    • kube-scheduler:监视新创建的Pod,并决定在哪个节点上运行。
    • kube-controller-manager:运行控制器进程,如节点控制器、副本控制器等。
    • cloud-controller-manager:与云提供商的API交互。
  2. 节点组件

    • kubelet:确保容器在Pod中运行。
    • kube-proxy:维护节点上的网络规则,实现服务抽象。
    • 容器运行时:如Docker、containerd、CRI-O等,负责运行容器。

Minikube安装

Minikube是一个工具,可以在本地运行Kubernetes:

# 安装Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube# 安装kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl# 启动Minikube
minikube start# 验证安装
kubectl get nodes

Kubernetes基本概念

Pod

Pod是Kubernetes中最小的可部署单元,可以包含一个或多个容器:

# pod.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-podlabels:app: nginx
spec:containers:- name: nginximage: nginx:1.19ports:- containerPort: 80
# 创建Pod
kubectl apply -f pod.yaml# 查看Pod
kubectl get pods# 查看Pod详情
kubectl describe pod nginx-pod# 删除Pod
kubectl delete pod nginx-pod
Deployment

Deployment提供了Pod的声明式更新和扩展能力:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19ports:- containerPort: 80
# 创建Deployment
kubectl apply -f deployment.yaml# 查看Deployment
kubectl get deployments# 扩展Deployment
kubectl scale deployment nginx-deployment --replicas=5# 更新Deployment
kubectl set image deployment/nginx-deployment nginx=nginx:1.20# 查看更新状态
kubectl rollout status deployment/nginx-deployment# 回滚更新
kubectl rollout undo deployment/nginx-deployment
Service

Service定义了Pod的访问方式:

# service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:selector:app: nginxports:- port: 80targetPort: 80type: ClusterIP  # 可选值:ClusterIP, NodePort, LoadBalancer, ExternalName
# 创建Service
kubectl apply -f service.yaml# 查看Service
kubectl get services# 查看Service详情
kubectl describe service nginx-service# 删除Service
kubectl delete service nginx-service
ConfigMap和Secret

ConfigMap用于存储非敏感配置,Secret用于存储敏感信息:

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:app.properties: |environment=productionlog_level=infodatabase.properties: |host=db.example.comport=5432
# secret.yaml
apiVersion: v1
kind: Secret
metadata:name: app-secret
type: Opaque
data:username: YWRtaW4=  # base64编码的"admin"password: cGFzc3dvcmQ=  # base64编码的"password"
# 创建ConfigMap和Secret
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml# 在Pod中使用ConfigMap
apiVersion: v1
kind: Pod
metadata:name: app-pod
spec:containers:- name: appimage: myapp:1.0volumeMounts:- name: config-volumemountPath: /etc/configenv:- name: LOG_LEVELvalueFrom:configMapKeyRef:name: app-configkey: log_levelvolumes:- name: config-volumeconfigMap:name: app-config
# 在Pod中使用Secret
apiVersion: v1
kind: Pod
metadata:name: app-pod
spec:containers:- name: appimage: myapp:1.0env:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: app-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: app-secretkey: password
持久卷(PV)和持久卷声明(PVC)

PV提供了存储资源,PVC是对PV的请求:

# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-volume
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainhostPath:path: /data/pv0001
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pv-claim
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi
# 在Pod中使用PVC
apiVersion: v1
kind: Pod
metadata:name: app-pod
spec:containers:- name: appimage: myapp:1.0volumeMounts:- name: data-volumemountPath: /datavolumes:- name: data-volumepersistentVolumeClaim:claimName: pv-claim

Helm包管理器

Helm是Kubernetes的包管理器,简化了应用的部署和管理:

# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash# 添加仓库
helm repo add stable https://charts.helm.sh/stable# 更新仓库
helm repo update# 搜索Chart
helm search repo nginx# 安装Chart
helm install my-nginx stable/nginx# 查看已安装的Release
helm list# 升级Release
helm upgrade my-nginx stable/nginx --set replicaCount=3# 回滚Release
helm rollback my-nginx 1# 卸载Release
helm uninstall my-nginx# 创建自己的Chart
helm create mychart

容器安全

容器安全是容器技术应用中的重要考虑因素。

容器安全最佳实践

  1. 使用最小基础镜像

    • 使用Alpine或Distroless等最小化镜像
    • 减少攻击面和漏洞风险
  2. 定期更新镜像

    • 保持基础镜像和依赖的更新
    • 使用自动化工具扫描镜像漏洞
  3. 不要以root用户运行容器

    # 在Dockerfile中创建非root用户
    RUN adduser -D appuser
    USER appuser
    
  4. 限制容器资源

    # 限制CPU和内存
    docker run --cpus=0.5 --memory=512m nginx
    
  5. 使用只读文件系统

    # 使用只读文件系统,只有特定目录可写
    docker run --read-only --tmpfs /tmp nginx
    
  6. 使用安全扫描工具

    • Clair
    • Trivy
    • Anchore Engine
    • Docker Bench for Security
  7. 实施网络分段

    • 使用自定义网络隔离容器
    • 限制容器间通信
  8. 使用安全计算模式(seccomp)

    # 使用seccomp配置文件
    docker run --security-opt seccomp=/path/to/seccomp.json nginx
    
  9. 限制容器能力(capabilities)

    # 移除所有能力并只添加必要的能力
    docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
    
  10. 使用内容信任和镜像签名

    # 启用Docker内容信任
    export DOCKER_CONTENT_TRUST=1
    docker push myregistry.com/myimage:1.0
    

容器安全工具

  1. Docker Bench for Security

    # 运行Docker安全基准测试
    docker run --net host --pid host --userns host --cap-add audit_control \-v /var/lib:/var/lib \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/lib/systemd:/usr/lib/systemd \-v /etc:/etc --label docker_bench_security \docker/docker-bench-security
    
  2. Trivy

    # 安装Trivy
    sudo apt-get install wget apt-transport-https gnupg lsb-release
    wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
    echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
    sudo apt-get update
    sudo apt-get install trivy# 扫描镜像
    trivy image nginx:latest
    
  3. Falco

    # 安装Falco
    curl -s https://falco.org/repo/falcosecurity-3672BA8F.asc | apt-key add -
    echo "deb https://download.falco.org/packages/deb stable main" | tee -a /etc/apt/sources.list.d/falcosecurity.list
    apt-get update -y
    apt-get install -y falco# 启动Falco
    systemctl start falco
    

容器网络

容器网络是容器技术的重要组成部分,它使容器能够相互通信以及与外部世界通信。

Docker网络模式

Docker支持多种网络模式:

  1. Bridge网络:默认网络模式,容器通过网桥连接。

    # 创建自定义桥接网络
    docker network create --driver bridge my-bridge-network# 使用自定义网络启动容器
    docker run --network my-bridge-network nginx
    
  2. Host网络:容器使用主机的网络命名空间。

    # 使用host网络启动容器
    docker run --network host nginx
    
  3. None网络:容器没有网络接口。

    # 使用none网络启动容器
    docker run --network none nginx
    
  4. Overlay网络:用于Docker Swarm中的多主机通信。

    # 创建overlay网络
    docker network create --driver overlay my-overlay-network
    

相关文章:

Linux容器技术详解

容器技术基础 什么是容器 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖(库、二进制文件、配置文件等)打包在一个独立的单元中,可以在任何支持容器运行时的环境中一致地运行。 Docker官网:https://www.docker…...

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的,例如Vivado自带仿真工具,且无需联合外部仿真工具,例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim,才能实现仿真功能。 方法一:FUXI联合ModelSim 1 添加testbench文件 新建to…...

STM32 __main

STM32开发中__main与用户main()函数的本质区别及工作机制 在STM32开发中,__main和用户定义的main()函数是启动过程中的两个关键节点,分别承担运行时初始化和用户程序入口的职责。以下是它们的核心差异及协作机制: 一、定义与层级差异 ​__ma…...

【离散化 线段树】P3740 [HAOI2014] 贴海报|普及+

本文涉及知识点 C线段树 [HAOI2014] 贴海报 题目描述 Bytetown 城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论。为了统一管理,城市委员会为选民准备了一个张贴海报的 electoral 墙。 张贴规则如下: electoral…...

Python训练营打卡Day28

浙大疏锦行 DAY 28 类的定义和方法 知识点回顾: 1.类的定义 2.pass占位语句 3.类的初始化方法 4.类的普通方法 5.类的继承:属性的继承、方法的继承 作业 题目1:定义圆(Circle)类 要求: 1.包含属性&#x…...

MODBUS RTU通信协议详解与调试指南

一、MODBUS RTU简介 MODBUS RTU(Remote Terminal Unit)是一种基于串行通信(RS-485/RS-232)的工业标准协议,采用二进制数据格式,具有高效、可靠的特点,广泛应用于PLC、传感器、变频器等工业设备…...

CSP 2024 提高级第一轮(CSP-S 2024)单选题解析

单选题解析 第 1 题 在 Linux 系统中,如果你想显示当前工作目录的路径,应该使用哪个命令?(A) A. pwd B. cd C. ls D. echo 解析:Linux 系统中,pwd命令可以显示当前工作目录的路径。pwd&#x…...

六、绘制图片

文章目录 1.创建一个红色图片2.加载bmp图片3.加载png、jpg图片 前面的几个示例,我们已经展示过如果在Linux系统下使用xlib接口向窗口中绘制文本、线、矩形;并设置文本、线条的颜色。并利用xlib提供的接口结合事件处理机制完成了一个自绘按钮控件功能。有…...

Java 面向对象详解和JVM底层内存分析

先关注、点赞再看、人生灿烂!!!(谢谢) 神速熟悉面向对象 表格结构和类结构 我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。实际上,“表格思维”就是…...

深度学习---知识蒸馏(Knowledge Distillation, KD)

一、知识蒸馏的本质与起源 定义: 知识蒸馏是一种模型压缩与迁移技术,通过将复杂高性能的教师模型(Teacher Model)所学的“知识”迁移到轻量级的学生模型(Student Model),使学生模型在参数量和计…...

基于CNN卷积神经网络的带频偏QPSK调制信号检测识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2024b 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频&#xff09…...

【DAY21】 常见的降维算法

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 目录 PCA主成分分析 t-sne降维 线性判别分析 (Linear Discriminant Analysis, LDA) 作业: 什么时候用到降维 降维的主要应用场景 知识点回顾: PCA主成分分析t-sne降维LDA线性判别 通常情况下,…...

PostGIS实现栅格数据入库-raster2pgsql

raster2pgsql使用与最佳实践 一、工具概述 raster2pgsql是PostGIS提供的命令行工具,用于将GDAL支持的栅格格式(如GeoTIFF、JPEG、PNG等)导入PostgreSQL数据库,支持批量加载、分块切片、创建空间索引及金字塔概览,是栅格数据入库的核心工具。 二、核心功能与典型用法 1…...

校园社区小程序源码解析

基于ThinkPHP、FastAdmin和UniApp开发的校园社区小程序源码,旨在为校园内的学生和教职员工提供一个便捷的在线交流和服务平台。 该小程序前端采用UniApp进行开发,具有良好的跨平台兼容性,可以轻松发布到iOS和Android平台。同时,后…...

第6章:文件权限

一、文件权限概述 Linux为了保证系统中每个文件的安全,引入了文件权限机制。针对于系统中的每一个文件Linux都可以提供精确的权限控制。它可以做到不同的用户对同一个文件具有不同的操作权利。而通常这个权利包括以下3个: 读的权利(Read&…...

使用 Python 连接 Oracle 23ai 数据库完整指南

方法一:使用 oracledb 官方驱动(推荐) Oracle 官方维护的 oracledb 驱动(原 cx_Oracle)是最新推荐方案,支持 Thin/Thick 两种模式。 1. 环境准备 pip install oracledb2. 完整示例代码 import oracledb import getpass from typing import Unionclass Oracle23aiConn…...

C语言| 指针变量的定义

C语言| 指针的优点-CSDN博客 * 表示“指向”,为了说明指针变量和它所指向的变量之间的联系。 int * i;//表示指针变量i里面存放的地址,所指向的存储单元里的【数据】。 【指针变量的定义】 C语言规定所有变量,在使用前必须先定…...

HTML 中的 input 标签详解

HTML 中的 input 标签详解 一、基础概念 1. 定义与作用 HTML 中的 <input> 标签是表单元素的核心组件&#xff0c;用于创建各种用户输入字段。作为一个空标签&#xff08;没有闭合标签&#xff09;&#xff0c;它通过 type 属性来决定呈现何种输入控件&#xff0c;是实…...

Python 在自动驾驶数据标签中的应用:如何让 AI 读懂道路?

Python 在自动驾驶数据标签中的应用:如何让 AI 读懂道路? 在自动驾驶系统中,数据就是生命线。不管是摄像头、激光雷达还是雷达传感器,这些设备每天都能产生 海量数据,但如果这些数据没有被正确标注,它们对 AI 来说毫无意义。那么,如何让自动驾驶系统准确理解道路环境呢…...

微信小程序之按钮短时间内被多次点击问题

做项目的时候碰到这个问题&#xff0c;按钮的功能做好了&#xff0c;但是总会出现按的太快&#xff0c;出现不可预料的问题。 解决方法之一&#xff1a;借助函数节流来实现 1、创建一个工具包&#xff08;throttle.js&#xff09;,通过封装一个高阶函数&#xff0c;对函数的执…...

动态规划(3)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…...

两个电机由同一个控制器控制,其中一个电机发生堵转时,另一个电机的电流会变大,是发生了倒灌现象吗?电流倒灌产生的机理是什么?

当两个电机由同一个控制器驱动&#xff0c;且其中一个电机发生堵转时&#xff0c;另一个电机的电流确实可能异常增大&#xff0c;但这不一定是典型的“倒灌现象”&#xff0c;而更可能是由于共母线电压波动或能量回馈导致的。以下是具体分析&#xff1a; 1. 现象是否属于“电流…...

Java 方法向 Redis 里操作字符串有什么需要注意的?​

在 Java 开发中&#xff0c;Redis 作为高性能的键值存储数据库&#xff0c;常被用于缓存数据、处理高并发场景等。当我们使用 Java 方法向 Redis 中操作字符串类型数据时&#xff0c;有许多关键要点需要格外注意。这些要点不仅关系到代码的正确性和性能&#xff0c;还影响着整个…...

ECMAScript 2018(ES2018):异步编程与正则表达式的深度进化

1.版本背景与发布 发布时间&#xff1a;2018年6月&#xff0c;由ECMA International正式发布&#xff0c;标准编号为ECMA-262 9th Edition。历史意义&#xff1a;作为ES6之后的第三次年度更新&#xff0c;ES2018聚焦于异步编程、正则表达式和对象操作的标准化&#xff0c;推动…...

IntelliJ IDEA给Controller、Service、Mapper不同文件设置不同的文件头注释模板、Velocity模板引擎

通过在 IntelliJ IDEA 中的 “Includes” 部分添加多个文件头模板&#xff0c;并在 “Files” 模板中利用这些包含来实现不同类型文件的注释。以下是为 Controller、Service、Mapper 文件设置不同文件头的完整示例&#xff1a; 1. 设置 Includes 文件头模板 File > Settin…...

从零开始认识 Node.js:异步非阻塞的魅力

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它的设计目标是让开发者能够用 JavaScript 构建高性能、可扩展的网络应用。以下是关于 Node.js 的详细介绍&#xff1a; 1. 核心特点 事件驱动与非阻塞 I/O&…...

【C语言练习】046. 编写插入排序算法

046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...

【论文阅读】BEVFormer

〇、Introduction BEVFormer是现在端到端无人驾驶中常使用的一个Backbone&#xff0c;用于将六个视角下的图像转换为鸟瞰图视角下的特征&#xff0c;转换出的BEV特征则会被用于后续模块的特征交互。然而在这个模型设计的初期&#xff0c;其最本质的意图是为了提取用于各种CV任…...

IDEA编辑器设置的导出导入

背景 最近新换了电脑&#xff0c;因为之前是 Intel 芯片的 Mac&#xff0c;这次换了 arm 架构的 M 芯片的 Mac&#xff0c;旧 Mac 上的很多软件不兼容&#xff0c;所以就没有选择换机数据迁移&#xff0c;一点一点下载、配置了所有环境。 导出 IDEA 支持设置的导入导出&…...

手动实现 Transformer 模型

本文使用 Pytorch 库手动实现了传统 Transformer 模型中的多头自注意力机制、残差连接和层归一化、前馈层、编码器、解码器等子模块&#xff0c;进而实现了对 Transformer 模型的构建。 """ Title: 解析 Transformer Time: 2025/5/10 Author: Michael Jie &quo…...