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

深入讲解 Docker 及实践

Docker 是现代化应用开发、测试和生产环境部署中不可或缺的工具。它能够为开发人员提供与生产环境一致的开发环境,同时支持高效的容器化部署、资源隔离、容器编排等高级功能。尤其在微服务架构和云原生应用中,Docker 更是提供了简化的流程和高效的可扩展性。

一、Docker 基本概念与工作原理回顾

1.1 Docker 架构解析

Docker 架构包括两部分:Docker ClientDocker Daemon,以及 Docker RegistryDocker Container

  • Docker Daemon (dockerd):是 Docker 的后台服务,负责管理容器的生命周期,处理所有与 Docker 客户端交互的请求,管理容器、镜像、网络和卷等资源。
  • Docker Client:用户与 Docker Daemon 交互的工具,可以是命令行工具(如 docker 命令)或程序化 API。
  • Docker Registry:存储 Docker 镜像的地方,最常用的是 Docker Hub,用户可以从中拉取镜像,也可以上传自定义镜像。
  • Docker Container:容器是镜像的运行时实例,它通过 Docker Daemon 启动,并在一个隔离的环境中运行应用。

1.2 Docker 镜像与容器的关系

  • 镜像 是只读的,包含运行应用所需的所有文件系统和依赖,容器是镜像的一个运行实例,包含一个可写层,能够对文件进行修改。
  • 容器之间的文件系统是独立的,即使多个容器使用相同的镜像,它们的文件系统也不会相互干扰。

二、实践:端口映射、文件映射、替代本地开发环境

2.1 端口映射

在 Docker 中,容器和宿主机之间的网络是隔离的,因此如果我们希望容器中的服务能够被宿主机或外部网络访问,就必须配置端口映射。端口映射的格式是 -p <host_port>:<container_port>,用于将宿主机的端口映射到容器内的端口。

示例:Flask Web 应用端口映射

假设我们已经通过 Dockerfile 构建了一个 Python Flask 应用,现在需要将容器内的 Flask 应用端口(5000)映射到宿主机的 5000 端口:

docker run -d -p 5000:5000 flask-app
  • -p 5000:5000:宿主机的 5000 端口映射到容器的 5000 端口,意味着宿主机访问 http://localhost:5000 时,实际访问的是容器内的 Flask 应用。

2.2 文件映射(Volume Mapping)

容器中的数据存储是临时的,容器停止或删除后,容器内的数据会丢失。因此,文件映射 是一种将宿主机的目录与容器内的目录进行绑定的机制,用于持久化数据或共享文件。

示例:MySQL 数据持久化

假设你正在运行一个 MySQL 容器,并希望将容器中的数据库文件持久化到宿主机的 /data/mysql 目录,防止容器删除后数据丢失。

docker run -d -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest
  • -v /data/mysql:/var/lib/mysql:将宿主机的 /data/mysql 目录挂载到容器内的 /var/lib/mysql 目录,这样即使容器被删除,数据也会保留在宿主机上。

2.3 使用 Docker 环境替代本地开发环境

Docker 允许我们在本地快速搭建一个与生产环境相同的开发环境,避免了开发人员由于操作系统差异、软件版本不同等问题产生的“在我电脑上能跑”问题。

示例:使用 Docker Compose 配置多容器开发环境

假设我们有一个 Node.js 应用和一个 PostgreSQL 数据库,需要在本地开发环境中一起使用。我们可以使用 Docker Compose 来定义和管理这两个容器。

  1. 创建 docker-compose.yml 文件

    version: "3"
    services:app:image: node:14working_dir: /appvolumes:- .:/appcommand: npm startports:- "3000:3000"db:image: postgresenvironment:POSTGRES_PASSWORD: examplevolumes:- db-data:/var/lib/postgresql/dataports:- "5432:5432"volumes:db-data:
    
    • app 服务使用 Node.js 镜像,并挂载本地代码到 /app
    • db 服务使用 PostgreSQL 镜像,定义了数据库密码并将数据存储到宿主机的卷中。
  2. 启动环境

    在项目根目录下运行以下命令:

    docker-compose up
    

    这将启动 Node.js 应用和 PostgreSQL 数据库容器,并确保它们能够一起工作。

  3. 开发与调试

    • 在本地开发过程中,所有修改的代码会实时反映到容器内,避免了环境不一致的问题。
    • 如果你需要对数据库进行开发,可以直接在 db 服务中进行操作。

2.4 Docker 环境与生产环境替换

通过使用 Docker,开发人员能够在本地和生产环境中保持一致的环境。Docker 提供的隔离和资源管理功能,确保了开发、测试和生产环境中的行为一致。

  • 本地开发环境:通过 Docker Compose 可以快速搭建本地开发环境,包含应用服务和数据库等。
  • 生产环境:在生产环境中,可以使用 Docker Swarm 或 Kubernetes 来进行容器编排和自动化部署。

2.5 横向扩展部署与负载均衡

在应用流量增长时,我们需要通过横向扩展来扩容服务。Docker 容器非常适合这种扩展方式,可以通过 Docker Compose、Docker Swarm 或 Kubernetes 来实现。

使用 Docker Compose 扩展服务

通过 Docker Compose,我们可以轻松增加容器副本,确保高可用性和负载均衡。

version: "3"
services:web:image: nginxdeploy:replicas: 3ports:- "80:80"
  • deploy.replicas:指定服务的副本数量,此例中 nginx 服务有 3 个副本。
  • 这样设置后,Docker Compose 会启动 3 个 nginx 容器实例,确保负载均衡和高可用性。
使用 Docker Swarm 扩展服务
  1. 初始化 Swarm 集群

    在主节点上运行以下命令来初始化 Swarm:

    docker swarm init
    
  2. 创建服务并扩展

    在 Swarm 集群中创建一个 Web 服务并设置 3 个副本:

    docker service create --name webapp --replicas 3 -p 80:80 nginx
    

    这将启动一个包含 3 个副本的 nginx 服务,Swarm 会自动处理负载均衡。

  3. 管理服务

    使用 docker service 命令来管理服务副本、扩展或缩减容器数量:

    docker service scale webapp=5
    

    该命令将 webapp 服务的副本数扩展到 5 个。

2.6 Kubernetes 横向扩展

Kubernetes 提供了更强大的容器编排和横向扩展功能,支持自动伸缩、健康检查、负载均衡等。

示例:使用 Kubernetes 扩展服务
  1. 部署 Pod

    通过 kubectl 创建一个包含多个副本的 Pod 服务:

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: nginx-deployment
    spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest
使用 `kubectl apply -f nginx-deployment.yaml` 创建服务,Kubernetes 会自动管理多个副本的容器。2. **自动扩展**:Kubernetes 可以根据负载自动扩展容器副本:```bashkubectl autoscale deployment nginx-deployment --min=1 --max=10 --cpu-percent=50

当容器的 CPU 使用率超过 50% 时,Kubernetes 会自动增加容器副本。


非常感谢你的耐心和反馈,我会继续深入讲解 Docker 的实践应用,并涵盖更多高级使用场景。我们接下来将继续深入探讨 Docker 的高级功能,包括:多环境配置、持久化存储、日志管理、安全性、网络管理、Docker Compose 和 Kubernetes 的高级用法 等。


三、Docker 高级功能解析与实践

3.1 多环境配置与管理

在开发中,我们常常需要处理不同环境(如开发环境、测试环境、生产环境)的配置和管理。Docker 使得这些环境管理变得更加简便,通过 Docker Compose 和多环境配置,我们可以为不同环境提供不同的配置文件或变量。

3.1.1 使用 Docker Compose 管理多环境配置

Docker Compose 使得我们能够在一个 YAML 文件中定义多个服务,同时也支持在不同的环境中使用不同的配置文件。通过 docker-compose.override.yml 文件,可以实现不同环境下的配置覆盖。

示例:开发与生产环境的多配置管理

  1. 基础的 docker-compose.yml 配置

    version: "3"
    services:app:image: node:14working_dir: /appvolumes:- .:/appports:- "3000:3000"
    
  2. 开发环境覆盖配置 docker-compose.override.yml

    在开发环境下,我们可能需要启用一些特定的配置,比如将开发代码挂载到容器中,开启调试模式等:

    version: "3"
    services:app:environment:- NODE_ENV=developmentvolumes:- .:/appports:- "3000:3000"
    
  3. 生产环境配置 docker-compose.prod.yml

    在生产环境中,我们可能希望禁用调试信息,使用生产版本的镜像,并连接到真实的数据库服务:

    version: "3"
    services:app:image: my-app-prodenvironment:- NODE_ENV=productionports:- "80:3000"networks:- prod-networknetworks:prod-network:driver: bridge
    
  4. 使用不同的配置启动 Docker Compose

    • 在开发环境中:

      docker-compose up
      
    • 在生产环境中:

      docker-compose -f docker-compose.yml -f docker-compose.prod.yml up
      

通过这种方式,我们可以根据不同的环境要求,动态调整服务的配置。

3.2 持久化存储:管理数据卷

Docker 默认情况下是无状态的,也就是说,当容器删除时,容器内的数据会丢失。为了持久化数据,我们使用 Docker Volumes 来挂载宿主机的文件系统或使用外部存储服务来保存数据。

3.2.1 创建与使用数据卷(Volumes)
  1. 创建一个名为 my-volume 的卷

    docker volume create my-volume
    
  2. 将卷挂载到容器中

    假设我们运行一个 MySQL 容器,并希望将数据库的数据存储在 my-volume 卷中:

    docker run -d -v my-volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest
    
  3. 查看 Docker 卷

    查看系统中所有的 Docker 卷:

    docker volume ls
    
  4. 数据卷备份与恢复

    • 备份卷

      docker run --rm -v my-volume:/volume -v $(pwd):/backup busybox tar czf /backup/backup.tar.gz /volume
      
    • 恢复卷

      docker run --rm -v my-volume:/volume -v $(pwd):/backup busybox tar xzf /backup/backup.tar.gz -C /volume
      
3.2.2 使用绑定挂载(Bind Mounts)

除了数据卷,Docker 还支持 绑定挂载,允许你将宿主机的具体文件或目录挂载到容器中。它特别适用于开发环境,可以实时同步本地文件和容器中的文件。

  1. 示例:将宿主机目录挂载到容器中

    docker run -d -v /path/on/host:/path/in/container my-app
    
  2. 实时修改本地文件

    使用绑定挂载时,容器内的文件和宿主机的文件实时同步。比如,在开发 Web 应用时,你可以编辑宿主机上的文件,容器内的应用自动感知这些变化,无需重新构建镜像。

3.3 Docker 日志管理

在容器化的应用中,日志管理尤为重要,尤其是在生产环境中。Docker 提供了多种日志驱动来帮助收集和管理容器日志。

3.3.1 使用 Docker 的默认日志驱动
  1. 查看容器日志

    使用 docker logs 查看容器的标准输出和标准错误日志:

    docker logs <container_id>
    
  2. 查看实时日志

    docker logs -f <container_id>
    
3.3.2 配置 Docker 日志驱动

Docker 支持多种日志驱动,如 json-file(默认)、syslogfluentdawslogs 等,可以通过设置容器的 --log-driver 参数来选择不同的日志存储方式。

例如,将日志发送到 syslog

docker run --log-driver=syslog my-app
3.3.3 集成日志管理工具

在生产环境中,容器的日志量通常较大,使用日志管理工具(如 ELK Stack 或 Fluentd)来集中管理日志非常重要。你可以通过配置 Docker 日志驱动,将日志发送到远程服务器或者日志分析平台。

3.4 Docker 网络管理与服务发现

Docker 提供了多种网络模式和服务发现机制,确保容器之间能够高效、安全地通信。

3.4.1 Docker 网络模式
  • bridge(默认模式):为容器创建一个私有的网络接口,并通过宿主机与外部通信。
  • host:容器直接使用宿主机的网络接口,不进行网络隔离。
  • none:容器没有网络接口。
  • container:将容器的网络接口与另一个容器共享。
3.4.2 Docker Compose 中的网络配置

在 Docker Compose 中,服务间的网络是自动创建的,但我们也可以手动配置网络。

示例:创建自定义网络并配置服务

version: "3"
services:app:image: node:14networks:- my-networkdb:image: postgresnetworks:- my-networknetworks:my-network:driver: bridge

在上面的配置中,appdb 服务都连接到了同一个名为 my-network 的自定义网络。

3.4.3 服务发现与负载均衡

在 Docker Compose 中,服务名称(如 appdb)自动成为 DNS 名称,可以通过这些名称进行服务间通信。Docker Compose 会自动处理负载均衡。

例如,容器 app 可以通过 http://db 访问容器 db 提供的服务。

3.5 Docker 安全性

Docker 提供了一些安全性措施来保证容器的隔离性和宿主机的安全。理解 Docker 安全最佳实践,能够确保你在容器化环境中的应用不受攻击。

3.5.1 用户与权限管理

Docker 默认运行在 root 用户下,因此建议使用 非 root 用户 来运行容器。你可以通过以下方式在 Dockerfile 中创建非 root 用户:

FROM node:14
RUN useradd -ms /bin/bash myuser
USER myuser
3.5.2 使用 Seccomp 和 AppArmor
  • Seccomp:通过配置 seccomp 配置文件来限制容器可以使用的系统调用,从而增加安全性。
  • AppArmor:可以为容器配置安全策略,限制容器访问宿主机资源的权限。
3.5.3 使用 Docker Content Trust

启用 Docker Content Trust (DCT) 可以确保你从 Docker Hub 拉取的镜像是经过签名和验证的,避免使用不安全的镜像。

export DOCKER_CONTENT_TRUST=1
docker pull my-image

四、Kubernetes 高级用法与扩展

4.1 Kubernetes 的容器编排与服务发现

Kubernetes 提供了更加复杂的容器编排和自动扩展功能,支持服务发现、负载均衡、自动扩展等多种功能。在 Docker Sw

arm 和 Kubernetes 中,横向扩展的操作基本类似,Kubernetes 的优势在于支持大规模分布式系统的管理和调度。

4.2 Kubernetes 的服务和网络

  • Pod:Kubernetes 中的最小部署单元,可以包含一个或多个容器。
  • Deployment:Kubernetes 用来管理应用生命周期的资源对象,能够自动进行副本管理、扩展、更新。
  • Service:Kubernetes 内部的负载均衡组件,负责将流量路由到不同的 Pod。

通过 Kubernetes 可以方便地进行自动化部署、扩展和高可用性管理,特别适合大型应用和微服务架构。


好的,让我们继续深入探讨 Docker 和 Kubernetes 的高级功能以及它们在实际开发、运维中的应用。接下来将包括 Docker 网络与安全管理Kubernetes 高级操作容器的资源限制与调度多云与跨云部署 等内容,进一步扩展实践场景和解决方案。


五、Docker 网络与安全管理

5.1 Docker 网络深入剖析

Docker 提供了多种网络模式,以确保容器之间能够有效地进行通信和隔离。在容器化的环境中,理解和配置网络至关重要,尤其是在复杂的多容器应用中。以下是 Docker 网络的几种常见模式和高级用法。

5.1.1 网络模式:Bridge、Host、Overlay
  1. Bridge 网络:这是 Docker 默认的网络模式,适用于单机 Docker 环境。Docker 会为每个容器分配一个虚拟网卡,所有容器通过 Docker 的虚拟网络桥接在一起,形成一个内部的私有网络,容器间可以通过 IP 地址通信。

  2. Host 网络:容器直接使用宿主机的网络栈,在这种模式下,容器不会被隔离在一个独立的网络命名空间内。此模式适用于高性能的场景,因为容器与宿主机共享网络堆栈,但也会牺牲隔离性。

  3. Overlay 网络:适用于多主机容器通信,Docker Swarm 和 Kubernetes 都使用 Overlay 网络来跨多个主机连接容器。通过 Overlay 网络,容器可以在不同的宿主机上通信,像在同一个网络中一样。

5.1.2 Docker Compose 中的网络配置

在 Docker Compose 中,可以显式指定容器使用的网络,或者让 Compose 自动创建网络。下面是一个多容器应用的 Docker Compose 配置示例,包含自定义网络。

version: '3'
services:web:image: nginxnetworks:- frontendapp:image: my-appnetworks:- backenddb:image: postgresnetworks:- backendnetworks:frontend:driver: bridgebackend:driver: overlay

在此例中,frontendbackend 是两个独立的网络,web 服务连接 frontend 网络,而 appdb 服务连接 backend 网络。Docker 会在运行时自动为每个网络分配 IP 地址,并管理网络流量。

5.1.3 Docker 网络插件

Docker 支持通过插件扩展网络功能,可以集成第三方网络插件,如 WeaveCalicoCilium 等,来满足更复杂的网络需求。例如,Calico 插件不仅提供容器网络,还提供基于 IP 的安全策略。

5.1.4 容器间通信与 DNS

Docker 默认会为每个容器分配一个 DNS 名称,容器可以通过这些 DNS 名称互相通信。对于多容器应用,容器间的通信通常通过服务名(如在 Docker Compose 中定义的服务名)来访问。

例如,假设你在 Docker Compose 配置文件中定义了一个 db 服务,web 服务可以通过 db:5432 来访问数据库,而不需要通过 IP 地址。

5.1.5 Docker 网络隔离与防火墙

对于多租户环境或需要严格隔离的场景,Docker 提供了网络隔离功能。通过 Docker 的网络管理工具,我们可以为不同的容器配置不同的网络,并应用防火墙规则,限制容器之间的通信。

docker network create --driver bridge --subnet 172.18.0.0/16 mynetwork

此命令创建了一个自定义桥接网络 mynetwork,并为容器分配了 172.18.0.0/16 的子网。可以根据需要配置防火墙规则和网络访问控制,确保容器的安全性。

5.2 Docker 安全性深入剖析

容器的安全性一直是 Docker 技术中关注的重点,尤其在生产环境中。以下是一些提升 Docker 安全性的最佳实践。

5.2.1 容器运行时安全:限制容器权限

默认情况下,Docker 容器会以 root 用户运行,这可能会带来安全风险。为降低容器中运行的进程的权限,可以通过以下方式配置容器:

  1. 以非 root 用户运行容器

    在 Dockerfile 中创建一个非 root 用户,并指定该用户运行应用:

    FROM node:14
    RUN useradd -ms /bin/bash myuser
    USER myuser
    
  2. 使用 --user 参数运行容器

    docker run --user 1001:1001 myapp
    

    这将确保容器中的应用以非 root 用户运行,从而避免容器内进程拥有过高的权限。

5.2.2 容器隔离:使用 SELinux 或 AppArmor
  • SELinuxAppArmor 是 Linux 内核中的安全模块,用于强制访问控制。Docker 可以与这些安全模块集成,为容器提供更强的安全隔离。例如,通过配置 AppArmor 策略来限制容器访问主机的敏感资源。
5.2.3 使用 Docker Content Trust(DCT)

启用 Docker Content Trust 可以确保拉取的镜像是经过签名的,避免从不可信的源拉取恶意镜像。

export DOCKER_CONTENT_TRUST=1
docker pull my-app

启用 DCT 后,Docker 会强制要求镜像签名,只有经过验证的镜像才会被拉取。

5.2.4 资源限制与审计

通过 Docker 配置资源限制(如 CPU、内存)和审计策略,可以进一步提高容器的安全性。例如,使用 --memory--cpu-shares 参数限制容器的资源使用,避免容器占用过多资源影响宿主机和其他容器。

docker run --memory="512m" --cpu-shares=512 myapp

5.3 Docker 与多云部署

随着云计算的发展,越来越多的公司采用多云架构来提高服务的可靠性、可用性和成本效益。Docker 在多云环境中的部署和管理也越来越重要。

5.3.1 Docker Swarm 与 Kubernetes 多云支持
  • Docker Swarm:Docker 原生支持的集群管理工具,能够在多个云平台上协调管理容器。Docker Swarm 可以通过 overlay 网络连接不同云平台上的容器,并支持负载均衡和服务发现。

  • Kubernetes:作为一个更加广泛使用的容器编排工具,Kubernetes 支持跨多个云平台的容器部署和管理。Kubernetes 可以自动检测节点、自动扩展服务,并支持横向扩展容器。

5.3.2 跨云部署的挑战与解决方案

跨云部署面临的主要挑战包括网络互通、存储共享、服务发现等问题。解决这些问题的方法包括:

  • 跨云网络连接:使用 VPN 或专用网络连接不同云平台上的容器网络。
  • 云原生存储:使用云提供商的持久化存储解决方案,如 AWS EBS、Azure Disk 或 Google Persistent Disks。
  • 服务发现与负载均衡:使用 Kubernetes 的服务发现和负载均衡功能,在不同云平台上的容器之间实现自动流量路由。

5.4 Kubernetes 高级操作与资源调度

Kubernetes 作为一种容器编排工具,支持强大的调度功能,能够管理大规模的容器化应用。以下是 Kubernetes 中的一些高级操作和资源调度技巧。

5.4.1 Pod 与容器的资源限制

Kubernetes 允许对每个 Pod 和容器设置资源限制,避免资源争用和 OOM(内存溢出)等问题。

apiVersion: v1
kind: Pod
metadata:name: my-app
spec:containers:- name: my-app-containerimage: my-app:latestresources:requests:memory: "512Mi"cpu: "0.5"limits:memory: "1Gi"cpu: "1"
  • requests:表示容器启动时请求的资源。
  • limits:表示容器可以使用的最大资源。
5.4.2 自动扩展:Horizontal Pod Autoscaler

Kubernetes 提供了 Horizontal Pod Autoscaler,根据 CPU 或内存使用情况自动扩展 Pod 数量。

kubectl autoscale deployment my-app --cpu-percent=50 --min=1 --max=10

此命令会根据 CPU 使用率自动扩展 my-app 部署的副本数,当 CPU 使用率超过 50% 时,Kubernetes 会

增加副本数,最多扩展到 10 个副本。

5.4.3 自定义调度策略:Affinity 和 Taints/Tolerations

Kubernetes 允许使用 AffinityTaints/Tolerations 来实现容器调度的细粒度控制。

  • Node Affinity:允许指定 Pod 调度到特定类型的节点。
  • Taints/Tolerations:允许为节点设置 污点,只有具备相应 容忍 的 Pod 才能调度到这些节点。
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3template:spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: "disktype"operator: Invalues:- ssd

以上配置确保 my-app 部署的容器只能在带有 disktype=ssd 标签的节点上运行。


相关文章:

深入讲解 Docker 及实践

Docker 是现代化应用开发、测试和生产环境部署中不可或缺的工具。它能够为开发人员提供与生产环境一致的开发环境&#xff0c;同时支持高效的容器化部署、资源隔离、容器编排等高级功能。尤其在微服务架构和云原生应用中&#xff0c;Docker 更是提供了简化的流程和高效的可扩展…...

科大讯飞前端面试题及参考答案( 上)

前端有用到哪些数据结构? 在前端开发中,会运用到多种数据结构,以下是一些常见的类型及其应用场景。 数组(Array) 数组是一种有序的元素集合,可以存放不同类型的数据(在 JavaScript 等前端常用语言中)。比如在构建一个网页的列表展示时,像新闻列表、商品列表等,我们可…...

本地导入封装的模块 在docker内报错ImportError

本地封装了一个login方法 在写testcase的时候去复用这个方法 但是进入docker运行的时候一直报上面的错误 目录 出现的原因&#xff1a; 解决方法&#xff1a; 1. 根据docker的路径写绝对路径 2. 用sys 加入path到code 作用&#xff1a; 好处&#xff1a; 出现的原因…...

Java-日志技术大全

一&#xff1a;目录 1.jul的使用 2.log4j的使用 3.logback的使用 4.log4j2的使用 二&#xff1a;jul使用 jul是JDK自带的日志技术&#xff0c;不需要导入其他依赖&#xff0c;默认的级别为info 1.关键组件&#xff1a; (1).Logger&#xff1a;记录器 (2).Handler&…...

ARP-Batch-Retargeting 部署实战

git 地址&#xff1a; https://github.com/Shimingyi/ARP-Batch-Retargeting bpy安装&#xff1a; pypi上搜索 bpy bpy 4.3.0&#xff0c;4.2.0版本报错&#xff1a; Traceback (most recent call last):File "E:\project\jijia_4d\retarget\ARP-Batch-Retargeting-…...

二分查找题目:寻找峰值 II

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法证明代码复杂度分析 题目 标题和出处 标题&#xff1a;寻找峰值 II 出处&#xff1a;1901. 寻找峰值 II 难度 7 级 题目描述 要求 一个二维网格中的峰值元素是指其值严格大于相邻值&#xff08;左、…...

调和级数不为整数的证明

文章目录 1. 问题引入2. 证明2.1 引理12.2 引理22.3 引理3&#xff1a;2.4 核心证明&#xff1a; 3. 参考 1. 问题引入 s ( n ) 1 1 2 1 3 ⋯ 1 n , n ∈ N ∗ , n ≥ 2 s(n) 1\frac{1}{2}\frac{1}{3}\cdots\frac{1}{n}, \quad \\n \in N^*, n \ge2 s(n)121​31​⋯n1​,…...

Redis 源码分析-内部数据结构 dict

Redis 源码分析-内部数据结构 dict 在上一篇 Redis 数据库源码分析 提到了 Redis 其实用了全局的 hash 表来存储所有的键值对&#xff0c;即下方图示的 dict&#xff0c;dict 中有两个数组&#xff0c;其中 ht[1] 只在 rehash 时候才真正用到&#xff0c;平时都是指向 null&am…...

git相关操作笔记

git相关操作笔记 1. git init git init 是一个 Git 命令&#xff0c;用于初始化一个新的 Git 仓库。执行该命令后&#xff0c;Git 会在当前目录创建一个 .git 子目录&#xff0c;这是 Git 用来存储所有版本控制信息的地方。 使用方法如下&#xff1a; &#xff08;1&#xff…...

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…...

Oracle Dataguard(主库为双节点集群)配置详解(2):备库安装 Oracle 软件

Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;2&#xff09;&#xff1a;备库安装 Oracle 软件 目录 Oracle Dataguard&#xff08;主库为双节点集群&#xff09;配置详解&#xff08;2&#xff09;&#xff1a;备库安装 Oracle 软件一、Orac…...

基于 Pod 和 Service 注解的服务发现

基于 Pod 和 Service 注解的服务发现 背景 很多应用会为 Pod 或 Service 打上一些注解用于 Prometheus 的服务发现&#xff0c;如 prometheus.io/scrape: "true"&#xff0c;这种注解并不是 Prometheus 官方支持的&#xff0c;而是社区的习惯性用法&#xff0c;要使…...

操作系统之文件的逻辑结构

目录 无结构文件&#xff08;流式文件&#xff09; 有结构文件&#xff08;记录式文件&#xff09; 分类&#xff1a; 顺序文件 特点&#xff1a; 存储方式&#xff1a; 逻辑结构&#xff1a; 优缺点&#xff1a; 索引文件 目的&#xff1a; 结构&#xff1a; 特点…...

网络分析与监控:阿里云拨测方案解密

作者&#xff1a;俞嵩(榆松) 随着互联网的蓬勃发展&#xff0c;网络和服务的稳定性已成为社会秩序中不可或缺的一部分。一旦网络和服务发生故障&#xff0c;其带来的后果将波及整个社会、企业和民众的生活质量&#xff0c;造成难以估量的损失。 2020 年 12 月&#xff1a; Ak…...

vue实现虚拟列表滚动

<template> <div class"cont"> //box 视图区域Y轴滚动 滚动的是box盒子 滚动条显示的也是因为box<div class"box">//itemBox。 一个空白的盒子 计算高度为所有数据的高度 固定每一条数据高度为50px<div class"itemBox" :st…...

服务器/电脑与代码仓gitlab/github免密连接

git config --global user.name "xxxx" git config --global user.email "xxxxxx163.com" #使用注册GitHub的邮箱 生成对应邮箱的密码对 ssh-keygen -t rsa -b 4096 -C "xxxxxx163.com" 把公钥id_rsa.pub拷贝到github中 Setting----->…...

用户界面软件03

一种标准的满足不同的非功能性需求的技术是对子系统进行不同的考虑……但是一个用户 界面要求有大量的域层面的信息&#xff0c;以符合比较高的人机工程标准&#xff0c;所以&#xff0c;这些分开的子系统还是 紧密地耦合在一起的。 一个软件架构师的标准反应是将不同的非功能…...

年会抽奖Html

在这里插入图片描述 <!-- <video id"backgroundMusic" src"file:///D:/background.mp3" loop autoplay></video> --> <divstyle"width: 290px; height: 580px; margin-left: 20px; margin-top: 20px; background: url(D:/nianhu…...

(一)Ubuntu20.04版本的ROS环境配置与基本概述

前言 ROS不需要在特定的环境下进行安装&#xff0c;不管你是Ubuntu的什么版本或者还是虚拟机都可以按照教程进行安装。 1.安装ROS 一键安装ros及ros2 wget http://fishros.com/install -O fishros && . fishros 按照指示安装你想要的ros。 ros和ros2是可以兼容的…...

深入分析线程安全问题的本质

深入分析线程安全问题的本质 1. 并发编程背后的性能博弈2. 什么是线程安全问题&#xff1f;3. 源头之一&#xff1a;原子性问题3.1. 原子性问题示例3.2. 原子性问题分析3.3. 如何解决原子性问题&#xff1f; 4. 源头之二&#xff1a;可见性问题4.1. 为什么会有可见性问题&#…...

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景

58. Three.js案例-创建一个带有红蓝配置的半球光源的场景 实现效果 本案例展示了如何使用Three.js创建一个带有红蓝配置的半球光源的场景&#xff0c;并在其中添加一个旋转的球体。通过设置不同的光照参数&#xff0c;可以观察到球体表面材质的变化。 知识点 WebGLRenderer …...

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…...

【利用 Unity + Mirror 网络框架、Node.js 后端和 MySQL 数据库】

要实现一个简单的1v1战斗小游戏&#xff0c;利用 Unity Mirror 网络框架、Node.js 后端和 MySQL 数据库&#xff0c;我们可以将其分为几个主要部分&#xff1a;客户端&#xff08;Unity&#xff09;、服务器&#xff08;Node.js&#xff09;和数据库&#xff08;MySQL&#xf…...

https原理

一、基本概念 1、https概念 https&#xff08;全称&#xff1a; Hypertext Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;&#xff0c;是以安全为目标的http通道&#xff0c;简单讲是http的安全版。 2、为啥说http协议不安全呢&#xff1f; 我们用h…...

如何处理京东商品详情接口返回的JSON数据中的缺失值?

1.在 Python 中处理缺失值 使用if - else语句进行检查和处理 假设通过requests库获取了接口返回的 JSON 数据&#xff0c;并使用json模块进行解析&#xff0c;存储在data变量中。 import json import requestsurl "YOUR_API_URL" response requests.get(url) dat…...

window对象

bom dom部分学完了&#xff0c;来看看bom吧~ bom是整个浏览器&#xff0c;本质上bom与dom是包含的关系&#xff0c;window是里面最大的对象 调用的方法默认对象是window&#xff0c;一般都会省略前面的window 创建的全局变量也是属于window的&#xff0c;当然window也可以省…...

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享&#xff08;P2P&#xff09;。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据&#xff0c;关…...

MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)

MySQL常用命令汇总 简介 ‌MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现属于Oracle公司。‌ MySQL支持SQL&#xff08;结构化查询语言&#xff09;&#xff0c;这是数据库操作的标准语言&#xff0c;用户可以使用SQL进…...

更新至2023年,各省数字经济变量/各省数字经济相关指标数据集(20个指标)

更新至2023年&#xff0c;各省数字经济相关指标数据集&#xff08;20个指标&#xff09; 1、时间&#xff1a;更新至2023年&#xff0c;具体时间如下 2、指标&#xff1a;互联网宽带接入端口(万个)&#xff08;2006-2023&#xff09;、互联网宽带接入用户(万户)&#xff08;2…...

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…...

【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)

本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果&#xff1a; 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址&#xff1a;https://qianfan.cloud.baidu.com/ 注册成功后&…...

一种更激进的Hook实现方案猜想

XXX原创不原创不清楚&#xff0c;暂定为原创。毕竟windows 大神很多XXX 昨天才发现不是原创&#xff0c;这种方案是VEH HOOK的一种实现方案。VEH HOOK很久很久以前都被广泛使用了。只是自己没听说过。好悲哀呀。。。。 激进的猜想&#xff1a; 如果VEH HOOK在内核态处理异常…...

HTML5实现好看的端午节网页源码

HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…...

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...

RT-DETR融合YOLOv9的下采样模块ADown

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2402.13616 代码链接&…...

【机器学习案列】学生抑郁可视化及预测分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布

当地时间1月7日&#xff0c;2025年国际消费电子展&#xff08;CES 2025&#xff09;在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓&#xff08;Ultra Magnus&#xff09;。该人形机器人内置美格智能基于高通QC…...

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…...

黑马跟学.苍穹外卖.Day04

黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...

人生第一次面试之依托答辩

今天收到人生的第一场面试&#xff0c;是东华软件集团。答的那是依托答辩&#xff0c;就面了20分钟&#xff0c;还没考算法。其实依托答辩的效果是意料之中的&#xff0c;这次面试也只是想练练手。 目录 静态变量什么时候加载的&#xff1f; 重写和重载有什么区别&#xff1…...

STM32 : PWM 基本结构

这张图展示了PWM&#xff08;脉冲宽度调制&#xff09;的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术&#xff0c;通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解&#xff1a; PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…...

【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用

系列文章目录 大模型&#xff08;LLMs&#xff09;基础面 01-大模型&#xff08;LLM&#xff09;面试全解&#xff1a;主流架构、训练目标、涌现能力全面解析 02-【大模型&#xff08;LLM&#xff09;面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…...

《浮岛风云》V1.0中文学习版

《浮岛风云》中文版https://pan.xunlei.com/s/VODadt0vSGdbrVOBEsW9Xx8iA1?pwdy7c3# 一款有着类似暗黑破坏神的战斗系统、类似最终幻想的奇幻世界和100%可破坏体素环境的动作冒险RPG。...

学习threejs,导入babylon格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.BabylonLoader babyl…...

Django 社团管理系统的设计与实现

标题:Django 社团管理系统的设计与实现 内容:1.摘要 本文介绍了 Django 社团管理系统的设计与实现。通过分析社团管理的需求&#xff0c;设计了系统的架构和功能模块&#xff0c;并使用 Django 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...

2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅

在科技的浪潮中&#xff0c;AI 技术与开源探索的火花不断碰撞&#xff0c;催生出无限可能。2025 年 1 月 4 日&#xff0c;由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动&#xff1a;冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行&#xff0…...

嵌入式系统 tensorflow

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow&#xff1a;机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…...

Web无障碍

文章目录 &#x1f7e2;Web Accessibility-Web无障碍&#x1f7e2;一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案&#xff0c;可以私信我哦✒️总结 &#x1f7e2;Web Accessibility-Web无障碍…...

Qt使用MySQL数据库(Win)----2.配置MySQL驱动

使用Everything软件&#xff0c;找到mysql.pro文件。并使用qt creator打开mysql.pro。 导入外部库 选择外部库 点击下一步&#xff0c;勾选。 为debug版本添加‘d’作为后缀取消勾选&#xff0c;然后点击下一步 添加后的Pro文件。 这样文件应该是改好了&#xff0c;选择releas…...

记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据

文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据&#xff0c;页面卡死&#xff0c;如何优化&#xff1f;&#xff1f;这里使用 分页 虚拟列表&#xff08;vue-virtual-scroll-list&#xff09;&#xff0c;去模拟一个下拉的内容…...