[Docker学习笔记]Docker的原理Docker常见命令

文章目录

  • 什么是Docker
    • Docker的优势
    • Docker的原理
    • Docker 的安装
    • Docker 的 `namespaces`
  • Docker的常见命令
    • `docker version`:查看版本信息
    • `docker info `查看docker详细信息
      • 我们关注的信息
    • `docker search`:镜像搜索
    • `docker pull`:镜像拉取到本地
    • `docker push`:推送本地镜像到镜像仓库
    • `docker tag`:为镜像加(改)标签
    • `docker login`:登录镜像仓库
    • `docker run`:启动一个镜像(容器)
      • 前台启动
      • 后台启动
        • 【补】为什么我们上面两个容器,最后都会退出?
        • 【补】那我们怎么解决这个问题呢?
          • 1.既然我们直接不管他不行,那就先这个bash终端放到后台瞧瞧
          • 2.我们再来瞧瞧,是不是哪里理解错了
      • 我们再启动一个nginx容器试试
        • 问题来了,我们启用nginx容器的目的不是要做个网站吗,我们只知道容器内部用的是80端口,那我们在宿主机怎么访问呢?
      • 总结一下
    • `docker ps`:查看容器信息
    • `docker logs`:查看容器日志
      • 【补】除了用docker logs命令,我们还可以直接进入容器的上下文目录查看日志
    • `docker exec`:进入(正在运行的)指定容器
    • `docker cp`:文件的拷贝
      • 将本地文件(宿主机文件)拷入容器中
      • 将容器中的文件拷贝到宿主机中
    • `docker rmi`:删除镜像
    • `docker rm`:删除容器
    • `docker stop`:停止容器
    • `docker start`:重启容器
    • `docker history`:查看镜像更改记录
    • `docker commit`:提交容器状态为镜像到本地仓库
      • 我们再看看这个镜像的细节
      • 用这个镜像起一个容器
        • 在另一个窗口看看
        • 我们回到这个终端,退出容器试试
    • `docker build`:通过Dockerfile 构建镜像

什么是Docker

百度百科
在这里插入图片描述

Docker的优势

  1. 跨平台部署:Docker 可以在不同的操作系统和硬件平台上运行,可以轻松地将应用程序在开发、测试和生产环境中进行一致性的部署。

  2. 资源利用率和扩展性:Docker 可以通过容器的方式将应用程序与其依赖的运行时环境和依赖项隔离,从而提高资源的利用率并减少资源的消耗。此外,Docker 还支持快速水平扩展,使应用程序能够更好地适应变化的负载。

  3. 快速交付和部署:通过 Docker 容器化,可以实现快速的应用程序交付和部署。将应用程序和其依赖项打包到容器中,可以确保运行环境的一致性,并且在不同的环境中轻松地部署和迁移应用程序。

  4. 简化开发环境配置:Docker 可以帮助开发人员更轻松地配置开发环境。通过使用容器,可以将应用程序及其依赖项打包到一个镜像中,并在开发环境中进行部署,从而减少了由于开发环境配置不一致导致的问题。

  5. 提高应用程序的安全性:Docker 的容器隔离技术可以将应用程序与底层主机隔离开来,从而提高应用程序的安全性。每个容器都有自己的文件系统、进程空间和网络接口,使得应用程序之间互不干扰。

Docker的原理

我们现在可以知道Docker实际上就是一个应用程序,只不过自己带上了所需要的依赖。在考虑Docker的原理之前,我们先来看看在部署应用的方式是怎样一步步升级的

以部署一个Mysql程序为例

  1. 物理机

    1. 首先,我们要拥有一个操作系统(通常是Linux操作系统)

    2. 安装依赖环境(gcc、make、libncurses5-dev等编译工具)

    3. 安装应用程序

      此时如果我们要增加一台新的物理机来处理Mysql并发请求,就需要再进行一次环境的重复配置

  2. 虚拟化(KVM或其他技术)

    1. 将一个物理机虚拟成多个机器
    2. 可以将依赖环境打包成一个模板(VMware Workstation的克隆功能就是这样实现的)
  3. 容器化

    1. 以镜像为基础

      • 依赖环境的镜像
        • Java程序——Java的基础镜像
        • Php程序——Php的基础镜像
        • Nginx程序——Linux操作系统基础镜像
      • 根据基础镜像——放入自己的代码(或包)——>生成程序镜像
    2. 镜像按层存储
      在这里插入图片描述

      这样的方式可以让我们使用同于基础层来实现不同的功能,如上图,下面两层我们就可以直接套用模板了

    3. 启动时间快(秒级启动)

      由于与主机共享内核,不需要做操作系统的引导

    4. 可移植性好

      将运行某个应用所需要的环境全部打包到同一个容器中,不需要考虑兼容问题

      在这里插入图片描述

      如上图

      • Docker将用户程序与所需要调用的系统函数库一起打包
      • Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行

Docker 的安装

参考官方文档

Docker 的 namespaces

Docker 使用 Linux 内核的 namespaces 功能来实现容器的隔离。namespaces 是 Linux 内核提供的一种机制,用于隔离系统资源,使得运行在不同 namespaces 中的进程拥有独立的视图和环境,而不会相互干扰。Docker 利用这一机制来创建轻量级的虚拟化环境,即容器。

  1. 进程命名空间(PID Namespace)

    进程命名空间允许容器中的进程拥有独立的进程树。这意味着容器内的进程ID(PID)与宿主机或其他容器中的进程ID是隔离的。每个容器都有自己的 PID 1,即容器内的第一个进程。

  2. 网络命名空间(NET Namespace)

    网络命名空间为每个容器提供独立的网络堆栈。容器拥有自己的网络接口、IP地址、路由表、防火墙规则等。这允许容器之间以及容器与宿主机之间进行隔离的网络通信。

  3. 挂载命名空间(MNT Namespace)

    挂载命名空间为每个容器提供独立的文件系统视图。容器可以有自己的 / 根目录,以及独立的挂载点,使得容器可以有自己独特的文件系统结构,而不会影响到宿主机或其他容器。

  4. 用户命名空间(USER Namespace)

    用户命名空间允许容器内的用户和组ID与宿主机上的用户和组ID不同。这意味着容器内的用户可以映射到宿主机上的不同用户,从而提供额外的安全隔离。

  5. UTS命名空间

    UTS命名空间允许容器拥有独立的主机名和NIS域名。这使得容器可以拥有自己的标识,而不需要与宿主机或其他容器共享。

  6. IPC命名空间

    IPC命名空间(Inter-process communication namespace)为容器提供独立的进程间通信资源,如消息队列、信号量和共享内存。这确保了容器之间的进程通信是隔离的。

通过这些 namespaces,Docker 实现了容器的隔离,使得每个容器都像是在独立的环境中运行,而实际上它们共享宿主机的内核。这种隔离机制是容器轻量级和高效的关键

Docker的常见命令

docker version:查看版本信息

在这里插入图片描述

  • Docker版本 Version: 24.0.7
  • 宿主机架构 OS/Arch:linux/amd64
  • 其他一些关键组件的版本

docker info 查看docker详细信息

在这里插入图片描述
在这里插入图片描述

我们关注的信息

  1. Client Debug Mode:false #客户端的debug模式,按需开启

  2. Server:Containers: 1 # 已构建1个容器Running: 0  # 正在运行的容器数量Paused: 0   Stopped: 1Images: 3    # 服务器保存的镜像数量
    

    docker ps -a

    在这里插入图片描述

    docker images

    在这里插入图片描述

  3. Storage Driver: overlay2存储驱动为overlay2(官方默认、性能好)

    常见驱动 aufs、overlay、brtfs

  4. Logging Driver: json-file:Docker 日志存储类型

    #json-file存储在本地的Docker根目录

  5. Docker Root Dir: /var/lib/docker:Docker根目录(可以更改)

    #最好使用一个单独的磁盘挂载该目录

  6. Runtimes: runc io.containerd.runc.v2:容器创建、销毁以及运行都是调用Runtime来执行

  7. Live Restore Enabled: false:开启后自动重启容器

docker search:镜像搜索

带officials为官方镜像

docker pull:镜像拉取到本地

  1. 本地有同一镜像,则不会重复拉取

  2. docker pull xxx.com/nginx:latest
    

    #从xxx.com的镜像仓库拉取标签为latest的nginx镜像;不加URL则表示从官网拉取

  3. 不加标签默认拉取最新版本

docker push:推送本地镜像到镜像仓库

docker push xxx.com/my-namespace/my-nginx:latest

docker tag:为镜像加(改)标签

dockertag my-nginx:latest xx.com/my-namespace/my-nginx:latest

docker login:登录镜像仓库

  • 不加仓库地址默认登陆官方镜像仓库

    docker login registry.cn-hangzhou.aliyuncs.com
    

    #登陆阿里云镜像站

docker run:启动一个镜像(容器)

前台启动

docker run -ti centos:7 bash  
# -ti:生成一个终端
# bash:指定终端为bash

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

后台启动

docker run -d centos:7 bash
【补】为什么我们上面两个容器,最后都会退出?
docker ps -a

在这里插入图片描述

我们先来看看他们创建的命令都是docker run xxx bash,最后都会生成一个终端

我们再到百度上搜搜看什么叫终端

在这里插入图片描述

咦,这一切不都说得通了,我们在前台启动的centos7容器是因为退出了容器bash前台终端,这个容器存在的意义也就没了,而后台启动的第二个容器,压根就没前台终端生成。

【补】那我们怎么解决这个问题呢?
1.既然我们直接不管他不行,那就先这个bash终端放到后台瞧瞧
docker run -d centos:7 bash&

在这里插入图片描述

表面上看是行了,我们再打开一个窗口看看现在这个容器在不在运行

在这里插入图片描述

结果还是不行,out

2.我们再来瞧瞧,是不是哪里理解错了

在这里插入图片描述

哦,那我们把这个bash换成其他的不需要前台输入的的命令试试

docker run -d centos:7 tail -f /dev/null
# 这里我们把这个容器当成生产队的驴来用了,持续读取一个空文件的尾部

看看结果,up!!!

在这里插入图片描述

docker run -d centos:7 sleep infinity
# 这里用sleep infinity 命令让容器宝宝独自等待~

在这里插入图片描述

嗨呀,小case啦,轻轻松松^_*

我们再启动一个nginx容器试试

docker run -d --name nginx_test nginx:test
# --name 指定容器名 后面跟依赖的镜像

在这里插入图片描述

问题来了,我们启用nginx容器的目的不是要做个网站吗,我们只知道容器内部用的是80端口,那我们在宿主机怎么访问呢?
  1. 我们先把他关了

    docker stop nginx_test
    
  2. 重新启动容器并添加端口映射

    docker run -d --name nginx_test -p 8080:80 nginx:test
    

    在这里插入图片描述

    这是肿么肥四,重名了?我们来看看

    docker ps -a
    

    在这里插入图片描述

    不还是你吗?你小子不听话就把你删了

    docker rm nginx_test
    

    接下来把所有的爱给他同父同母的同名兄弟

    docker run -d --name nginx_test -p 8080:80 nginx:test
    # -p [宿主机端口:容器端口] 添加端口映射
    

    在这里插入图片描述

  3. 再用宿主机的8080端口访问一下

    在这里插入图片描述

这不又好了吗,easy啊~_-

总结一下

bash可以换成任意命令

  • 如果是需要前台输入的命令,你得提供一个前台伪终端,提供内容给他
  • 后台可以直接运行的命令就无所谓了

docker ps:查看容器信息

  • docker ps :查看当前正在运行的容器

    docker ps
    

    在这里插入图片描述

  • docker ps -a:查看所有已经创建的容器(包括退出)

    docker ps -a
    

    在这里插入图片描述

  • docker ps -q:查看所有正在运行的容器ID(个人认为用处不大,不如docker ps)

  • docker ps -aq:查看容器的ID(同理用处不大,不如docker ps -a)

docker logs:查看容器日志

docker logs [容器名/容器ID]
docker logs -f [容器名] # 跟随模式,持续输出,动态查看,用户手动停止

我们来查看刚刚创建的nginx容器日志

docker logs nginx_test

在这里插入图片描述

【补】除了用docker logs命令,我们还可以直接进入容器的上下文目录查看日志

sudo su # 进入容器日志目录需要管理员权限
cd /var/lib/docker/containers/

在这里插入图片描述
这几个就是目前存在的容器

在这里插入图片描述
我们要看nginx容器的日志

cd  969d3c0012a74aa61284fe89be08fcfc17c83ac83674bed422e7b2fc086eb782/
# 不用敲全,用tab补全就行了
ls

在这里插入图片描述

 tail 969d3c0012a74aa61284fe89be08fcfc17c83ac83674bed422e7b2fc086eb782-json.log# 结果跟docker logs nginx_test 结果一样一样的

在这里插入图片描述

docker exec:进入(正在运行的)指定容器

docker exec -it nginx_test bash
ls #查看容器内的文件
uname -a #查看容器内部运行的操作系统
exit #退出容器

在这里插入图片描述

#进入容器后注意主机名和用户的变化

docker cp:文件的拷贝

docker cp [宿主机文件] [容器名(或者id):容器内部文件夹(或文件)]
docker cp [容器名(或者id):容器内部文件夹(或文件)]

将本地文件(宿主机文件)拷入容器中

在执行操作前我们先看看nginx的网页存放的位置

find . -name "html"
#莫名其妙的权限报错这会儿咱们就不管了

在这里插入图片描述

echo "hello nginx" > index.html&&cat inidex.html

在这里插入图片描述

docker cp index.html nginx_test:/usr/share/nginx/html/

在这里插入图片描述

这时我们再来看看nginx的主页什么样了

在这里插入图片描述

将容器中的文件拷贝到宿主机中

#先在根目录下执行ls命令并将结果重定向到test.txt中
ls >>test.txt

在这里插入图片描述

#在宿主机执行cp命令,并显示文件内容
docker cp nginx_test:./test.txt ls_test.txt&&cat ls_test.txt

在这里插入图片描述

docker rmi:删除镜像

我们先看看机子上现有哪些镜像

docker images

在这里插入图片描述

居然有两个不知道什么内容的镜像,那把他俩都删了吧,红尘作伴,潇潇洒洒,说干就干

docker rmi  2a36393edaf1  605c77e624dd

再看看,已经不在了

在这里插入图片描述

docker rm:删除容器

我们先来看看有哪些容器不乖了

在这里插入图片描述

好嘞,就决定是你了,你都退出了,那我就对你不客气咯

docker rm [容器名(或容器ID)]
docker rm inspiring_shannon

在这里插入图片描述

害群之马没啦,一片祥和

docker stop:停止容器

docker stop [容器名/容器ID]
docker ps
docker stop nginx_test
docker ps

在这里插入图片描述

docker start:重启容器

docker stop [容器名/容器ID]
docker ps
docker start nginx_test
docker ps

在这里插入图片描述

docker history:查看镜像更改记录

我们先看看有哪些镜像

docker images

在这里插入图片描述

docker history  centos:latest
# 我们选择占用空间最大的centos:latest来看

在这里插入图片描述

docker commit:提交容器状态为镜像到本地仓库

docker commit <参数> <容器id> <仓库>[:标签]>
# -a, --author:指定作者信息,格式为 name <email>。
# -c, --change:应用 Dockerfile 指令到创建的镜像。
# -m, --message:提交信息,描述这次提交的更改。
# --pause:是否在提交时暂停容器,默认为 true
docker commit -a "yy" -m "my_nginx_test_images1" nginx_test my_nginx:v1.0
# -a 参数一般是告诉别人作者的信息,我在这只是本地使用提交,其实加不加无所谓

在这里插入图片描述

我们再看看这个镜像的细节

docker history my_nginx

在这里插入图片描述

显示了提交时的信息

用这个镜像起一个容器

docker run -it --rm --name nginx_test1 mynginx:v1.0 bash

在这里插入图片描述

在另一个窗口看看
docker ps

在这里插入图片描述
成功了

我们回到这个终端,退出容器试试
exit
docker ps

咦,nginx_test1怎么没了,是不是退出啦?

在这里插入图片描述

我们再看看

docker ps -a

在这里插入图片描述
还是没有啊,燕子,没有你我怎么活呀

这时候一旁看戏的nginx_test就要说了:你这家伙,创建人家的时候是不是干了什么事情

我们往上看看命令

在这里插入图片描述
哦,原来罪魁祸首是这个--rm参数,他让容器运行结束后自动删除了(这样做的好处是,减少exit状态容器的出现)

docker build:通过Dockerfile 构建镜像

docker build -t <镜像名称[:标签]> <上下文目录(dockerfile所在目录)>
# 标签缺省则默认为latest

我们现在已经有一个dockerfile文件了,存放在./Dockerfile目录下

docker build -t nginx_test_dockerfile ./Dockerfile_task/

在这里插入图片描述

看看有咩有多一个叫nginx_test_dockerfile的镜像

docker images

在这里插入图片描述

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

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

相关文章

SWAP、AquaCrop、FVCOM、Delft3D、SWAT、R+VIC、HSPF、HEC-HMS......

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&…

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 目录 文章目录 [大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26目录论文信息摘要主要内容包括&#xff1a;研究方法与资源的分类&#xff1a;结论&#xff1a; 论文信息 Title: Recent Advancement …

Halcon基础系列1-基础算子

1 窗口介绍 打开Halcon 的主界面主要有图形窗口、算子窗口、变量窗口和程序窗口&#xff0c;可拖动调整位置&#xff0c;关闭后可在窗口下拉选项中找到。 2 显示操作 关闭-dev_close_window() 打开-dev_open_window (0, 0, 712, 512, black, WindowHandle) 显示-dev_display(…

【数据结构与算法】Z算法(扩展KMP)(C++和Python写法)

Z算法&#xff08;扩展KMP&#xff09; 文章目录 Z算法&#xff08;扩展KMP&#xff09;朴素求法线性求法力扣类型题变种题&#xff1a;[3303. 第一个几乎相等子字符串的下标](https://leetcode.cn/problems/find-the-occurrence-of-first-almost-equal-substring/) 所谓Z算法&…

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …

box-im

任何一个开源项目&#xff0c;都可以让自己得到提升&#xff01; 启动minio: minio.exe server C:\Program Files\Minio\minioData

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

刚面试完的前端面试题

今天晚上参加了一场长达40多分钟的技术面。我觉得面试官非常专业&#xff0c;问的问题也都是很棒的&#xff01;自己很多知识都需要学习。所以我决定回想并记录下来。回答不对的地方欢迎大家指正&#xff01; 我自己在小本本上回忆出来的大概就是26道题。后期我会持续更新我学习…

数字图像处理:空间域滤波

1.数字图像处理&#xff1a;空间域滤波 1.1 滤波器核&#xff08;相关核&#xff09;与卷积 图像上的邻域计算 线性空间滤波的原理 滤波器核&#xff08;相关核&#xff09;是如何得到的&#xff1f; 空间域的卷积 卷积&#xff1a;滤波器核与window中的对应值相乘后所有…

SpringBoot实现学科竞赛管理:最佳实践

摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&#xff0c;竞赛管理系统应运而生。 本学科竞赛管理系统以实际运用为开发背景…

SpringBoot--为什么Controller是串行的?怎样才能并行?

原文网址&#xff1a;SpringBoot--为什么Controller是串行的&#xff1f;怎样才能并行&#xff1f;-CSDN博客 简介 本文介绍SpringBoot为什么Controller是串行的&#xff1f;在什么场景下才能并行执行&#xff1f; 大家都知道&#xff0c;SpringBoot的Controller按理是并行执…

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤&#xff1a; 什么是生命周期React类组…

Python3自带HTTP服务:轻松开启与后台管理

Python3自带有http服务&#xff0c;可以在服务器&#xff0c;也可以在本地启动&#xff0c;并运行一些常用的网页程序。比如&#xff1a;我们可以把streamlit框架编写的网页放到服务器上&#xff0c;开启http服务&#xff0c;就可以通过网页来调用这个pythont程序了&#xff0c…

Java SE 总结

Java SE&#xff08;Standard Edition&#xff09;是Java编程语言的标准版本&#xff0c;提供了基础的编程环境和API&#xff0c;适用于开发和运行Java应用程序。下面是Java SE的几个重要方面的知识回顾与总结。 1. Java环境基础 具体可参考这里对三者的介绍 传送门 1.1 JVM…

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

ORM的了解

什么是ORM&#xff1f;为什么要用ORM&#xff1f;-CSDN博客 C高级编程&#xff08;99&#xff09;面向资源的设计思想&#xff08;ORM&#xff09;_c orm-CSDN博客 ORM:Object-Relational-Mapping 对象关系映射 -------------------------- 我想对数据库中的表A进行增删改…

天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设&#xff1a;天龙八部怀旧单机微改人面桃花。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xf…

【Mybatis篇】动态SQL的详细带练

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【计算机网络】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 文章目录 &#x1f3af;一.动态SQL简单介绍 &#x1f6a6;动态S…

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息&#xff0c;据外媒The Information昨晚报道&#xff0c;OpenAI的新模型「草莓」&#xff08;Strawberry&#xff09;&#xff0c;将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…

全网最全软件测试面试题(含答案解析+文档)

一、软件测试基础面试题 1、阐述软件生命周期都有哪些阶段? 常见的软件生命周期模型有哪些? 软件生命周期是指一个计算机软件从功能确定设计&#xff0c;到开发成功投入使用&#xff0c;并在使用中不断地修改、增补和完善&#xff0c;直到停止该软件的使用的全过程(从酝酿到…