Docker Container(容器)

news2024/9/23 11:26:13

"在哪里走散,你都会找到我~" 


Docker 容器

什么是容器?

        通俗来讲,容器是镜像运行的实体。我们对于镜像的认知是,“存储在磁盘上的只读文件”。当我们启动一个容器的本质,就是启动一个进程,即容器运行着真正的应用进程。

        它具有容器有初建、运行、停止、暂停和删除五种状态。

        虽然容器的本质是一个进程。但是容器有自己的命名空间隔离和资源限制。也就是说,在容器内部,无法看到宿主机上的进程、环境变量、网络等信息。这是容器与直接运行在主机上进程的本质区别。

容器的运行机制:

        容器是基于镜像创建的可运行实例,并且单独存在。一个镜像可以创建出多个容器。运行容器化环境时,实际上是在容器内部创建该文件系统的读写副本。 这将添加一个容器层,该层允许修改镜像的整个副本。

为什么需要容器?

        镜像是静态的文件,并不能提供服务,所以我们需要一个容器,作为镜像提供服务的实体。至于容器还能带来哪些收益,可以参考这篇文章: 容器化与虚拟化   

容器的生命周期

        容器的本质就是一个进程,所以这里谈及的生命周期与进程的生命周期类似:

created:初建状态 running:运行状态  stopped:停止状态

paused:暂停状态 deleted:删除状态

各生命周期之间的转换关系如图所示: 

        其中红标方框都会出现在下面容器命令清单中,这里就不做多的解释。只来谈谈其中几个容器异常退出情况:

🧶 容器OOM

Docker在处理OOM事件时,会分三种情况:

(1) 如果容器中的应用耗尽了主机系统分配给容器的内存限额,就会触发 OOM 事件。此时关闭该容器的不是Docker本身,而是宿主机的OS。
(2) 如果用户不想关闭这个容器,那么可以选择 --oom-kill-disable 来禁用 OOM-Killer。如果使用-m 设置了此容器内存上限,那么当容器到达内存资源上限时,主机不会关闭容器,但也不会继续向此容器 继续分配资源,此时容器将处于 hung 状态
 
(3)  如果用户使用了 --oom-kill-disable ,但也没有使用 -m 来设定上限,因而此时此容器将会尽可能多使用主机内存资源
🧶 容器异常退出

        每个容器内部都存在一个 Init 进程,容器中其他所有进程都是此进程的子进程。当 Init 进程退出时,也就代表着此容器被关闭。

🧶 容器暂停

        Docker“剥夺了此容器的 CPU 资源。失去了 CPU 资源的进程,是不会被主机内核系统所调度的所以此容器就处于冰封状态。


Docker容器命令清单

命令
别名
功能
docker createdocker container create创建容器
docker rundocker container run运行容器
docker attachdocker container attach连接到正在运行中的容器
docker commitdocker container commit将镜像提交为容器
docker cpdocker container cp在容器和宿主机之间拷贝
docker diffdocker container diff检查容器里文件结构更改
docker execdocker container exec在运行的容器中执行命令
docker exportdocker container export将容器导出为tar
docker container inspect
查看容器详细信息
docker killdocker container kill
杀死容器
docker logsdocker container logs
查看日志
docker ps

docker container ls,

docker container list,

docker container ps

查看正在运行的进程
docker pausedocker container pause
暂停进程
docker portdocker container pause
查看容器的端口映射
docker container prune
删除停止的容器
docker renamedocker container rename
重命名容器
docker restartdocker container restart
重启容器
docker rm

docker container rm,

docker container remove

删除容器
docker startdocker container start
启动容器
docker statsdocker container stats
查看资源占用信息
docker stopdocker container stop
停止容器
docker topdocker container top
查看某个容器的资源占用
docker unpausedocker container unpause
继续运行容器
docker updatedocker container update
更新容器配置
docker waitdocker container wait
阻止一个或多个容器停

容器状态:

🔮 docker create

# 创建一个新的容器但不启动它
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS:
○ -i: 以交互模式运行容器,通常与 -t 同时使用
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行
○ -m :设置容器使用内存最大值
○ --network="bridge": 指定容器的网络连接类型
○ --link=[]: 添加链接到另一个容器
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
○ --restart:自动重启

        在很多时候,都会在启动容器这一步设置是否在容器出现异常关闭时,自动重启选项。 

🔮 docker run

# 创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS:
○ -d: 后台运行容器,并返回容器 ID;比 create 多了这个参数
○ -i: 以交互模式运行容器,通常与 -t 同时使用;
○ -P: 随机端口映射,容器内部端口随机映射到主机的端口
○ -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
○ -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
○ --name="nginx-lb": 为容器指定一个名称;
○ -h "mars": 指定容器的 hostname;
○ -e username="ritchie": 设置环境变量;
○ --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行;
○ -m :设置容器使用内存最大值;
○ --network="bridge": 指定容器的网络连接类型;
○ --link=[]: 添加链接到另一个容器;
○ --volume , -v: 绑定一个卷
○ --rm :shell 退出的时候自动删除容器
○ --restart:自动重启

🔮 docker start

# 启动停止的容器
docker start [OPTIONS] CONTAINER [CONTAINER...]

🔮 docker stop

# 停止运行的容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS:
○ -s :发送的信号

🔮 docker restart

# 重启容器
docker restart [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS:
○ -s :发送信号

🔮 docker kill

# 强制退出容器
docker kill [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS:
○ -s :发送的信号

🔮 docker pause

# 暂停容器中所有的进程
docker pause CONTAINER [CONTAINER...]
# 恢复容器中所有的进程
docker unpause CONTAINER [CONTAINER...]

 🔮 docker rm

# 删除停止的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]

🔮 docker container prune

# 删除所有停止的容器
docker container prune [OPTIONS]

OPTIONS:
○ -f, --force:不提示是否进行确认

容器信息:

⌛ docker ps

# 列出容器
docker ps [OPTIONS]

OPTIONS:
○ -a :显示所有的容器,包括未运行的。
○ -f :根据条件过滤显示的内容。
○ --format :指定返回值的模板文件。如 json 或者 table
○ -l :显示 latest 的容器。
○ -n :列出最近创建的 n 个容器。
○ --no-trunc :不截断输出。
比特就业课
○ -q :静默模式,只显示容器编号。
○ -s :显示总的文件大小。

 ⌛ docker logs

# 查看容器日志
docker logs [OPTIONS] CONTAINER

OPTIONS:
○ -f ,--follow: 跟踪日志输出
○ --since :显示某个开始时间的所有日志
○ -t,--timestamps : 显示时间戳
○ -n,--tail :仅列出最新 N 条容器日志

⌛ docker top

# 查看容器中运行的进程信息,支持 ps 命令参数
docker top CONTAINER [ps OPTIONS]

注:容器运行时不一定有/bin/bash 终端来交互执行 top 命令,而且容器还不一定有
top 命令,可以使用 docker top 来实现查看 container 中正在运行的进程

⌛ docker stats

# 显示容器资源的使用情况,包括:CPU、内存、网络 I/O 等
docker stats [OPTIONS] [CONTAINER...]

OPTIONS:
○ --all , -a :显示所有的容器,包括未运行的
○ --format :指定返回值的模板文件。如 table,json
○ --no-stream :展示当前状态就直接退出了,不再实时更新
○ --no-trunc :不截断输出

⌛ docker container inspect

# 查看容器详细信息
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS:
○ -f :指定返回值的模板文件。如 table、json
○ -s :显示总的文件大小

⌛ docker port

# 用于列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT 到面向公众的端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]]

其他命令:

⛳ docker attach

# 连接到正在运行中的容器
docker attach [OPTIONS] CONTAINER

OPTIONS:
○ --sig-proxy:是否将所有信号代理,默认是 true,如果设置为 false,退出的
话不会影响容器,否则退出会导致容器退出。

⛳ docker exec 

在容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS:
○ -d :分离模式: 在后台运行
○ -i :即使没有附加也保持 STDIN 打开
○ -t :分配一个伪终端
○ -e :设置环境变量
○ -u,--user :指定用户 "<name|uid>[:<group|gid>]"
○ -w,--workdir:指定工作目录

⛳ docker cp

# 在容器和宿主机之间拷贝文件
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

⛳ docker diff

# 检查容器里文件结构的更改
docker diff CONTAINER

⛳ docker commit

# 从容器创建一个新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS:
○ -a :提交的镜像作者
○ -c :使用 Dockerfile 指令来创建镜像;可以修改启动指令
○ -m :提交时的说明文字
○ -p :在 commit 时,将容器暂停

⛳ docker export

# 导出容器内容为 tar 文件
docker export [OPTIONS] CONTAINER

OPTIONS:
○ -o:写入到文件

⛳ docker wait

# 阻塞运行直到容器停止,然后打印出它的退出代码
docker wait CONTAINER [CONTAINER...]

⛳ docker rename

# 重命名容器
docker rename CONTAINER NEW_NAME

⛳ docker update

# 更新容器配置
docker update [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS:
○ --cpus:cpu 数量
○ --cpuset-cpus :使用哪些 cpu
○ --memory :内存限制
○ --memory-swap:交换内存
○ --cpu-period :是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配
○ --cpu-quota:是用来指定在这个周期内,最多可以有多少时间用来跑这个容器

容器操作案例

        我们现在已经了解到了操作容器的命令,现在我们来使用使用,熟能生巧。

容器生命周期

(1) 通过 nginx 镜像文件创建容器        

(2) 容器的列举

        我们可以查看新拉取下来,正在 running的容器nginx:

(3) 停止当前正在运行的容器

        容器被暂停:

 
(4) 容器的列举(包含正在运行和退出的容器)

(5) 容器的删除

        查看当前容器列表 可以发现 fee20ff860cd 该容器已经被删除。

容器状态更迭

(1) 首先我们创建容器

(2) 通过 docker start 启动容器

(3) 通过 docker stop 可以停止容器

(4) 再次启动容器,然后 kill 容器

 

(5) 启动容器,然后暂停容器+恢复

(6) 通过 docker rm 可以删除容器

 

容器批量处理技巧 

命令 解释
docker container ls -qf name=xxx
根据名称过滤得到容器编号
docker container ls --filter status=running
根据状态过滤容器信息
docker container ls -aq
静默获取全部容器 id
docker container ls --filter ancestor=xxx
过滤镜像名为 xxx 的容器信息
docker container ls --filter ancestor=xxx
过滤镜像 id xxx 的容器信息
• -a:表示打印所有的容器信息, 包括正在运行和已经退出的
• -q: 表示只返回容器 ID
• -f: 表示基于给的条件过滤 等价于 --filter 选项

注:任意容器的ancestor就是它的镜像文件       

批量删除容器:

        我们现在启动一批容器:

        按找以往,我们只是批量 使用 docker rm + ID,这样的效率实在太低。因此,我们可以借助传参的方式批量化删除。

按照状态过滤删除已经退出的容器:

        我们查看当前容器,会存在正在运行的和已经陷入 “冰封“状态的。

        按照状态过滤删除已经退出的容器:

容器交互模式

🪁 attached 模式

        在attached模式下容器会在前台运行。

例如: 

docker run -p 80:80 nginx:latest
# -p 80:80 表示端口映射

        访问服务器网址的时候,每访问一次,命令窗口就会打印一次日志,Docker 容器 的日志会实时的展现到窗口并且占用此端口:

        一旦我们在控制台按下组合键”ctrl + C“,就会发生终止:

        因此,在生产线上需要更稳定的模式,attached 模式仅适用于容器和程序的调试阶段

🪁 detached 模式

        我们只需要在启动时,添加参数 "--detach"。

docker run -p 80:80 --detach(-d) nginx:latest

        在后台运行,启动后只显示容器 ID,并且可以输入任何命令,就算关掉窗口依然继续运行,停止和删除容器都需要使用 shell 命令,减少了很多的误操作。

        我们可以使用docker log用来查看容器内部的日志信息:

 docker container logs [bb03f5b320f7]

🪁 interactive 模式

        当我们创建好一个容器之后, 可能需要去容器内部获取一些信息或执行一些命令,就需要进入到交互式模式。进入交互式模式有两种方式

        (1) 创建运行容器并进入到交互模式:

docker run -it nginx:latest sh

        就算此时,你使用”Ctrl +C“也不能退出这个交互模式,只能使用”exit“退出容器。

        (2) 针对一个已经运行的容器里进入到交互模式

docker container exec -it nginx:latest sh(bash)

         此时,即便我们使用”exit“,运行的容器不会受影响。

 

容器与宿主机内容复制

        我们启动一个nginx服务,想修改它的首页信息:

        我们切换到交互模式,想去这个容器内部修改首页文件。

        可是,我们发现容器内没有配备vim编辑器,所以我们的想法是,将这个文件拿到宿主机来,宿主机可有vim。 

        将修改号的文件,拷贝回去:

        完成后,我们再打开nginx首页,就会发现修改痕迹:

容器自动删除

        启动一个 nginx,我们指定--rm 选项

docker run --name mysite -d --rm -p 80:80 nginx:1.22.1

--rm:当容器退出时,自动删除

容器自动重启

容器重启选项如下:
🪔  docker run --restart=no : 默认值不自动重启;
🪔  docker run --restart=on-failure : on-failure 若容器的退出状态非 0,则docker 自动重启容器,还可以指定重启次数,若超过指定次数未能启动容器则放弃;
🪔  docker run --restart=always : always 容器退出时总是重启
🪔  docker run --restart=unless-stopped : unless-stopped 容器退出时总是重启
🪔  docker update --restart=always : 容器启动时没有设置 –restart 参数,则通过下面命令进行更新
        不管设置什么样的重启操作,一旦遇到docker stop 都不会再重启。

容器环境变量设置

        例如: 启动一个 nginx 容器,配置环境变量,TEST=1

docker run -d --name website3 -p 8080:80 -e TEST=1 nginx:1.24.0

容器详情查看

        我们可以查看一个容器的详细信息,比如我们可以查看所有设置的环境变量:

 docker container inspect [container]

容器执行单行命令

        我们可以直接借助 docker 的容器环境执行一些命令,比如容器中有某个命令而宿主机上没有这个时候借助容器可以完成某些任务。

docker run --rm -p 8011:80 nginx:1.23.0 echo "hello bit"

容器日志查看

docker container logs bb03f5b320f7 -n 5

        当参数带上-f时,就会变成动态查看日志信息;

容器资源查看

        我们可以通过 docker top 查看容器中有哪些进程,添加 aux,可以看到占用的内存和 CPU信息

        通过 docker stats 可以看到资源的实时占用变化


本篇到此结束,感谢你的阅读

祝你好运,向阳而生~

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

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

相关文章

K线实战分析系列之五:刺透形态——多方反攻信号

K线实战分析系列之五&#xff1a;刺透形态——多方反攻信号 一、刺透形态二、类似刺透形态三、刺透形态的总结 一、刺透形态 阴线在前&#xff0c;阳线在后显示市场曾经跌到了低位&#xff0c;但是在盘中又将价格收回&#xff0c;并且多方收复了前一天大部分的失地 二、类似刺…

计算机设计大赛 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

ES通用查询页面使用说明

前言:ES语法比较复杂,需要专门的学习,而且查询工具不太友好, 对公司运维人员使用有点困难,所以花了个时间做了一个页面,方便运维人员使用,如下。 也不难,有兴趣的朋友可以私聊发源码。 开发帮助-ES数据查询 搜索 输入要查看的文档索引,文档类型后点【查询】即可 搜…

MySQL知识点总结(五)——锁

MySQL知识点总结&#xff08;五&#xff09;——锁 锁分类表锁 & 行锁如何添加表锁&#xff1f;如何添加行锁&#xff1f; 读锁 & 写锁行锁 & 间隙锁&#xff08;gap lock&#xff09;& 临键锁&#xff08;next-key lock&#xff09; 加锁机制分析可重复读隔离…

C语言:指针(一)

目录 1.内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 解引用操作符&#xff08;*&#xff09; 2.3 指针变量的大小 3.指针变量的类型和意义3.1 指针的解引用3.2 指针 -指…

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结&#xff1a; 一、引言 ​ 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

【前端素材】推荐优质后台管理系统Be admin平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

ThreeJS 几何体顶点position、法向量normal及uv坐标 | UV映射 - 法向量 - 包围盒

文章目录 几何体的顶点position、法向量normal及uv坐标UV映射UV坐标系UV坐标与顶点坐标设置UV坐标案例1&#xff1a;使用PlaneGeometry创建平面缓存几何体案例2&#xff1a;使用BufferGeometry创建平面缓存几何体 法向量 - 顶点法向量光照计算案例1&#xff1a;不设置顶点法向量…

探索设计模式的魅力:状态模式揭秘-如何优雅地处理复杂状态转换

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;并且坚持默默的做事。 探索设计模式的魅力&#xff1a;状态模式揭秘-如何优雅地处理复杂状态转换 文章目录 一、案例…

使用 ES|QL 优化可观察性:简化 Kubernetes 和 OTel 的 SRE 操作和问题解决

作者&#xff1a;Bahubali Shetti 作为一名运营工程师&#xff08;SRE、IT 运营、DevOps&#xff09;&#xff0c;管理技术和数据蔓延是一项持续的挑战。 简单地管理大量高维和高基数数据是令人难以承受的。 作为单一平台&#xff0c;Elastic 帮助 SRE 将无限的遥测数据&#…

亿道丨三防平板丨加固平板丨工业平板丨选购三大要素?

在当今的市场中&#xff0c;企业在复杂多变的大环境中面临着许多挑战和机遇。其中包括尽管消费者对产品的需求不断增长&#xff0c;但劳动力短缺仍在继续的问题。大部分企业正在采用更具成本效益的方法&#xff0c;并希望利用他们获得的硬件和软件做更多的事情&#xff0c;因此…

Stable Diffusion 3的到来巩固了 AI 图像对抗 Sora 和 Gemini 的早期领先优势

Stability AI 将其更改为 Stable Diffusion 3。VentureBeat 报道称&#xff0c;Stability AI 的下一代旗舰 AI 图像生成模型将使用类似于 OpenAI 的 Sora 的扩散变压器框架。其当前模型仅依赖于扩散架构。虽然尚未发布&#xff0c;但您可以在等候名单中注册。 官方网址链接&am…

28V、115V、270V坦克装甲车启动电源:为现代战争注入新能量

28V、115V、270V坦克装甲车启动电源&#xff1a;为现代战争注入新能量 世界新格局的诞生后&#xff0c;现代战争已经从传统的陆地、海洋、空中扩展到了网络空间和外太空。在这种背景下&#xff0c;各种先进的武器装备不断涌现&#xff0c;为国家安全提供有力保障。28V、115V、2…

微信小程序01: springboot获取accessToken方式 ,配合redis缓存使用

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文小总结1.1.2 上文传送门 2. springboot获取accessToken2.0 accessToken简介2.1 准备工作2.2 具体代码使用与注释如下2.2.1 代码解释(一)[无需复制]2.2.2 代码解释(二)[无需复制] 2.3 最后一步 获取accessToken2.3.1 两行代…

kubernetes负载均衡部署

目录 1.新master节点的搭建 对master02进行初始化配置&#xff08;192.168.88.31&#xff09; 将master01的配置移植到master02 修改master02配置文件 2.负载均衡的部署 两台负载均衡器配置nginx 部署keepalived服务 所有node节点操作 总结 实验准备&#xff1a; k8s…

【区块链】智能交易模式下的数据安全流通模型

【区块链】智能交易模式下的数据安全流通模型 写在最前面**区块链智能交易模式概述****数据安全流通的挑战****数据安全流通模型的核心要素****实现数据安全流通的区块链技术****区块链智能交易模式下数据安全流通模型的设计原则****数据安全流通模型的应用案例分析****面临的挑…

海外媒体推广通过5个发稿平台开拓国际市场-华媒舍

随着全球化的进程&#xff0c;国际市场对于企业的吸引力日益增加。进入国际市场并获得成功并非易事。海外媒体推广发稿平台成为了一种重要的营销手段&#xff0c;能够帮助企业在国际市场中建立品牌形象、传递信息和吸引目标受众。本文介绍了五个海外媒体推广发稿平台&#xff0…

什么是去中心化云计算?

去中心化云计算是一种新型的云计算方式&#xff0c;它与传统的中心化云计算不同&#xff0c;将数据和计算任务分布到多个节点上&#xff0c;而不是将数据集中存储在中心服务器上。这种云计算方式具有许多优势&#xff0c;包括提高数据安全性、降低运营成本、增强可扩展性和灵活…

2_怎么看原理图之协议类接口之UART笔记

通信双方先约定通信速率&#xff0c;如波特率115200 一开始时&#xff0c;2440这边维持高电平 1> 开始发送时&#xff0c;由2440将&#xff08;RxD0&#xff09;高电平拉低&#xff0c;并持续一个T的时间&#xff08;为了让PC机可以反应过来&#xff09;&#xff0c;T1/波…

无公网IP情况下如何远程查看本地群晖NAS存储的文件资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…