4.docker容器编排(docker compose 与 docker swarm)

本文目录

  • 1.容器编排
  • 2.Docker Compose
    • 1.Docker Compose 安装
    • 2.Docker Compose 示例
      • 1.使用 docker-compose 启动 nginx
      • 2.docker compose 常用命令
      • 3.校验 docker-compose.yml 是否有错误
      • 4.创建服务,启动容器
      • 5.弹性伸缩<扩缩容>
  • 3.Docker Swarm
    • 1.Swarm 架构图
    • 2.Swarm 节点说明
    • 3.Swarm 集群部署
      • 1.了解docker swarm 命令
      • 2.初始化集群
      • 3.work节点加入集群
      • 4.查看swarm集群节点信息
    • 4.部署服务命令
    • 5.部署服务
    • 6.弹性伸缩<扩缩容>
      • 缩容
    • 7.节点离开swarm集群
    • 8.删除离开的节点
    • 9.离开的节点,再次加入swarm集群

1.容器编排

容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。

实例:一个java程序,依赖了mysql,redis,要想把 java 程序运行起来,则必须要先启动 mysql、redis。那么这三者这件就存在了依赖关联。
 
容器编排存在的意义:

  • 依赖管理,当一个容器必须在另一个容器运行完成后,才能运行时,就需要进行依赖管理
  • 副本数控制,容器有时候也需要集群,快速的对容器集群进行弹性伸缩
  • 配置共享,通过配置文件统一描述需要运行的服务相关信息,自动化的解析配置内容,并构建对应的服务
     

容器编排的出现,就是让开发者可以更简单的使用容器,省去频繁的写各种命令,docker 容器编排的出现,就类似 shell 脚本,一键搞定!

容器编排,主要有两种模式:

  • 基于Docker Compose(单机)
  • 基于Swarm(集群)

2.Docker Compose

  Docker Compose 是单机环境下的容器编排。
 
  有的时候我们会需要涉及到在一台机器部署多个容器,那么此时再手动的每次输入相关的一堆配置命令再来启动容器,还是产生了很多无意义的重复性劳动。针对单机的多容器部署的情况,Docker 为我们提供了一个单机版本的服务编排工具 docker-compose
 
  Docker-Compose 可以高效便捷的管理单机上运行的所有容器,它通过 yaml 配置文件的方式完成之前执行 docker run 命令所设置的所有参数,你可以先针对单机上的所有容器进行相关配置,配置完成后即可使用 docker-compose 对单机多容器进行高效的管理
 
  docker compose 容器编排,就是基于docker-compose.yml配置文件进行的容器编排。只要学会如何编写这个配置文件,就会用这个玩意了。

在这里插入图片描述

1.Docker Compose 安装

注意:需要注意的是,docker-compose 与docker有版本对应关系,因此在使用docker-compose时需要选择与已安装的docker版本相对应的docker-compose版本,否则可能会出现不兼容或无法正常工作的问题。但是!我在官网一致没有找到 docker 和 docker-compose 的对应关系表啊,有知道的小伙伴能评论发我一下吗??我只找到个 docker compose 发行版本,依赖的 docker 需要升级的版本,docker compose 发行版本地址:https://docs.docker.com/compose/release-notes。如下图所示:
 
在这里插入图片描述
因为 docker 使用的是最新版本:24.0.6,所以 docker compose 也使用了最新版本 2.21.0
 
还有一个对应关系表,在这里,也没有太看懂。地址:

  • https://docs.docker.com/compose/compose-file/compose-file-v2
  • https://docs.docker.com/compose/compose-file/compose-file-v3

Docker Compose 下载地址:https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-linux-x86_64
 
在这里插入图片描述

# step 1:下载 docker compose 最新版本
curl -L "https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# $(uname -s)  系统内核,即:linux
# $(uname -m)  系统架构,即:x86_64# step 2:将可执行权限应用于二进制文件
sudo chmod +x /usr/local/bin/docker-compose# step 3:创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose# step 4:测试是否安装成功
docker-compose --version

在这里插入图片描述

2.Docker Compose 示例

# docker 启动 nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose  nginx
# 命令解释:
# -d  后台运行
# --restart=always   出现异常后总是自动重启
# --network xxx  自定义网络
# -v /www/abc:/usr/share/nginx/html  将[本地目录/www/abc]与[容器目录/usr/share/nginx/html] 进行数据卷绑定
# -e APP_ENV=dev  添加环境变量
# -p 80:80  端口映射
# --name  容器名称
# nginx  镜像名

上述命令,就可以在 docker 中启动一个 nginx 容器了。

  • 在不使用来回复制、粘贴的方式,如何将这条命令复用呢?
  • 这个命令还不算太长,如果命令更长的怎么办呢?
     

这样就需要用到 docker compose 了。

1.使用 docker-compose 启动 nginx

创建一个/opt/docker/nginx文件夹,在nginx文件夹下创建一个 docker-compose.yml 文件,进入文件,就可以编写 docker compose了

参考官网进行编写docker compose即可。因为docker compose的配置项太多了。截至 2023-09-14,使用的docker 24.0.6docker compose 2.21.0,所以此处直接使用 Compose V3版本。地址:https://docs.docker.com/compose/compose-file/compose-file-v3
 
配置超级多,根本记不住。所以参考官网来写就好了。
 
如果是一个普通的镜像,更多的关注【服务services】、【网络networks】、【数据卷volumes】这三个配置项就可以了
 
在这里插入图片描述

# docker 启动 nginx命令:
docker run -d --restart=always --network xxx -v /www/abc:/usr/share/nginx/html -e APP_ENV=dev -p 80:80 --name nginx-compose  nginx

上面的命令,转成 nginx compose 如下:

version: "3.8"
services: nginx-demo-compose:contianer_name: "nginx-compose"image: nginxrestart: alwaysnetworks: nginx_netvolumes:- /www/abc:/usr/share/nginx/htmlenvironment:- APP_ENV=devports:- 80:80networks:nginx_net:ipam:driver: defaultconfig:- subnet: "172.16.238.0/24"

2.docker compose 常用命令

命令说明
build先构建完镜像,然后构建一个docker服务(如果开始就已经是个镜像了,则会跳过,命令不生效)
config规范、验证并查看 compose 文件,验证通过后,控制台会返回 compose 文件内容
cp在容器和本地文件系统之间复制文件/文件夹
create为 compose 中的 service 服务创建容器。
down停止并删除容器、网络
events从容器接收实时事件
exec在运行中的容器中执行命令
images列出创建的容器使用的镜像
kill强制停止服务容器
logs查看容器的日志输出
ls列出正在运行的 compose 项目
pause暂停 service 服务
port输出端口绑定的公共端口
ps列出容器
pull拉取 service 服务镜像
push推送 service 服务镜像
restart重启 service 服务容器
rm删除停止的服务容器
run在服务上运行一次性命令
start启动服务
stop停止服务
top显示正在运行的进程
unpause取消暂停服务
up创建并启动一个容器
version显示 Docker Compose 版本信息
wait等待阻塞直到第一个服务容器停止

提示: 更详细命令说明,使用 docker compose [命令] --help 了解。比如:docker compose up --help

扩缩容命令:

命令说明
docker compose up --scale 服务名=num扩容/缩容,服务名为compose文件服务名,num 为数量

3.校验 docker-compose.yml 是否有错误

# 进入/opt/docker/nginx 目录,在docker-compose.yml同级下,执行如下命令
docker compose config

在这里插入图片描述

4.创建服务,启动容器

进入/opt/docker/nginx 目录下,在docker-compose.yml同级目录下,开始操作

# step 1:创建服务(此处也可以启动compose中的特定服务:docker compose create 服务名)
docker compose create
# step 2:查看服务是否创建成功
docker compose ps -a
# step 3:后台启动容器
docker compose up -d

如图所示:

在这里插入图片描述

5.弹性伸缩<扩缩容>

扩缩容命令,如下:

docker compose up -d --scale 服务名=num

扩缩容注意:

  • 需要删除 container_name (docker 不允许多个容器具有相同的名称)
  • 修改 port 端口映射(一个服务只能一个端口,会提示端口占用问题)

修改后的 docker-compose.yaml 如下:

version: "3.8"
services: nginx-demo:image: nginxrestart: alwaysnetworks: - nginx_netvolumes:- /www/abc:/usr/share/nginx/htmlenvironment:- APP_ENV=devports:- 80   # 此处80代表容器中的80端口,映射到本地的随机端口networks:nginx_net:ipam:driver: defaultconfig:- subnet: "172.16.238.0/24"

修改配置信息后,执行 docker compose up -d,便会重新读取compose配置,启动容器

在这里插入图片描述

3.Docker Swarm

Swarm 也是需要提前安装好 Docker Compose !!!
 
  Swarm 是 Docker 公司推出的用来管理 docker 集群的平台,几乎全部用GO语言来完成的开发的, 它是将一群 Docker 宿主机变成一个单一的虚拟主机,Swarm 使用标准的 Docker API 接口作为其前端的访问入口,换言之,各种形式的DockerClient(compose, docker-py 等) 均可以直接与 Swarm 通信,甚至 Docker 本身都可以很容易的与 Swarm 集成,这大大方便了用户将原本基于单节点的系统移植到 Swarm 上,同时Swarm 内置了对 Docker 网络插件的支持,用户也很容易的部署跨主机的容器集群服务。
 
  Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务对于微服务的部署,显然 Docker Swarm 会更加适合
 
  从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,所以 swarm 我们无需手动安装。
 
  Swarm deamon只是一个调度器(Scheduler) + 路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,放Swarm重新恢复运行之后,他会收集重建集群信息。https://github.com/docker/swarm
 
  k8s 的出现早于 swarm,所以 swarm 的诞生,就是为了与 k8s 竞争,k8s 已经很成熟了,所以目前市场上用的 k8s 的还是挺多的,swarm 相对来说用的还不是提多。

1.Swarm 架构图

在这里插入图片描述

2.Swarm 节点说明

  运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
 
  Swarm节点分为管理 (manager) 节点工作 (worker) 节点
 
  管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
 
  工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。worker节点之间,通过control plane进行通信,这种通信使用gossip协议,并且是异步的。
 
  来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

3.Swarm 集群部署

三台机器如下:每台机器都安装好 dockerdocker-compose

IP角色
192.168.204.101manager 管理节点
192.168.204.102worker 工作节点
192.168.204.103worker 工作节点

1.了解docker swarm 命令

# 查看docker swarm 命令
docker swarm --help[root@localhost ~]# docker swarm --helpUsage:  docker swarm COMMANDManage SwarmCommands:init        Initialize a swarmjoin        Join a swarm as a node and/or managerRun 'docker swarm COMMAND --help' for more information on a command.
# 查看 swarm 集群状态
docker info
# 查看 swarm 集群节点信息
docker node ls

2.初始化集群

# 登录管理节点,并执行如下命令
docker swarm init --advertise-addr 192.168.204.101# 返回如下信息
[root@localhost ~]# docker swarm init --advertise-addr 192.168.204.101
Swarm initialized: current node (2tlpn6ywqh9kms9ymgndpoinc) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3.work节点加入集群

复制初始化集群返回的命令,分别在 两个work 节点执行,将work节点加入 swarm 集群。
 
记得:关闭防火墙,或者开放端口 2377!!!
先关闭防火墙:systemctl stop firewalld
然后永久关闭防火墙:systemctl disable firewalld

# 加入swarm集群命令
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377

加入成功如图所示:

在这里插入图片描述

4.查看swarm集群节点信息

进入 manager 管理节点,通过 docker node ls 查看集群节点信息。work 节点无法查看哦!

在这里插入图片描述

4.部署服务命令

在管理节点,通过命令 docker service 部署服务,通过docker service --help 查看详细命令

命令说明
create创建一个新的服务
inspect展示一个/多个服务的详细信息
logs查看服务/任务的日志
ls显示所有service服务
ps显示一个/多个服务的所有task
rm删除一个/多个服务
rollback恢复service服务的配置信息
scale弹性扩缩容service服务
update更新service服务

5.部署服务

在管理节点,通过命令 docker service 部署服务,此处来部署一个 nginx 服务

# 部署一个nginx服务
docker service create --replicas 1 -p 80:80 --name nginx_swarm nginx
# --replicas 1  一个副本
# -p 80:80 端口映射
# --name 自定义名称

在这里插入图片描述

# manager管理节点, 查看所有service服务
docker service ls

在这里插入图片描述

# 在 manager 和 work 节点,都执行 docker ps 命令,查看服务是否启动成功
docker ps

在这里插入图片描述

# 访问服务
curl 192.168.204.101

在这里插入图片描述

如果要想在管理端去访问 curl 192.168.204.202 和 192.168.204.203,也显示服务正常。
需要先扩容至副本数为 3,即可。
 
提示:另一种情况:副本数为3后,现在指定节点203退出swarm集群,此时 3 个副本就会重新分配(比如:201机器2个副本,202机器1个副本,如果此时203节点重新加入后,即使203这个节点上没有这个副本,集群会帮我们自动分发服务,你同样还是可以访问curl 192.168.204.203 成功)

6.弹性伸缩<扩缩容>

以下命令,在 manager 管理节点执行操作

# 副本数扩容(nginx_swarm:服务名)
docker service update --replicas 3 nginx_swarm

错误提示:error creating external connectivity network: Failed to Setup IP tables: U
解决方案:关闭防火墙后,需要重启 docker 服务
命令:service docker restart

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

缩容

修改 --replicas 的个数即可。

7.节点离开swarm集群

# 哪个节点要离开集群,在指定节点执行如下命令
docker swarm leave

管理节点查看节点信息,可以看到有个节点已经Down
在这里插入图片描述

8.删除离开的节点

以下命令,在 manager 管理节点执行操作

# 删除节点(nodeId 通过 docker node ls 查看)
docker node rm [nodeId]

在这里插入图片描述

9.离开的节点,再次加入swarm集群

在要加入集群的节点执行如下命令:

# 再次执行刚才的,加入swarm集群命令即可
docker swarm join --token SWMTKN-1-3gcmbp3voxo05kw0q4lfe972a1uy7bbch59aabu55i3dnb2eeo-3a26jdpdkmdmvjuj54ki9c14h 192.168.204.101:2377

在这里插入图片描述


本文结束,谢谢

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

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

相关文章

2023.9.6 Redis 的基本介绍

目录 Redis 的介绍 Redis 用作缓存和存储 session 信息 Redis 用作数据库 消息队列 消息队列是什么&#xff1f; Redis 用作消息队列 Redis 的介绍 特点&#xff1a; 内存中存储数据&#xff1a;奠定了 Redis 进行访问和存储时的快可编程性&#xff1a;支持使用 Lua 编写脚…

【Flink】 FlinkCDC读取Mysql( DataStream 方式)(带完整源码,直接可使用)

简介: FlinkCDC读取Mysql数据源,程序中使用了自定义反序列化器,完整的Flink结构,开箱即用。 本工程提供 1、项目源码及详细注释,简单修改即可用在实际生产代码 2、成功编译截图 3、自己编译过程中可能出现的问题 4、mysql建表语句及测试数据 5、修复FlinkCDC读取Mys…

软件测试/测试开发丨Web自动化—capability参数配置 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27336 一、capability概述 capability是webdriver支持的标准命令之外的扩展命令&#xff08;配置信息&#xff09;配置web驱动属性&#xff0c;如浏览器名…

自动化测试开发 —— 如何封装自动化测试框架?

封装自动化测试框架&#xff0c;测试人员不用关注框架的底层实现&#xff0c;根据指定的规则进行测试用例的创建、执行即可&#xff0c;这样就降低了自动化测试门槛&#xff0c;能解放出更多的人力去做更深入的测试工作。本篇文章就来介绍下&#xff0c;如何封装自动化测试框架…

不知道有用没用的Api

encodeURIComponent(https://www.baidu.com/?name啊啊啊) decodeURIComponent(https%3A%2F%2Fwww.baidu.com%2F%3Fname%3D%E5%95%8A%E5%95%8A%E5%95%8A) encodeURI(https://www.baidu.com/?name啊啊啊) decodeURI(https://www.baidu.com/?name%E5%95%8A%E5%95%8A%E5%95%8A) …

Mojo 语言官网

Mojo面向 AI 开发者的新型编程语言&#xff0c;无缝支持CPU、GPU&#xff0c;兼容Python&#xff0c;跟Python类似的语法&#xff0c;但是比Python快68000倍。目前Mojo仅支持Ubuntu&#xff0c;暂不支持Windows和Mac&#xff0c;可以在Mojo Playground先体验一下。 Mojo 语言…

Pytorch从零开始实战03

Pytorch从零开始实战——天气识别 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——天气识别环境准备数据集模型选择模型训练数据可视化总结 环境准备 本文基于Jupyter notebook&#xff0c;使用Python3.8&#xff0c;Pytorch2.0.1cu118&…

Linux 修改SSH的显示样式,修改终端shell显示的样式,美观更改

要修改SSH的显示样式&#xff0c;您可以使用自定义的PS1&#xff08;提示字符串1&#xff09;变量来更改命令行提示符的外观。在您的情况下&#xff0c;您想要的格式似乎包括日期和时间&#xff0c;以及当前目录。以下是一个示例PS1设置&#xff0c;可以实现您所描述的样式&…

【搭建私人图床】本地PHP搭建简单Imagewheel云图床,在外远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

【Spring面试】三、Bean的配置、线程安全、自动装配

文章目录 Q1、什么是Spring Bean&#xff1f;和对象有什么区别Q2、配置Bean有哪几种方式&#xff1f;Q3、Spring支持的Bean有哪几种作用域&#xff1f;Q4、单例Bean的优势是什么&#xff1f;Q5、Spring的Bean是线程安全的吗&#xff1f;Q6、Spring如何处理线程并发问题&#xf…

【已解决】您所使用的密钥ak有问题,不支持jsapi服务,可以访问该网址了解如何获取有效密钥。

您所使用的密钥ak有问题&#xff0c;不支持jsapi服务&#xff0c;可以访问该网址了解如何获取有效密钥。详情查看&#xff1a;http://lbsyun.baidu.com/apiconsole/key#。 问题 百度密钥过期 思路 注册成为开发者 如果还没注册百度地图api账号的&#xff0c;点击以后就进入…

【深度学习】 Python 和 NumPy 系列教程(廿二):Matplotlib详解:2、3d绘图类型(8)3D饼图(3D Pie Chart)

一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0c;并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括Web开发、数据分…

WebRTC 源码 编译 iOS端

1. 获取依赖工具 首先&#xff0c;确保你已经安装了以下工具&#xff1a; GitDepot ToolsXcode&#xff08;确保已安装命令行工具&#xff09; 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中&#xff1a; /path/to/depot_tools 替换为自己的路径…

unity C#客户端与服务器程序

客户端和服务器公共的脚本 OSC.cs // This is version 1.01(2015.05.27) // Tested in Unity 4 // Most of the code is based on a library for the Make Controller Kit1/* using UnityEngine; using System; using System.Collections; using System.Threading; using Syst…

Furion api npm web vue混合开发

Furion api npm web vue混合开发 Furion-api项目获取swagger.json文件复制json制作ts包删除非.ts文件上传到npm获取npm包引用 Furion-api项目获取swagger.json文件 使用所有接口合并的配置文件 复制json制作ts包 https://editor.swagger.io 得到 typescript-axios-clien…

怎么科学管理固定资产呢

在当今的商业环境中&#xff0c;固定资产的管理是企业成功的关键因素之一。然而&#xff0c;传统的固定资产管理方法往往过于繁琐&#xff0c;缺乏创新&#xff0c;导致资源的浪费和效率的低下。因此&#xff0c;我们需要一种新的、更加科学的方法来管理我们的固定资产。本文将…

C++多线程的用法(包含线程池小项目)

一些小tips: 编译命令如下&#xff1a; g 7.thread_pool.cpp -lpthread 查看运行时间&#xff1a; time ./a.out 获得本进程的进程id&#xff1a; this_thread::get_id() 需要引入的库函数有&#xff1a; #include<thread> // 引入线程库 #include<mutex> //…

Ui自动化测试上传文件方法都在这里了 ~

前言 实施UI自动化测试的时候&#xff0c;经常会遇见上传文件的操作&#xff0c;那么对于上传文件你知道几种方法呢&#xff1f;今天我们就总结一下几种常用的上传文件的方法&#xff0c;并分析一下每个方法的优点和缺点以及哪种方法效率&#xff0c;稳定性更高 被测HTML代码…

睿趣科技:抖音开店前期需要准备什么

抖音作为全球最受欢迎的短视频平台之一&#xff0c;已经成为了许多年轻人的创业和赚钱的机会。如果你计划在抖音上开店&#xff0c;那么在正式开业之前&#xff0c;有一些重要的准备工作是必不可少的。下面就是抖音开店前期需要准备的关键步骤和注意事项。 确定你的目标和产品&…

Matlab图像处理-三原色

三原色 根据详细的实验结果&#xff0c;人眼中负责颜色感知的细胞中约有65%对红光敏感&#xff0c;33%对绿光敏感&#xff0c;只有2%对蓝光敏感。正是人眼的这些吸收特性决定了所看到的彩色是一般所谓的原色红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;和蓝&…