docker容器通俗理解

news2024/11/16 3:33:25

前言

如果大家没使用过Docker,就在电脑上下载一个VMware Workstation Pro,创建一个虚拟机安装一个windows操作一下感受一下,为什么我的电脑上还以再安装一台windows主机?其实你可以理解为Docker就是Linux系统的一个虚拟机软件。

我的Windows也可以安装Docker啊?打开Docker官网https://www.docker.com/get-started/点击"Download for Window"下载一个安装查看一下。Docker在Windows上可以运行是因为Windows统提供了一种叫做 Docker Desktop for Windows的工具,它通过在Windows上创建一个Linux虚拟机来实现。Docker Desktop for Windows使用了一种叫做Hyper-V的虚拟化技术,Windows上创建了一个轻量级的Linux虚拟机,该虚拟机运行一个精简的Linux内核称为Docker宿主机。

VMware和docker

VMware和docker同样是虚拟机,但他们却有一些不同:普通虚拟化(完全型解耦)和Docker(半解耦)

耦合:耦合指的是软件组件之间的依赖关系和关联程度。
解耦:指的是减少软件组件之间的依赖关系,降低耦合度,提高代码的灵活性、可维护性和可重用性。
简单理解,就是软件之间的依赖关系紧密不紧密。
  • 普通虚拟化(完全型解耦):每个虚拟机都拥有自己的完整操作系统和内核。这意味着虚拟机之间是完全解耦的,它们可以运行不同版本的操作系统,甚至不同类型的操作系统(例如 Linux、Windows),并且彼此之间没有任何冲突。每个虚拟机都相当于一个独立的物理服务器,可以独立地进行管理和维护。
  • 和Docker(半解耦):在Docker中使用了一种更轻量级的容器化技术所有的容器共享宿主主机的操作系统和内核,它们之间是半解耦的。尽管容器之间共享了操作系统的核心部分,但它们仍然是相互隔离的,每个容器拥有自己的文件系统、进程空间、网络空间等。因此,容器可以运行在不同的操作系统发行版中,但它们仍然受到宿主主机操作系统的限制,并且可能会受到容器之间的冲突影响。

所以你在VMware的linux虚拟机中可以升级linux的系统内核,但是不能在Docker的容器中升级容器的系统内核。如果你的软件服务对内核版本有严格要求,这个服务就不太适合用docker来实现。

还有服务不能用Docker实现?

还有服务不能用Docker实现?一个完整的服务有可能是由多个服务在一起运行实现。开发人员开发了服务A对内核有要求需要服务器内核版本A,而开发的另一个服务B对内核也有要求需要服务器内核版本B,那么Docker就不能再同一台服务来运行A和B两个服务。这就和Docker的这种半解耦的状态有关系了。

Docker的虚拟化

Docker有个核心的组件是Containerd。在讲容器的时候大部分人会认为是容器就是Docker,我更愿意把Docker和容器分开理解,我感觉Docker和Kubernetes只是容器的管理工具而真正的容器是底层的Containerd。Docker没有Containerd组件就创建不了容器,Containerd没了Docker依然可以独立的创建容器提供服务。

docker要管理容器的生命周期

找台docker主机执行命令:docker version

[root@localhost ~]# docker version 
Client: Docker Engine - Community
 Version:           26.0.0
 API version:       1.45
 Go version:        go1.21.8
 Git commit:        2ae903e
 Built:             Wed Mar 20 15:21:09 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.0.0
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.8
  Git commit:       8b79278
  Built:            Wed Mar 20 15:20:06 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

我们看到docker有两个重要的组件docker引擎Client、Server:

  • Client:是与用户交互的主要方式,它提供了一个命令行界面(CLI)和API,使得用户可以使用Docker来构建、运行和管理容器化的应用程序。用户可以通过Docker CLI命令(例如 docker run、docker build)通过 Docker API来向Server发送请求。
  • Server:是一个后台运行的进程,负责管理Docker上的容器、镜像、网络和存储等资源。它是Docker引擎的核心组件之一,负责接收来自 Docker客户端的请求,并根据这些请求来创建、启动、停止、删除容器,以及构建、拉取、推送镜像等操作。它还通过与containerd进行通信来管理容器的生命周期。
    在这里插入图片描述

docker:的基本架构

  1、 doker分为用户端和服务器端:我们刚刚已经查看过了。 Server为客户端提供UESTfulAPI,响应来自客户端的请求采用模块化的架构,通过专门的Engine模块来分发管理各个来自客户端的任务。
  2、docker-proxy:是dockerd的子进程,当需要进行容器映射的时候docker-proxy完成网络映射配置。
  3、containerd:是dockerd的子进程提供GRPC接口来响应来自dockerd的请求,对下管理runC镜像和容器环境。
  4、containerd-shim:是dockerd的子进进程为Runc容器提供支持同事作为容器的根进程。

docker的隔离策略

docker是半耦合的虚拟化,那么它是如何实现隔离的呢?Docker的隔离主要是通过Linux内核提供的一系列的特性来实现的.
进入linux系统在进入任意进程查看一下:cd /proc/2538/ns | ll

[root@localhost ns]# pwd 
/proc/2538/ns
[root@localhost ns]# ll
总用量 0
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 ipc -> ipc:[4026532679]
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 mnt -> mnt:[4026532677]
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 net -> net:[4026532682]
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 pid -> pid:[4026532680]
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 user -> user:[4026531837]
lrwxrwxrwx. 1 bwk root 0 4月  27 15:26 uts -> uts:[4026532678]

基于此Docker有六项隔离实现了容器与宿主机、容器与容器之间的隔离:

IPC: 信号量、消息队列和共享内存
MNT: 挂载点、文件系统
NET: 网络设备、网络栈、端口等等
PID: 进程编号
USER: 用户、组
UTS: 主机名、域名

主要包括以下几个方面:

  • 命名空间(Namespace): Docker使用Linux内核的命名空间机制来隔离容器的进程视图、网络、文件系统、用户、主机名等资源。每个容器都有自己独立的命名空间,使得容器内的进程无法感知到其他容器或宿主机上的进程,从而实现了进程级别的隔离。
  • 控制组(Cgroup): Docker使用Linux内核的控制组机制来限制容器对 CPU、内存、磁盘、网络等资源的使用。通过将容器的资源限制和监控与控制组关联起来,Docker 可以有效地管理和调度容器的资源使用,防止容器占用过多的系统资源,从而确保系统的稳定性和可靠性。
  • 容器文件系统(Union File System): Docker使用联合文件系统(Union File System)来实现容器的文件系统隔离。联合文件系统允许容器在一个只读的基础文件系统上叠加多个可写的文件系统层,使得容器内的文件系统与宿主机和其他容器的文件系统相互隔离,同时可以实现文件系统的共享和复用。
  • 网络隔离: Docker使用Linux内核的网络命名空间来实现容器之间的网络隔离。每个容器都有自己独立的网络命名空间,使得容器可以拥有自己独立的网络接口、IP 地址和路由表,从而实现了网络层面的隔离。

1、命名空间(Namespace)
我的docker运行了一个Elasticsearch集群:
命名空间有六项隔离,我们查看一下:es01有映射端口是9200

[root@localhost docker]# ps -ef | grep 9200
root       3744   1501  0 16:32 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9200 -container-ip 172.18.0.4 -container-port 9200
root       3750   1501  0 16:32 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9200 -container-ip 172.18.0.4 -container-port 9200
root       4098   1418  0 16:43 pts/0    00:00:00 grep --color=auto 9200
[root@localhost docker]# ps -ef | grep 1501
root       1501      1  0 11:36 ?        00:00:29 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       3744   1501  0 16:32 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 9200 -container-ip 172.18.0.4 -container-port 9200
root       3750   1501  0 16:32 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 9200 -container-ip 172.18.0.4 -container-port 9200
root       4100   1418  0 16:44 pts/0    00:00:00 grep --color=auto 1501

一个映射ipv4一个映射ipv6进程是3744和3750,我们看到两个9200的进程有同一个父进程1501并且这个正是docker的主进程。
那么在容器内部是怎么样的呢?

[root@localhost ns]# docker exec -it es01 /bin/bash
root@e67d6d5de8b2:/usr/share/elasticsearch# ps aux 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.0   2484   312 ?        Ss   16:32   0:00 /bin/tini -- /usr/local/bin/docker-entrypoint.sh eswrapper
elastic+      7  4.8 26.9 4272660 1040204 ?     SLl  16:32   1:23 /usr/share/elasticsearch/jdk/bin/java -Xshare:auto -Des.networkaddress.cache.ttl=60 -Des.networkaddres
elastic+    209  0.0  0.1 108392  4600 ?        Sl   16:32   0:00 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller
root        253  3.7  0.0   4100  2164 pts/0    Ss   17:01   0:00 /bin/bash
root        263  0.0  0.0   5884  1476 pts/0    R+   17:01   0:00 ps aux

在容器内部完全是独立的系统进程,宿主机看到的是3744和3750,3744和3750在/proc/3744/ns中六项均都指向的是同一样的命名空间标识符其实是一个服务。

2、控制组(Cgroup)
Cgroup(Control Group)是属于linux的内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用。

它的作用:

1)资源限制,可以将组设置一定的内存限制。
2)优先级,通过优先级让一些组优先获得更多资源。
3)资源审计,用来统计系统实际上把多少资源用到适合的目的上。
4)隔离,为组隔离命名空间,这样使得一个组不会看到另一个组的进程、网络链接和文件系统。
4)控制,执行挂起、恢复、和重启等操作。
devices:设备权限控制。
cpuset:分配指定的cpu和内存
cpu:控制cpu占用率。
cpuacct:统计cpu使用情况 
memory:限制内存使用情况。
freezer:冻结(暂停)Cgroup中的进程  
net_prio: 设置进程的网络流量优先级。
huge_tlb:限制HugeTLB的使用。
perf_event:允许perfect工具基于Cgroup分组做性能监测。

Cgroup是一个虚拟的文件系统,在Linux发行版中系统启动时已经完成挂载。

[root@python ~]# mount | grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

在/sys/fs/cgroup/下相应的属性文件下都有一个docker的目录里面存放生成的容器隔离文件。太多自己可以查看一下。

[root@localhost cgroup]# pwd
/sys/fs/cgroup
[root@localhost cgroup]# ls
blkio  cpu  cpuacct  cpu,cpuacct  cpuset  devices  freezer  hugetlb  memory  net_cls  net_cls,net_prio  net_prio  perf_event  pids  systemd

Cgroup子系统介绍简单理解:

 1、cpuset子系统
      cpuset.cpus 允许进程使用的CPU列表(例如0~4,9)
      cpuset.mems 允许进程使用的内存列表 (例如:0~1)
 2、cpu子系统
      用于限制进程cpu占用率,有三个功能分别通过不同的接口来实现。
       1)cpu比重分配:接口cpu.shares。假设在cgroupfs的根目录下创建(C1、C2)并且cpu.shares分别配置512和1024.那么在C1和C2使用cpu时候c2将比c1使用多一倍的cpu使用率,只有当他们争用cpu的时候才起效。
       2)cpu带宽限制:接口cpu.cfs_quota_us。接口单位是微秒。可以将period设置为1秒将quota设置为0.5秒。那么Cgroup中的进程在1秒内最多只能运行0.5秒然后被强制睡眠直到进入到下一个1秒。实时进程的带宽限制:接口cpu.rt_peri-od_us和cpu.rt_runtime_us。
  3、cpuacct子系统
       用来统计cpu的使用情况。
  4、memory子系统
       memory子系统用来限制Cgroup所能使用的内存上限 接口memory.limit_in_bytes。单位k/K、m/M或者g/G表示
         echo 1G > memory.limit_in_bytes
       memory.memsw.lim-it_in_bytes 设定内存加交换分区的使用总量。防止进程用尽交换分区。
       memory.oom_control: 如果设置为0,那么在内存使用量超过上限时不会杀死进程,而是阻塞进程直到内存释放可供使用。另一方面系统会向用户发送通知用户的监控程序可以根据该事件来做相应处理。
       memory.stat: 汇报内存使用信息。
  5、blkio 子系统
       用来限制Cgroup的block I/O带宽。(就是磁盘IO)
       .blkio.weight: 设置权重值,范围100~1000。和cpu.shares类似,是比重分配,不是绝对资源限制,只有在Cgroup在争用同一块设备时候才起作用。
       .blkio.weight_device对具体的设备设置权重值,这个值会覆盖blkio.weight。
   6、devices子系统
       用来控制Cgroup的进程对那些设备具有访问权限。
       .devices.list 只读文件显示目前允许访问的设备列表。每个条目分3个域。 
          1)类型:可以是a、c或b,分别表示所有设备、字符设备、块设备。
          2)设备号 
          3)权限r、w或m的组合分别表示可读、可写、可创建设备节点。
       .devices.allow 只写文件,以上描述的格式写入文件,就可以允许相应的设备访问权限。
       .devices.deny 只写文件,以上描述的格式写入该文件,就可以禁止相应的设备访问权限。

我们用memroy看一下:

[root@localhost /]# docker ps -a 
CONTAINER ID   IMAGE                                                   COMMAND                   CREATED       STATUS       PORTS                                                 NAMES
e67d6d5de8b2   docker.elastic.co/elasticsearch/elasticsearch:7.17.14   "/bin/tini -- /usr/l…"   3 weeks ago   Up 5 hours   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp   es01
55d5e73f9a94   docker.elastic.co/elasticsearch/elasticsearch:7.17.14   "/bin/tini -- /usr/l…"   3 weeks ago   Up 5 hours   9200/tcp, 9300/tcp                                    es02
53f7c8128cc1   docker.elastic.co/elasticsearch/elasticsearch:7.17.14   "/bin/tini -- /usr/l…"   3 weeks ago   Up 5 hours   9200/tcp, 9300/tcp                                    es03

看一下es01的内存配置这个内存我是没做任何限制,表示容器可以使用宿主机上的全部可用内存:

[root@localhost /]# docker inspect es01 --format='{{.HostConfig.Memory}}'
0

查看一下容器ID:

[root@localhost ~]# docker inspect es01
[
    {
        "Id": "e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba",
        "Created": "2024-04-04T13:56:18.043205656Z",

在/sys/fs/cgroup/memory/docker目录下:

[root@localhost docker]# ll
总用量 0
drwxr-xr-x. 2 root root 0 4月  27 11:36 53f7c8128cc1a1117e4ec0b521d8fcc4c6ca4df490f5ac44c8463b5cf19920ac
drwxr-xr-x. 2 root root 0 4月  27 11:36 55d5e73f9a94677e00fa5a4a77e492a312fe1ab7101f27000b7c2b6f59c2956c
-rw-r--r--. 1 root root 0 4月  27 11:36 cgroup.clone_children
--w--w--w-. 1 root root 0 4月  27 11:36 cgroup.event_control
-rw-r--r--. 1 root root 0 4月  27 11:36 cgroup.procs
drwxr-xr-x. 2 root root 0 4月  27 11:36 e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba

进入到虚拟目录:

[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# cat memory.limit_in_bytes 
9223372036854771712
[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# echo 1G > memory.limit_in_bytes
[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# cat memory.limit_in_bytes 
1073741824

实际上我们对内存做了1G的限制。重启容器:

[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# docker restart es01
es01
[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# ls
[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# cd ..
[root@localhost docker]# cd e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba/
[root@localhost e67d6d5de8b273e69fbc806d303f1bea169941779ade044be2081f488f5db5ba]# cat memory.limit_in_bytes 
9223372036854771712

因为他是虚拟文件,重启后目录下文件消失,恢复docker默认设置。

哪些是耦合的

  • 共享内核:Docker 容器与宿主机共享同一个内核,因此容器内部的进程直接运行在宿主机的内核之上。这种共享内核的特性导致容器与宿主机之间有一定的耦合性,容器的行为受限于宿主机的内核版本和配置。
  • 资源:虽然 Docker 容器提供了一定程度的资源隔离,如 CPU、内存和网络等,但是由于容器与宿主机共享同一个内核,因此容器之间的资源隔离并不是完全隔离的。例如,在容器内部可以通过一些技巧访问到宿主机的资源,将宿主机上的某些目录挂载到容器内部,以便与宿主机共享文件或配置。
  • 网络:Docker 容器提供了一定程度的网络隔离,每个容器都有自己独立的网络栈和网络命名空间。但是由于容器共享宿主机的网络设备,因此容器之间仍然可以相互通信,容器的网络行为也受限于宿主机的网络配置。

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

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

相关文章

(学习日记)2024.05.08:UCOSIII第六十二节:常用的结构体(os.h文件)第一部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。 回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后&a…

Java基础教程- 1 Java 简介

更好的阅读体验:点这里 ( www.doubibiji.com ) 1 Java 简介 1.1 Java语言概述 1.1.1 Java是什么 (了解一下即可,对学习没影响,总得了解一下它是怎么来滴~) Java是由Sun公司(已…

五一景点预约怎么预约 预约时间用备忘录设置提醒不怕错过

五一小长假即将来临,相信很多人和我一样,已经跃跃欲试,准备踏上旅途,去探索那些心仪已久的风景名胜。但在这个旅游高峰期,不少热门景点都需要提前预约购票。那么,怎么预约才能确保顺利游览呢? …

在智慧城市的建设中智能电表发挥什么作用

在智慧城市的建设中,智能电表扮演着至关重要的角色。智慧城市是一个利用信息技术手段提升城市运行效率和质量的新型城市模式,旨在通过信息和通信技术的应用,提高城市管理、公共服务、环境保护等方面的质量和效率,促进城市的可持续…

金价大跳水,美梦变噩梦!2024真正适合普通人的靠谱创业项目!2024适合30-40岁轻资产小生意

4月22日晚间,向上“狂飙”了一个多月的金价突然就“大跳水”。当日,每克金价均下调14块。在这次跳水中,有人欢喜有人愁:有投资者自报做空金价一夜狂赚14万,也有投资者哭诉,头晚进货到早上就净亏损2万&#…

中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…

—— —— GienTech动态 —— —— 中电金信携“源启”亮相第十二届中国电子信息博览会 4月11日,为期三天的“第十二届中国电子信息博览会”在深圳顺利闭幕。中国电子信息博览会是中国规模最大、最具国际影响力的电子信息产业盛会之一。本届大会以“全球视野&#x…

AI预测福彩3D第9套算法实战化测试第6弹2024年4月28日第6次测试

今天继续进行新算法的测试,今天是第6次测试。好了,废话不多说了,直接上图上结果。 2024年4月28日福彩3D预测结果 6码定位方案如下: 百位:5、4、9、3、1、0 十位:2、3、5、6、1、7 个位:4、5、0、…

Goby 漏洞发布|禅道 /api.php/v1/users 未授权访问漏洞

漏洞名称:禅道 /api.php/v1/users 未授权访问漏洞 English Name:Zen Road /api.php/v1/users Unauthorized Access Vulnerability CVSS core: 9.8 影响资产数:69265 漏洞描述: 禅道是一款开源的项目管理软件,旨在…

Leetcode—1017. 负二进制转换【中等】(string列表初始化、反向迭代器)

2024每日刷题(120) Leetcode—1017. 负二进制转换 实现代码 class Solution { public:string baseNeg2(int n) {string ans;while(n ! 0) {ans to_string(n & 1);n -(n >> 1);}return ans.empty() ? "0": string{ans.rbegin(),…

Linux安装Matlab运行时

一般而言,安装Matlab的linux系统是带桌面版的,如果没带,不在本教程范围内。 一、下载Matlab 下载地址:MATLAB Runtime - MATLAB Compiler - MATLAB 本教程使用R2020b(9.9) 二、linux系统中进行解压 将zip传入linux系统&#xf…

vue2主体页面进行拆分

目录 一.组件化 二.新建Header.vue页面 三.Aside.vue代码 四.Main.vue代码如下 五.Home.vue代码如下 六.index.js代码如下: 七.项目效果图 在Vue.js 2中,将主体页面进行拆分是一种常见的做法,它有助于提高代码的可维护性和可读性。页面…

Halcon 3D 使用3D ROI截取模型

Halcon 3D 使用3D ROI截取模型 链接:https://pan.baidu.com/s/1UfFyZ6y-EFq9jy0T_DTJGA 提取码:ewdi * 1.读取图片 ****************

新装电脑Flutter环境部署坑汇总(持续更新)

1.本地安装,安装fvm的坑 本人电脑使用windows ,安装fvm则一般使用choco安装,那么首先需要安装choco,打开powershell/或者cmd运行以下命令: Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager…

word启动缓慢之Baidu Netdisk Word Addin

word启动足足花了7秒钟,你知道我这7秒是怎么过来的吗? 原因就是我们可爱的百度网盘等APP,在我们安装客户端时,默认安装了Office加载项,不仅在菜单栏上加上了一个丑陋的字眼,也拖慢了word启动速度........ 解…

STM32H750片外QSPI下载算法文件(stldr)生成

STM32H750片外QSPI下载算法文件(stldr)生成 🌿相关篇《STM32H750片外QSPI启动配置简要》📌参考实现资料: https://github.com/lchnu/STM32H750XBH_ARTPIQSPI_W25Q64JV https://gitee.com/wangchief/H750_W25QXX ✨利…

链路层安全扩展——L2TP协议

链路层安全扩展——L2TP协议 PPP协议 协议概念 说到数据链路层的安全协议,我们不得不先提一下PPP协议,后面的PAP、CHAP与L2TP协议都是围绕它展开的。(PPP不是本文重点,很多细节没有提到,到时候会专开一篇文章讲PPP&…

Java 8 Stream API的使用

一、什么是Stream? Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。 数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数…

ardupilot开发 --- RealSense-D400 篇

目录 0. 一些概念1. 用windows检查设备是否正常1. 使用 Intel RealSense SDK 2.0 查看相机图像数据 0. 一些概念 官网:添加链接描述选型:D455 1. 用windows检查设备是否正常 用USB连接D455与PC 下载 Intel.RealSense.Viewer.exe 并打开,设…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式,该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…

正版软件 | Reg Organizer - 适用于 Windows 的注册表清理工具软件 教程分享

什么是 Reg Organizer ? Reg Organizer 是一套用于维护和优化 Windows 操作系统的工具。 通过使用 Reg Organizer,您可以清理系统中无用的文件,优化启动应用程序,编辑 Windows 注册表,搜索和替换注册表项和值&#…