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

【docker】docker的基础命令

基础操作

docker info    #查看docker的基本信息docker version  #查看docker版本信息

一、镜像操作

 1、搜索镜像

docker search nginx

2、下载镜像

docker pull nginx#从仓库中下载镜像,若没有指定标签,则下载最新的版本,也就是标签为: latest(最新的)

下载好了镜像就可以在目录/var/lib/docker中查到

3、查看镜像

3.1查看下载到本地的所有镜像
docker images
  • PERPOSITORY: 镜像属于的仓库
  • TAG: 镜像的标签信息,标记同一个仓库中不同镜像
  • **IMAGE ID: **镜像创建时间
  • VIRTAL SIZE: 镜像大小

3.2 查看单个镜像的详细信息
docker inspect 【镜像id或名称】#主要是获取到镜像的唯一标识符,来查看该镜像的详细信息,唯一标识符肯定是ID号,也可以是名称+标签

4、为镜像添加新的标签

docker tag nginx:latest nginx:web
#将nginx镜像标签为latest的再添加一个为web标签
目的:为了见名知意docker images

5、镜像导出和导入到本地

5.1 镜像导出到本地

将镜像库中的镜像导出到本地

#格式: docker save -o 【存储的文件名】 【存储的镜像】docker save -o nginx nginx:latest
#将镜像名为nginx标签为latest的镜像导出到本地,并命名为nginx
  • 导出到本地

  • 导出到指定目录

5.2 导入镜像

将本地的镜像文件导入到镜像库中

docker load < nginx
#或
docker load -i nginx

方法一:

方法二:

6、删除镜像

注意!如果该镜像已被容器使用,正确做法是先删除依赖的镜像的所有容器,再去删除镜像。

docker rmi 【镜像库名:标签】   #当一个镜像都多个标签时,只是删除其中指定的标签
#或
docker rmi -f 【镜像id】  #会彻底删除该镜像(如果有多个标签,会报错)

7、批量删除镜像

docker images -q 
#加载所有镜像iddocker rmi 'docker images -q'
#批量删除所有镜像docker images |awk 'NR>=2{print "docker rmi "$3}'|bash
#批量删除所有镜像

8、上传镜像

默认上传到docker Hub官方的公共仓库,需要注册使用公共仓库的账号,

可以使用docker login 命令来输入用户名、密码和邮箱来完成注册和登录

在上传镜像之前,还需要对本地镜像添加新的标签,然后再使用docker push命令进行上传。

官网地址:https://hub.docker.com/
8.1 官网注册登录账号

8.2 上传镜像到仓库
docker tag nginx:latest ydqhub/nginx:web
#修改标签docker login
#登录公共仓库docker push ydqhub/nginx:web
#上传镜像

登录到ydqhub中进行查看上传的仓库

二、容器操作

1、容器创建

新创建的容器默认处于停止状态,不运行任何程序,需要再其中发起一个进程来启动容器。

docker  create  -it nginx:latest /bin/bash#选项解释
-i  #让容器开启标准输入
-t  #让docker分配一个伪终端tty
-it #合起来实现和容器交互的作用,运行一个交互式会话shell
/bin/bash #shell环境,容器运行的环境

2、查看容器状态
 

docker ps
#查看正在运行的容器docker ps -a
#查看所有的容器

3、启动容器

docker start 【容器ID】
#根据容器ID启动容器

4、创建并启动容器-docker run

执行docker run 命令,等同于先执行docker create 命令,再执行docker start命令。

注意:容器是一个与其中运行的shell命令共存亡的终端,命令运行容器运行,命令结束容器结束。

docker容器默认会把容器内部第一个进程,也就是pid=1的程序作为docker容器是否正在运行的一句,如果docker容器中pid=1的进程挂了。那么docker容器便会直接退出,也就是说Docker容器中必须有一个前台进程,否则认为容器已经挂掉。

当利用docker run 来创建容器时,Docker在后台的标准运行过程是:

  • 检查本地是否在指定的镜像,当镜像不存在时,会从公有仓库下载
  • 利用镜像创建并启动一个容器,
  • 分配一个文件系统给容器,在制度的镜像层外面挂在一层可读写层。
  • 从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中
  • 分配一个地址池中的IP地址给容器。
  • 执行用户指定的应用程序,执行完毕后容器被终止运行
docker run -itd nginx:latest /bin/bash
#-d选项,让程序再后台持续运行docker run centos:7 /usr/bin/bash -c ls -lh /
#没有-d选项,执行完退出,-c选项可以将命令发送到容器中运行docker run -d centos:7 /bin/bash -c "while true;do echo ydq;done"
#执行循环造成进程运行,但是会持续增加压力

实例一

  • 加于不加-d的区别
  • 如果docker run 运行的时一个centos系统,不加-d,会运行一个前台,然后直接进入容器内部。当你退出容器后,进程就会退出。容器就会关闭

实例二

实例三

  • 这种其实不加-d,也可以运行容器,因为容器中一直存在执行命令,它与命令共存亡。

如果在生产环境中,这个容器不能删除,但是磁盘被这个容器执行的爆满,导致其它应用不能用,那怎么处理?

  • 答:可以在/var/lib/docker/containers中可以查看到容器的运行文件,找到死循环的容器,进入到有一个json.log文件,这个文件为日志文件,可以使用echo " " >json.log 这个文件中,可以临时解决磁盘压力的问题。直接删除解决不了。但是过段时间,还是会导致压力大,那怎么处理?
  • 可以写一个脚本,定期crontab -e 执行该脚本,相当于定时清空。
#!/bin/bash
logs=$(find /var/lib/docker/containers/  -name *-json.log*)
for log in $logs
do
cat /dev/null > $log
done===##或者====
#设置docker日志文件数量及每个日志大小
vim /etc/docker/daemon.json
{"registry-mirrors":["http://f613ce8f.m.daocloud.io"] //加速器"log-driver":"json-file",  //定义日志格式,"log-opts":{"max-size":"500M","max-file":"3"}  //设置日志文件最大500M,最多3个,如果3个都满了,它会自动删除一个,然后继续装。
}systemctl damon-reload && systemctl restart docker
#重新加载一下

5、停止容器

docker stop 【容器ID】或
docker kill 【容器ID】#stop和kill的区别
使用kill是直接关闭这个容器的进程,如果有正在运行的文件,那么可能造成数据丢失。
使用stop是给容器发出一个退出的信号,相当于给容器一些缓冲的余地。保存好自己的文件,然后再关闭。

6、查看容器IP以及详细信息

#要查看IP地址的化,需要开启一个容器,才会进行分配IP地址docker inspect 【容器ID】
#查看指定id的详细信息

7、进入容器

  • docker run -it 会创建前台进程,但是会输入exit后会终止进程

  • dcoker attach 会通过连接stdin,连接到容器内输入输出流,会再输出exit后终止容器操作

  • docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,但不影响容器运行。

需要进入容器进行命令操作时,可以使用docker exec 命令进入运行着的容器

格式:docker exec -it 容器ID/名称 /bin/bash

  • -i :选项表示让容器的输入保持打开
  • -t :选项表示让Docker分配一个伪终端
#进入容器的三种方式#1、使用run进入,可以使用ctrl+d退出,直接退出终端
docker run -it centos:7 /bin/bash#2、永久性进入,退出后还是运行状态
docker run -itd centos:7 /bin/bash  或者 dockers start 【容器id】   
#需要先运行容器
docker exec -it 【容器ID】 /bin/bash3、③docker attach,会通过连接stdin,连接到容器内输入输出流,公在输入exit后终止容器进程(临时性的,不推荐)

 1、一次性进入

2、永久进入

  • 需要先开启一个容器,才能使用exec进入

8、容器导出和导入

用户可以将任何一个Docker容器从一台机器迁移得到另一台机器,再迁移的过程中,可以使用docker export 命令将已经创建号的容器导出为文件,无论这个容器是处于运行状态还是停止状态均可导出。

可以将导出文件传输到其它机器,通过相应的导入命令实现容器的迁移。

1、导出

docker export 【容器id】 > centos_7

使用scp将本地容器备份拷贝到另一台机器上

2、导入

注意!!这个跟导入镜像不能通用,这个是容器的导入,虽然导入进去也是存在镜像中,但是它是有以前容器中的数据的,镜像是存储干净的东西

#方法一
docker import centos_7 centos:v1#方法二
cat centos_7 |docker import - centos:v2

方法二

方法一

9、将容器内部的文件传出,将本地文件传入

docker 【源文件路径】 【目标文件路径】
docker cp /opt/docker.sh 【容器id】:/opt/hahaha
#将本地文件导入到容器中docker cp 【容器id】:/opt/ydq ./
#将容器内的ydq文件导出到本地

本地文件导入到容器

容器内文件导出

10、删除容器

docker rm 【容器id】
#不能删除运行状态的容器,如果要删除,需要加-f强制删除,或者停止后删除docker rm -f 【容器名称】
#基于容器名称删除docker rm -f `docker ps -q`
#删除所有运行的容器docker rm -f `docker ps -aq`
#删除所有的容器docker ps -a | awk 'NR>=2{print "docker rm "$1}'| bash
#删除所有容器,不包括运行的容器for i in `docker ps -a |grep -i exit | awk '{print $1}'`;do docker rm -f $i;done
#过滤出关闭状态的容器,并删除

docker rm 【容器id】

docker rm -f 【容器名称】

docker rm -f `docker ps -q`

docker rm -f `docker ps -aq`

docker ps -a | awk ‘{print "docker rm "$1}’| bash

for i in `docker ps -a |grep -i exit | awk ‘{print $1}’`;do docker rm -f ​$i;done

11、动态查看运行容器资源消耗

docker stats

12、查看docker的日志信息

docker logs 【容器ID】
#查看指定容器的日志信息

三、总结

镜像操作

docker iamges   #查看docker镜像docker inspect   【id号】  #查镜像的详细信息docker tag nginx:lastest  nginx:web     #修改docker的标签(见名知意)#==========删除镜像
docker rmi nginx:web     #删除标签为web的nginx镜像(删除标签指定的镜像)
或者
docker rmi 【镜像id】   #彻底删除该镜像
#注意:如果该镜像一个呗容器使用,正确做法先删除该镜像的所有容器,再删除镜像#=====导入导出镜像
存储镜像----》将镜像保存为本地文件
docker save -o 【存储文件名】 【存储的镜像】
docker save -o  nginx nginx:latest  #实例(保存本地目录)导入镜像----》将本地文件导入到容器
docker load < nginx    #存入到容器中
或
docker load -i nginx   #也可以存储到容器中#=====上传镜像====演示上传阿里云和docker hub
默认上传到docker Hub官方公共仓库,需要注册使用公共仓库的账号。https://hub.docker.com可以使用docker login命令来输入用户名、密码和邮箱来完成注册和登录。
在上传镜像之前,还需要先对本地镜像添加新的标签,然后再使用docker push命令进行上传。
docker tag nginx:latest  ydq/nginx:web    #修改docker标签
docker iamges
docker login       #登录到docker的hub
docker push  【上传的镜像】    #上传镜像#=======下载镜像
docker pull nginx   #下载nginx镜像

容器操作

===#先创建后启动
docker create -it nginx:latest /bin/bash    #创建容器docker ps -a    #查看所有容器
docker ps      #查看运行的容器docker start 【镜像id】   #启动一个镜像========#创建并启动
docker run 【镜像名】 /usr/bin/bash -c ls /  #创建一个容器并启动镜像(本地没有将从仓库下载)(运行结束就退出)docker run -d 【镜像名】 /usr/bin/bash -c "while true;do echo hello;done"
#后台运行(必须要加-d,不然容器无法启动)(会造成cpu100%)docker run -itd -name test1(名称) 【镜像名】 /bin/bash
#创建容器并持续运行容器(-name:指定名称 )======#停止容器
docker stop 【容器id】   #容器id用docker ps -a 查看=====#容器的进入
docker exec -it 【容器id】 /bin/bash  #进入一个启动的容器
或
docker run -it centos:7 bash #不加-d选项会创建容器后直接进入容器,但是退出容器,容器也会停止=====#本机文件与容器互传
docker cp  ydq.txt  【容器id】:/opt   #将本地文件传到容器中的/opt目录下docker cp 【容器id】:/opt/ydq.txt /home/ydq2.txt #将容器中的文件拷贝到本地======#容器的导出导入
docker export 【容器id】 > nginx.tar   #将容器导出到本地
cat nginx.tar |docker import - nginx:web  #将本地导入到容器======#容器的删除
docker rm [-f] 【容器id】   #删除容器(加-f删除正在运行的容器)docker ps -a |awk 'NR>=2{print "docker stop" $1}'|bash 
......

简单面试题

#1、如果镜像优化?
有效减少镜像大小(dockerfile 优化方向-》对于部分企业而言,是一种升阶面试题)#2、怎么看当下有多大号容器,怎么看当下所有容器占用的I/O有多少,占用内存多少?
使用docker stats命令查看#3、容器有哪些状态?
Docker容器可以有七种状态:
已创建(create)
运行(up)
已暂停(paused)
重新启动(restarting)
已退出(exited)正常退出为(exited(0)),人工干预停止会有(exited(137))
死亡(dead)
迁移(removing)#4、overlay2由哪几部分组成 ?
LowerDir
MergedDir
UpperDir
WorkDi

相关文章:

【docker】docker的基础命令

基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像&#xff0c;若没有指定标签&#xff0c;则下载最新的版本&#xff0c;也就是标签为: lat…...

RocketMq 主题(TOPIC)生产级应用

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…...

队列实现栈VS栈实现队列

目录 【1】用队列实现栈 思路分析 ​ 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…...

C/C++: 统计整数

【问题描述】 输入若干个整数&#xff0c;统计出现次数最多的那个整数。如果出现最多的整数有两个以上&#xff0c;打印最早输入的那个整数。 【输入形式】 从标准输入读取输入。第一行只有一个数字N&#xff08;1≤N≤10000&#xff09;&#xff0c;代表整数的个数。以后的N行…...

docker容器生成镜像并上传个人账户

登录到 Docker Hub 账户&#xff1a; docker login这将提示你输入你的 Docker Hub 账户名和密码。 为容器创建镜像 docker commit <容器名或容器ID> <你的用户名>/<镜像名:标签>例子 docker commit my_container yourusername/my_image:latest推送镜像到…...

hdlbits系列verilog解答(exams/m2014_q4g)-48

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本次我们将一次创建多个逻辑门,对两个输入a和b通过组合逻辑实现七种不同的输出: out_and: a and bout_or: a or bout_xor: a xor bout_nand: a nand bout_nor: a nor bout_xnor: a xnor bout_anotb: a and-no…...

在vue或者react或angular中,模板表达式中的箭头函数是无效的吗?为什么无效?

出现此问题的背景&#xff1a; 我在Angular项目中对一个标签属性绑定了一个箭头函数&#xff0c;编译报错。 在vue或者react或angular中&#xff0c;模板表达式中的箭头函数是无效的吗&#xff1f; 在 Vue、React 或 Angular 中&#xff0c;模板表达式中的箭头函数是无效的。…...

C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1.lambda表达式1.1.仿函数的使用1.2.lambda表达式的语法1.3.lambda表达式的使用…...

MATLAB算法实战应用案例精讲-【数模应用】漫谈机器学习(四)(附实战案例及代码实现)

目录 机器学习学习路线 学习编写抽象类 固定随机数种子 先加载少量数据...

JavaScript 中松散类型的理解

JavaScript 是一种动态类型语言&#xff0c;它的松散类型是其独特的特性之一。本文将深入探讨 JavaScript 中松散类型的概念以及如何在代码中应用。 引言 JavaScript 是一种强大而灵活的语言&#xff0c;它的松散类型使得变量的类型可以在运行时动态改变。这为开发人员带来了…...

java基于springboot公益帮学网站 新闻发布系统的设计与实现vue

以Java为开发平台&#xff0c;综合利用Java Web开发技术、数据库技术等&#xff0c;开发出公益帮学网站。用户使用版块&#xff1a;可以选择注册并登录&#xff0c;可以浏览信息、可以网上互动、发布文章、内容推荐等。后台管理员管理版块&#xff1a;以管理员身份登录网站后台…...

VMware 安装 Centos7 超详细过程

VMware 安装 Centos7 超详细过程 分类 编程技术 1.软硬件准备 软件&#xff1a;推荐使用 VMware&#xff0c;我用的是 VMware 12 镜像&#xff1a;CentOS6 ,如果没有镜像可以在阿里云下载 centos安装包下载_开源镜像站-阿里云 硬件&#xff1a;因为是在宿主机上运行虚拟化软…...

03:2440--UART

目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉​编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…...

Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程

在数字化时代的激流中&#xff0c;Vatee万腾以其独特的科技冒险精神&#xff0c;引领着一场前所未有的数字化征程。这不仅仅是一次冒险&#xff0c;更是对未知的深度探索&#xff0c;将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统&#xff0c;积极探索未知的可能…...

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…...

Linux C语言 26-可变参数

Linux C语言 26-可变参数 本节关键字&#xff1a;可变参数、va_list、va_arg、va_end 相关C库函数&#xff1a;va_list、va_arg、va_end 什么是可变参数&#xff1f; C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时&#xff0c;使用“char *format, …...

Gin 学习笔记02-参数获取

Gin 参数获取 1、获取url 参数2、获取动态 url 参数3、获取 form 表单数据 1、获取url 参数 Query()GetQuery()QueryMap()DefaultQuery() package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func _query(c *gin.Context) {// 1…...

Uniapp Vue3 基础知识点附带实例

包括数据绑定和计算属性、条件渲染和列表渲染、事件处理、表单输入处理、生命周期钩子、自定义指令和过滤器、路由和导航以及状态管理&#xff08;如Vuex&#xff09;&#xff1a; <template><div><!-- 条件渲染 --><div v-if"showMessage">…...

【迅搜03】全文检索、文档、倒排索引与分词

全文检索、文档、倒排索引与分词 今天还是概念性的内容&#xff0c;但是这些概念却是整个搜索引擎中最重要的概念。可以说&#xff0c;所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的&#xff0c;所以不要以为标题上有四个名词就感觉好…...

MySql之索引,视图,事务以及存储过程举例详解

一.数据准备 数据准备可参考下面的链接中的数据准备步骤 MySql之内连接&#xff0c;外连接&#xff0c;左连接&#xff0c;右连接以及子查询举例详解-CSDN博客 &#xff08;如有问题可在评论区留言&#xff09; 二.存储过程 1.定义 存储过程 PROCEDURE &#xff0c;也翻译…...

【零日对抗样本防御白皮书】:基于动态梯度掩蔽+可信执行环境(TEE)的AIAgent双模防护架构(附GitHub开源验证代码)

第一章&#xff1a;AIAgent架构中的对抗样本防御 2026奇点智能技术大会(https://ml-summit.org) 在AIAgent系统中&#xff0c;对抗样本并非边缘威胁&#xff0c;而是影响决策链路完整性的结构性风险。当多模态感知模块&#xff08;如视觉编码器、语音转文本模型&#xff09;与…...

Spring Boot IoC 实践(二):理解 Bean 的创建与容器管理过程

一、前言在上一篇文章中&#xff0c;我们初步了解了 Spring Boot 启动时如何创建 IoC&#xff08;控制反转&#xff09;容器。 这篇文章通过一个简单示例&#xff0c;从代码与日志输出两个角度&#xff0c;带你理解&#xff1a;Spring Boot 在何时创建 Bean&#xff1f;IoC 容器…...

为什么Alfred Workflows能极大提升你的工作效率?7个真实案例分享

为什么Alfred Workflows能极大提升你的工作效率&#xff1f;7个真实案例分享 【免费下载链接】alfred-workflows Collection of Alfred workflows 项目地址: https://gitcode.com/gh_mirrors/alfr/alfred-workflows Alfred Workflows是一款强大的效率工具集合&#xff0…...

8.4 启动优化与闪屏

App 冷启动速度直接影响用户留存。Flutter 项目的启动优化涉及原生闪屏配置、Dart 代码初始化策略和渲染首帧时间缩短。一、Native Splash Screen 1.1 flutter_native_splash&#xff08;推荐&#xff09; dependencies:flutter_native_splash: ^2.4.0# pubspec.yaml 或 flutte…...

通义千问2.5-7B低成本上线:共享GPU资源部署案例

通义千问2.5-7B低成本上线&#xff1a;共享GPU资源部署案例 想体验最新最强的开源大模型&#xff0c;但被动辄几十GB的显存需求和昂贵的专业显卡劝退&#xff1f;这可能是很多开发者和创业团队面临的现实困境。今天&#xff0c;我们就来分享一个极具性价比的解决方案&#xff…...

20个核心AI概念轻松入门:收藏这份小白友好指南,开启大模型学习之旅!

如果你曾尝试学习AI&#xff0c;大概率至少有过一次这样的感受……“这到底在讲什么&#xff1f;” 术语太多。 工具太多。 网上所有人都说得好像理所当然。 学习AI很容易让人感到崩溃。 尤其如果你不是直接从事这一行&#xff0c;几乎像在学一门全新的语言。 但我逐渐意识到一…...

5月19日起Roblox更新游戏发布要求,创作者反响不一!

Roblox发布新游戏要求与评估流程5月19日起&#xff0c;Roblox将对发布模式做出更改&#xff0c;增加公开发布游戏的新要求&#xff0c;以保障平台网络安全&#xff0c;为16岁以下用户营造更安全的环境。创作者可在账户设置中查看自己是否符合发布条件。新举措的背景与目的每天有…...

面试官:聊聊Redis中RDBAOF持久化原理!

Redis 中数据的持久化前言我们知道 Redis 是内存数据库&#xff0c;所有操作都在内存上完成。内存的话&#xff0c;服务器断电&#xff0c;内存上面的数据就会丢失了。这个问题显然是需要解决的。Redis 中引入了持久化来避免数据的丢失&#xff0c;主要有两种持久化的方式 RDB …...

收藏!小白也能看懂:给AI装上“外接大脑“(RAG技术入门指南)

本文用大白话和比喻解释了RAG&#xff08;检索增强生成&#xff09;技术&#xff0c;即如何让AI接入企业内部知识库&#xff0c;解决ChatGPT等模型缺乏业务数据的问题。核心流程包括文档向量化存储、相似内容检索和生成回答&#xff0c;对比微调成本更低、更新更实时。适合企业…...

光影的艺术:从入门到电影级宣传片的布光与器材全解析

在视频制作的领域里&#xff0c;画面质感往往决定了观众对内容的留存率。而决定画面质感的两个核心支柱&#xff0c;便是“光”与“器”。无论是企业宣传片、品牌形象片&#xff0c;还是大型会议记录&#xff0c;不同的预算级别对应着截然不同的布光逻辑与器材选择。本文将深入…...