【docker】—— Docker 简介

目录

(一)容器技术发展史

1、Jail 时代

2、云时代

3、云原生时代

(二)编排与容器的技术演进之路

1、DockerClient

2、RUNC&Shim

3、CRI-Containerd

4、CRI-O

5、Containerd

(三)Docker 简介

1、什么是虚拟化、容器化

2、为什么要虚拟化、容器化?

3、虚拟化实现方式

4、虚拟化常见类别

5、常见虚拟化实现

5.1主机虚拟化(虚拟机)实现

5.2容器虚拟化实现

5.2.1容器虚拟化基础之 NameSpace

5.2.2容器虚拟化基础之 cgroups

5.2.3容器虚拟化基础之 LXC

(四)Docker 是什么

1、Docker 本质

2、Docker 的引擎迭代

3、Docker 和虚拟机的区别

4、Docker 优势

5、Docker 和 JVM 虚拟化的区别

(五)Docker 版本

(六)总结 


(一)容器技术发展史

接下来,我简要的叙述一下关于容器技术的发展史,具体大家有兴趣的可以再去深入了解!!

1、Jail 时代

容器不是一个新概念或者新技术,很早就有了,只是近几年遇到了云计算,整个技术
被彻底引爆了。
1️⃣ 1979 年 贝尔实验室发明 chroot
2️⃣ 2000 FreeBSD 4.0 发行 FreeBSD Jail
3️⃣ 2001 Linux VServer 发行
4️⃣ 2004 年 Solaris Containers 发行

2、云时代

2006 年,Google 101 计划提出云的概念,对当前的主流开发模式产生深远的影响。也许以后我们会更多考虑如果出现比现在多 1000 , 10000 倍的数据量的时候,我们该如何处理?要想让发挥潜能,与此相关的编程和操作就应该与使用互联网一样简单。随后,亚马逊、IBM 等行业巨头也陆续宣布各自的计划,宣告技术时代的来临。

云计算需要处理海量数据、超高并发、快速扩展等问题,此时不仅仅需要隔离还需要能够对资源进行控制和调配。

1️⃣2008 年 LXC 推出

2️⃣ 2011 年 CloudFoundry 推出 Warden
3️⃣ 2013 年 LMCTFY 启动
4️⃣ 2013 年 Docker 推出到风靡全球

3、云原生时代

Google &Docker 竞争
1️⃣ 2013 年 CoreOS 发布和 Docker 由合作终止
2️⃣ 2014 年 6 Google 发布开源的容器编排引擎 Kubernetes K8S
3️⃣ 2014 年 12 CoreOS 发布开源容器引擎 Rocket(rkt)
4️⃣ 2015 年 Docker 推出容器集群编排组件 Swarm
5️⃣ 2015 年 6 Docker 成立 OCI
6️⃣ 2015 年 7 Google 带头成立 CNCF
k8s 成为云原生事实标准
1️⃣ 2016 年 发布 CRI 标准
2️⃣ 2016 年 Docker 捐献 containerd
3️⃣ 2016 年 CRI-O 发布
4️⃣ 2017 年 containerd 确定作为标准 CRI

(二)编排与容器的技术演进之路

💨  核心问题:容器哪些技术过时了

1、DockerClient

此时 K8s 只是编排领域的一个选择,而 Docker 此时一家独大,所以 K8s 的客户端只
是作为 Docker 的客户端来调用 Docker 引擎来完成服务。

2、RUNC&Shim

OCI 催生 runc ,剥离 Docker Engine 的一家独大的情况,确保各个厂商都可以搭建自己的容器平台。CRI 标准确立了但是 Docker 并没有接入该标准。此时催生了临时技术shim。

3、CRI-Containerd

containerd 被捐献出来,谷歌开发 cri-containerd 接入 CRI 标准。

4、CRI-O

k8s 已经成为事实的编排标准,促使容器回归云原生本质。

5、Containerd

containerd 实现 CRI,成为 CRI 的事实标准。

那么实际生产的集群采用的什么运行时组件?
以腾讯的 TKE (腾讯商用 K8S 产品 ) 为例,支持选择 containerd docker 两种模式的选择。如何选择呢?
1 Containerd 调用链更短,组件更少,更稳定,占用节点资源更少。建议选择Containerd。
2 )以下情况还是要用 docker:
  • 使用 docker build/push/save/load 等命令。
  • 调用 docker API
  • 需要 docker compose docker swarm

(三)Docker 简介

1、什么是虚拟化、容器化

物理机 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境,有时也称为“ 寄主 宿主
虚拟化 :是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
容器化 :容器化是一种虚拟化技术,又称操作系统层虚拟化( Operating system level
virtualization ),这种技术将操作系统内核虚拟化,可以允许用户空间软件实例(instances )被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例,也被称为是一个容器(containers )。对每个实例的拥有者与用户来说,他们使用的服务器程序,看起来就像是自己专用的。容器技术是虚拟化的一种。docker 是现今容器技术的事实标准。
💨 上面这样文字性的叙述或许太过抽象,接下来 举个生活中的例子:
  • 物理机如下,就像一个庄园,独立占用了一块土地,花园都是自己的,其他人无法共享使用:

  • 虚拟机相当于开发商的一个楼盘,一栋楼一套房子一户人家,共享一块宅基地,共享小区的花园,共享小区的游乐设施。

  • 容器相当于在 1 个房子里面,开辟出来一个又一个的胶囊公寓,共享这套房子的卫生间、共享厨房、共享 WiFi,只有衣服、电脑等私人物品是你自己的。


2、为什么要虚拟化、容器化?

我们从上面的历史发展来看,虚拟化和容器化的最主要目的就是资源隔离,随着资源隔离的实现逐渐也带来了更大的收益。
  • 资源利用率高
将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务,降低 IT 支出和运维管理成本。
比如上图中我们的土地直接复用, 使用这块土地的人多了,但是成本还是庄园那块地
  • 环境标准化
一次构建,随处执行。实现执行环境的标准化发布,部署和运维。开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 这段代码在我机器上没问题啊 这类问题。

  • 资源弹性伸缩
根据业务情况,动态调整计算、存储、网络等硬件及软件资源。比如 遇到双 11 了,把服务扩容 100 个,双 11 过去了, 把扩容的 100 个收回去

  • 差异化环境提供
同时提供多套差异化的执行环境,限制环境使用资源。
比如我的服务一个以来 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。

  • 沙箱安全
比如我在容器里面执行 rm -rf /* 不会把整个服务器搞死,也不影响其他人部署的程序使用。

  • 容器对比虚拟机更轻量,启动更快
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
docker 不需要虚拟内核,所以启动可以更快,相当 windows 的开机时间省去 了。

  • 维护和扩展容易
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得
应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。比如 docker hub 提供了很多镜像,各个系统的一个命令就可以拿到了,研发也可以自己定制镜像分享给各个产品。


3、虚拟化实现方式

很简单的实现,其实就是应用程序执行环境分层:

硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
操作系统层 :提供系统调用接口,管理硬件资源
程序库层:提供数据结构定义及函数调用接口


4、虚拟化常见类别

虚拟机

  • 存在于硬件层和操作系统层间的虚拟化技术。虚拟机通过伪造一个硬件抽象接口,将一个操作系统以及操作系统层以上的层嫁接到硬件上,实现和真实物理机几乎一样的功能。比如我们在一台 Windows 系统的电脑上使用 Android 虚拟机,就能够用这台电脑打开 Android 系统上的应用。

容器

  • 存在于操作系统层和函数库层之间的虚拟化技术。容器通过伪造操作系统的接口,将函数库层以上的功能置于操作系统上。以 Docker 为例,其就是一个基于 Linux 操作系统的Namespace Cgroup 功能实现的隔离容器,可以模拟操作系统的功能。简单来说,如果虚拟机是把整个操作系统封装隔离,从而实现跨平台应用的话,那么容器则是把一个个应用单独封装隔离,从而实现跨平台应用;
  • 所以容器体积比虚拟机小很 多,理论上占用资源更少。容器化就是应用程序级别的虚拟化技术。容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。容器共享一个内核(操作系统),它安装在硬件上。
JVM 之类的虚拟机
  • 存在于函数库层和应用程序之间的虚拟化技术。Java 虚拟机同样具有跨平台特性,所谓跨平台特性实际上也就是虚拟化的功劳。我们知道 Java 语言是调用操作系统函数库的,JVM 就是在应用层与函数库层之间建立一个抽象层,对下通过不同的版本适应不同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调用不同操作系统的函数库。

5、常见虚拟化实现

5.1主机虚拟化(虚拟机)实现

主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。
从软件框架的角度上,根据虚拟化层是直接位于硬件之上还是在一个宿主操作系统之上,将虚拟化划分为 Type1 Type2.
Type1 类的 Hypervisor(Hypervisor 是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主机上单独工作,因此,Hypervisor 也称为虚拟机管理器。 ) 直接运行在硬件之上,没有宿主机操作系统,Hypervisor 直接控制硬件资源和客户机。典型框架为 Xen VmwareESX。

Type2 类的 Hypervisor 运行在一个宿主机操作系统之上( Vmware Workstation )或者系统里面,Hypervisor 作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操作系统上的一个进程。

5.2容器虚拟化实现

容器虚拟化实现原理:

  •  容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。
5.2.1容器虚拟化基础之 NameSpace
  • 什么是 Namespace(命名空间)
namespace Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进的相关资源指定在同一个 namespace 中。
Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前namespace 里的进程,对其他 namespace 中的进程没有影响。
Linux 提供了多个 API 用来操作 namespace ,它们是 clone() setns() unshare() 函数,为了确定隔离的到底是哪项 namespace ,在使用这些 API 时,通常需要指定一些调用参数:CLONE_NEWIPC CLONE_NEWNET CLONE_NEWNS 、CLONE_NEWPID、 CLONE_NEWUSER CLONE_NEWUTS 和CLONE_NEWCGROUP。如果要同时隔离多个 namespace ,可以使用 | ( 按位或 ) 组合这些参数。
5.2.2容器虚拟化基础之 cgroups
1. 什么是 cgroups
  • cgroups(Control Groups) linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。
2. 为什么使用 cgroups
  • 其可以做到对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器Docker 及 k8s 中的 pod 就使用了 cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。
3. cgroups 的用途
  • Resource limitation: 限制资源使用,例:内存使用上限/cpu 的使用限制
  • Prioritization: 优先级控制,例:CPU 利用/磁盘 IO 吞吐
  • Accounting: 一些审计或一些统计
  • Control: 挂起进程/恢复执行进程
5.2.3容器虚拟化基础之 LXC
LXC LinuX Containers Linux 容器,一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container ),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案
LXC 虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。
后来就出现了 docker ,所以从一定程度上来说, docker 就是 LXC 的增强版。


(四)Docker 是什么

1、Docker 本质

Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术, Docker 只是把这种技术在使用上简易普及了。 Docker 在早期的版本其核心就是 LXC 的二次封装发行版。
Docker 作为容器技术的一个实现,或者说让容器技术普及开来的 最成功 的实现。Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是 “Build Ship andRun Any APP, Anywhere” ,即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到 一次封装,到处运行

2、Docker 的引擎迭代

Docker 早期是基于 LXC 容器管理引擎实现,当后来成熟之后, Docker 自建了一个容器引擎叫 libcontainer ,后来 CNCF 的介入, Docker 又研发了一个工业化标准的容器引擎 runC ,目前所使用的新版 Docker ,所使用的容器引擎就是 RunC

3、Docker 和虚拟机的区别

4、Docker 优势

docker 有比虚拟机更少的抽象层。 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu 、内存利用率上 docker 将会在效率上有明显的优势。 docker 利用的是宿主机的内核,而不需要Guest OS,节省了 Guest OS 占用的资源。
docker 不需要 Guest OS ,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS, 返回新建过程是分钟级别的。而新建一个docker 容器只需要几秒钟。

5、Docker JVM 虚拟化的区别


(五)Docker 版本

Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是 docker-ce
lxc :上文中提到, lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。
libcontainer docker 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc 。在 1.11 版本拆分出 runc 后,libcontainer 也随之成为了 runc 的核心功能模块, runc 后续变成了容器标准。
moby moby docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby ,事实上这个 moby 就是 dockerd 目前使用的开源项目名称, docker 项目中的 engine(dockerd )仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。https://mobyproject.org/
docker-ce docker 的开源版本, CE Community Edition docker-ce 中的组件来自于 moby containerd 等其他项目。 https://www.docker.com/pricing/
docker-ee docker 的收费版本, EE Enterprise Edition 。其基础组件来源和docker-ce 是一样的,但附加了一些其他的组件和功能。

最后,附上docker官网链接:https://www.docker.com/


(六)总结 

以上便是本期关于docker的基本介绍了,更多知识后续我会为大家持续更新的!!

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

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

相关文章

【已解决】 ubuntu apt-get update连不上dl.google.com

在终端使用apt-get update时,连接dl.google.com超时,一直卡在0%,原因是当前ip无法ping到google(墙)。 解决方法: dl.google.com国内可用IP 选一个,然后按以下命令操作: cd ~ vim …

AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲

【课程简介】 本课程介绍了chatGPT相关模型的具体案例实践,通过实操更好的掌握chatGPT的概念与应用场景,可以作为chatGPT领域学习者的入门到进阶级课程。 【课程时长】 1天(6小时/天) 【课程对象】 理工科本科及以上&#xff0…

图像分割实战-系列教程2:Unet系列算法(Unet、Unet++、Unet+++、网络架构、损失计算方法)

图像分割实战-系列教程 总目录 语义分割与实例分割概述 Unet系列算法 1、Unet网络 1.1 概述 整体结构:概述就是编码解码过程简单但是很实用,应用广起初是做医学方向,现在也是 虽然用的不是很多,在16年特别火,在医学…

迅软科技助力高科技防泄密:从华为事件中汲取经验教训

近期,涉及华为芯片技术被窃一事引起广泛关注。据报道,华为海思的两个高管张某、刘某离职后成立尊湃通讯,然后以支付高薪、股权支付等方式,诱导多名海思研发人员跳槽其公司,并指使这些人员在离职前通过摘抄、截屏等方式…

自动化测试系列 之 Python单元测试框架unittest

一、概述 什么是单元测试 单元测试是一种软件测试方法,是测试最小的可测试单元,通常是一个函数或一个方法。 在软件开发过程中,单元测试作为一项重要的测试方法被广泛应用。 为什么需要单元测试 单元测试是软件开发中重要的一环&#xf…

c++哈希表——超实用的数据结构

文章目录 1. 概念引入1.1 整数哈希1.1.1 直接取余法。1.1.2 哈希冲突1.1.2.1 开放寻址法1.1.2.2 拉链法 1.2 字符串哈希 3.结语 1. 概念引入 哈希表是一种高效的数据结构 。 H a s h Hash Hash表又称为散列表,一般由 H a s h Hash Hash函数(散列函数)与链表结构共同…

用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还…

机器学习(二) -- 数据预处理(3)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 未完待续…… 目录 前言 tips:这里只是总结,不是教程哈。本章开始会用到numpy,pandas以及matpl…

亚信安慧AntDB数据库引领数字时代通信创新

在数字经济与实体经济深度融合的时代,通信行业正迎来前所未有的新机遇。特别是在中国信通院的预测中,2027年5G专网市场规模预计将达到802亿元,呈现出显著的增长态势,年复合增长率高达42%。 亚信安慧AntDB数据库一直致力于紧跟科技…

不同角度深入探讨Maya和Blender这两款软件的差异

当我们面对三维建模软件的选择时,许多初学者可能会感到迷茫。今天,我们将从不同角度深入探讨Maya和Blender这两款软件的差异,特别是对于游戏建模领域的用户来说,这将有助于您更好地理解两者之间的区别。 软件授权与开发背景&#…

QT上位机开发(倒计时软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 倒计时软件是生活中经常遇到的一种场景。比如运动跑步,比如学校考试,比如论文答辩等等,只要有时间限制规定的地…

C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

如果这是您阅读的本专栏的第一篇博文,建议先阅读如何安装Visual Studio 2022。 C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 一、简单准备 开始学习、编写程序…

日志高亮 | notepad

高亮显示日志 日志文件无法清晰看到关键问题所在? 看到一堆日志头疼?高亮日志可以清晰展示出日志的 ERROR级等各种等级的问题, 一下浏览出日志关键所在 tailspin 项目地址: https://githubfast.com/bensadeh/tailspin 使用Rust包管理器cargo安装 安装 - Cargo 手…

3D视觉-ToF测量法(Time of Flight)

概念 ToF 是 Time of Flight 的缩写, ToF 测量法又被称作飞光时间测量法,是通过给目标连续发射激光脉冲,然后用传感器接收在被测平面上反射回来的光脉冲,通过计算光脉冲的飞行往返时间来计算得到确切的目标物距离。因为返回时间很…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#) Baumer工业相机Baumer工业相机的数据保存(CustomData)功能的技术背景CameraExplorer如何使用图像剪切&#xff…

优化算法3D可视化

编程实现优化算法,并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 import numpy as np from matplotlib import pyplot as plt import torch# 画出x**2 class Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)def for…

Python 下载与安装

1、下载 打开Python官网:Welcome to Python.org 点击下图所示的【Downloads】按钮进入下载页面。 ​ 进入下载页面后下拉至下图位置,选择版本,点击下载按钮下载。 页面会跳转至下一页下载页面,下拉到下图位置,选择…

荣耀之城(富饶之地)

规则简介 这是一个回合制的游戏,每个回合都是先选角色然后按照角色编号依次执行回合。 8个角色:刺客、小偷、魔术师、国王、住持、商人、建筑师、领主 根据人数的不同,按照不同的规则依次选取一个角色,国王第一个选&#xff0c…

2023年03月17日_微软和谷歌办公AI的感慨

2023年3月17日 最近这个科技圈的消息 有点爆炸的让人应接不暇了 各种大公司简直就是神仙打架 你从来没有见过这么密集的 这么高频的产品发布 昨天微软是发布了Office 365 Copilot 在里边提供了大量的AI的功能 然后谷歌呢也发布了这个Google Workspace AI 也是跟365 Cop…

『番外篇七』SwiftUI 获取视图全局位置在 NavigationStack 中失效的解决方法

概览 在 番外篇六』SwiftUI 取得任意视图全局位置的三种方法 这篇博文里,我们详细讨论了在 SwiftUI 中获取任意视图全局坐标的几种方法。 不过,我们也从中提到了某些方法无法适用于 NavigationStack 视图,本篇博文由此应运而生。 在本篇博文种,您将学到如下内容: 概览1.…