9.SELinux

目录

1. 概述

1.1. 概念

1.2. 作用:

1.3. SELinux与传统的权限区别

2. SELinux工作原理

2.1. 名词解释

2.1.1. 主体(Subject)

2.1.2. 目标(Object)

2.1.3. 策略(Policy)

2.1.4. 安全上下文(Security Context)

2.2. 文件安全上下文查看

2.2.1. 先启用selinux

2.2.2. 命令:

3. SELinux的启动、关闭与查看

3.1. 三种配置模式

3.2. 原理图:

3.3. 模式管理

3.3.1. 查看当前模式

3.3.2. 临时开启/关闭

3.3.3. 永久关闭

3.3.4. 注意

3.4. selinux的状态

3.4.1. 命令

3.4.2. 分析

4. 修改安全上下文

4.1. chcon命令

4.1.1. 作用

4.1.2. 格式

4.1.3. 示例

4.2. restorecon命令

4.2.1. 作用

4.2.2. 格式:

4.3. semanage命令

4.3.1. 作用

4.3.2. 安装

4.3.3. 格式1:

4.3.4. 常用命令组

4.3.5. 布尔值的查询与修改:

4.4. 实验

4.4.1. 实验1

4.4.2. 实验2

4.4.3. 实验3


1. 概述

1.1. 概念

SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统,用于各个服务进程都受到约束,使其仅获取到本应获取的资源

例如,电脑上下载了一个美图软件,当您全神贯注地使用它给照片进行美颜的时候,它却在后台默默监听着浏览器中输入的密码信息,而这显然不应该是它应做的事情

1.2. 作用:

SELinux 域限制:对服务程序的功能进行限制,以确保服务程序做不了出格的事情

SELinux 安全上下文:对文件资源的访问限制,确保文件资源只能被其所属的服务程序访问

1.3. SELinux与传统的权限区别

传统的文件权限与账号的关系:属于自主访问控制DAC(Discretionary Access Control),当某个进程想要对文件进行访问时,系统就会根据该进程的所有者/用户组,并比较文件的权限,若通过权限检查,就可以访问该文件,注意:各种权限设置对root用户是无效的

SELinux的以策略规则制定特定程序读取特定文件:属于强制访问控制MAC(Mandatory Access Control),可以针对特定的进程与特定的文件资源来进行权限的控制,即使你是root在使用不同的进程 时,你所能取得的权限并不一定是root,而得要看当时该进程的设置而定,则就可以针对进程来进行访问控制

2. SELinux工作原理

2.1. 名词解释

2.1.1. 主体(Subject)

主体就是想要访问文件或目录资源的进程。

进程得到资源流程:由用户调用命令,由命令产生进程,由进程去访问文件或目录资源。

自主访问控制系统中(Linux 默认权限中),靠权限控制的主体是用户

强制访问控制系统中(SELinux 中),靠策略规则控制的主体则是进程

2.1.2. 目标(Object)

目标就是需要访问的文件或目录资源

2.1.3. 策略(Policy)

Linux 系统中进程与文件的数量庞大,限制进程是否可以访问文件的 SELinux 规则数量就更加烦琐,如果每个规则都需要管理员手工设定,那么 SELinux 的可用性就会极低,所以SELinux 默认定义了两个策略来制订规则

2个默认策略

(1)-targeted:默认策略,用于限制网络服务(dhcpd,httpd,named,nscd,ntpd,portmap, snmpd,squid,以及 syslogd),对本机系统的限制极少

(2)-mls:多级安全保护策略,该策略限制更为严格

2.1.4. 安全上下文(Security Context)

所有进程、文件和目录都有自己的安全上下文

进程是否能够访问文件或目录,就要其安全上下文是否匹配

例:找对象时,男人看作主体,女人就是目标,男人是否可以追到女人(主体是否可以访问目标),主要看两人的性格是否合适(主体和目标的安全上下文是否匹配),但两个人的性格是否合适,是需要靠生活习惯、为人处世、家庭环境等具体的条件来进行判断的(安全上下文是否匹配是需要通过策略中的规则来确定的)

关系图:

解释:

当主体(进程)访问目标(文件)时,首先和 SELinux 中定义好的策略进行匹配

若符合定义的规则,且主体的安全上下文和目标的安全上下文匹配则允许访问文件

若安全上下文比较失败,则拒绝访问,并通过 AVC(Access Vector Cache,访问向量缓存,主要用于记录所有和 SELinux 相关的访问统计信息)生成拒绝访问信息

注意:最终是否可以访问到目标文件,还要匹配产生进程(主体)的用户是否对目标文件拥有合理的rwx权限

2.2. 文件安全上下文查看

2.2.1. 先启用selinux

# 安装所需软件
[root@server ~]# yum install selinux-policy selinux-policy-targeted -y
# 编辑selinux配置文件
[root@server ~]# vim /etc/selinux/config # 先转为临时模式
SELINUX=permissive
[root@server ~]# touch /.autorelabel # 重建文件
[root@server ~]# reboot
[root@server ~]# vim /etc/selinux/config # 改为强制模式
SELINUX=enforcing
[root@server ~]# reboot

open启动方法

2.2.2. 命令:

[root@server ~]# ls -Z
system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
[root@server ~]# ll -Z
总用量 4
-rw-------. 1 root root system_u:object_r:admin_home_t:s0 1231 11月 15 12:00
anaconda-ks.cfg

2.2.3. 分析

重点为:system_u:object_r:admin_home_t:s0

安全上下文用冒号分为四个字段

身份标识(Identify):相当于账号方面的身份标识,有三种类型:

(1)root:安全上下文的身份是 root,默认会映射为unconfined_u

(2)system_u:系统用户身份,其中“_u”代表 user

(3)注意:user 字段只用于标识数据或进程被哪个身份所拥有,系统数据的 user 字段是 system_u,用户数据 user 字段是 user_u

(4)seinfo 命令

作用:查询身份、角色等信息,需要安装才可使用

[root@server ~]# yum install setools-console -y

格式:seinfo -参数

参数:

-u: 列出SELinux中所有的身份(user);
-r: 列出SELinux中所有的角色(role);
-t: 列出SELinux中所有的类型(type);
-b: 列出所有的布尔值(也就是策略中的具体规则名称);
-x: 显示更多的信息;

角色(role):表示此数据是进程还是文件或目录包含(了解就行)

(1)object_r:代表该数据是文件或目录,r代表 role(角色的意思)

(2)system_r:进程r代表 role

类型(type):

(1)

[root@server ~]# seinfo -t | more # 4991个类型

(2)最重要,进程是否可以访问文件,主要就是看进程的安全上下文类型字段是否和文件的安全上下文类型字段相匹配

(3)在默认的targeted策略中

(4)类型字段在主体(进程)的安全上下文中被称作域(domain)

(5)类型字段在目标(文件或目录)的安全上下文中被称作类型(type)

(6)进程的域与文件的类型是否匹配需要查询策略规则

灵敏度:用 s0s1s2 来命名,数字为灵敏度分级,数值越大,灵敏度越高

例:查看之前http的默认网页文件信息

[root@server ~]# yum install nginx -y
[root@server ~]# systemctl start nginx

[root@server ~]# ls -Zd /usr/share/nginx/html
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html

3. SELinux的启动、关闭与查看

3.1. 三种配置模式

enforcing:强制模式,启用SELinux,将拦截服务的不合法请求

permissive:宽容模式,启用SELinux,遇到服务越权访问时,只发出警告而不强制拦截

disabled:关闭模式,SELinux没有运行

3.2. 原理图:

3.3. 模式管理

3.3.1. 查看当前模式

[root@server ~]# getenforce

3.3.2. 临时开启/关闭

[root@server ~]# setenforce 0 # 临时关闭selinux,转为宽容模式,重启系统失效
[root@server ~]# getenforce
Permissive

[root@server ~]# setenforce 1 # 临时开启selinux,转为强制模式,重启失效
[root@server ~]# getenforce
Enforcing

3.3.3. 永久关闭

[root@server ~]# vim /etc/selinux/config

SELINUX=disabled

[root@server ~]# reboot

3.3.4. 注意

enforcing与permissive之间切换时,需要重启系统

enforcing、permissive与disabled之间切换时,必须重启系统才会生效

3.4. selinux的状态

3.4.1. 命令

[root@server ~]# sestatus

3.4.2. 分析

[root@server ~]# sestatus 
SELinux status: enabled # 是否启用
SELinuxfs mount: /sys/fs/selinux # selinux临时文件系统的挂载点
SELinux root directory: /etc/selinux # 启动目录,配置文件位置
Loaded policy name: targeted # 当前加载的策略类型
										# 策略类型
										# targeted:只保护目标进行,默认
										# minimum:少数选定进程进行保护
										# mls:多级安全保护,最高级
Current mode: enforcing # 执行的模式,重要
Mode from config file: enforcing # 配置文件的模式
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33

3.5. selinux配置文件

[root@server ~]# vim /etc/selinux/config

SELINUX=enforcing # 设置模式

SELINUXTYPE=targeted # 设置策略类型

# 注意:/etc/sysconfig/selinux文件与上述配置问价内容相同,选择一个配置即可

4. 修改安全上下文

4.1. chcon命令

4.1.1. 作用

手动修改目标的上下文策略

4.1.2. 格式

# 方法1
chcon [-R] [-t type] [-u user] [-r role] 文件名
-R:递归修改,当前目录及目录下的所有文件都同时设置
-t:后面接安全上下文件的类型字段(重要)
-u:后面接身份标识
-r:后面接角色
-v:显示变动结果
# 方法2:
chcon -R --reference=范例文件 文件名

4.1.3. 示例

例1:单独修改

[root@server ~]# touch test
[root@server ~]# ls -Z test
unconfined_u:object_r:admin_home_t:s0 test
[root@server ~]# ls -Z /etc/hosts
system_u:object_r:net_conf_t:s0 /etc/hosts
[root@server ~]# chcon -v -t net_conf_t ~/test
正在更改 '/root/test' 的安全上下文
[root@server ~]# ls -Z test
unconfined_u:object_r:net_conf_t:s0 test

例2:按照范例文件修改

[root@server ~]# touch temp
[root@server ~]# ls -Z temp
unconfined_u:object_r:admin_home_t:s0 temp

[root@server ~]# ls -Z /etc/passwd
system_u:object_r:passwd_file_t:s0 /etc/passwd

[root@server ~]# chcon -v --reference=/etc/passwd ~/temp
正在更改 '/root/temp' 的安全上下文
[root@server ~]# ls -Z temp
system_u:object_r:passwd_file_t:s0 temp

4.2. restorecon命令

4.2.1. 作用

让文件的SELinux类型恢复为默认的SELinux类型默认的SELinux类型与semanage命令有关,其参考semanage命令所查询的默认SELinux类型

4.2.2. 格式:

restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上

例1:接上例,将~/test 恢复默认类型

[root@server ~]# cd ~
[root@server ~]# ls -Z /root
[root@server ~]# ls -Z ~/test
[root@server ~]# restorecon -Rv ~/test
[root@server ~]# ls -Z ~/test

4.3. semanage命令

4.3.1. 作用

用于管理 SELinux 的策略,查询/修改/增加/删除文件的默认SELinux安全上下文,管理网络端口、消息接口等

4.3.2. 安装

[root@server ~]# yum install policycoreutils-python-utils  -y

4.3.3. 格式1:

semanage 选项 参数 文件

选项:login|user|port|interface|fcontext|translation|boolean ,注意:fcontext查询默认安全上下文(重要)

参数

-l :查询;
-a :添加
-m :修改
-d :删除
-D :全部删除
-t :类型
-r :角色
-s :用户
-f :文件

文件:设置对象文件或目录

4.3.4. 常用命令组

查询文件的默认安全上下文

[root@server ~]# semanage fcontext -l | grep 文件名

[root@server ~]# semanage fcontext -l | grep /etc/passwd
/etc/passwd[-\+]? regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.OLD regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.adjunct.* regular file system_u:object_r:passwd_file_t:s0
/etc/passwd\.lock regular file system_u:object_r:passwd_file_t:s0

查看允许访问的端口

[root@server ~]# semanage port -l | grep 协议
[root@server ~]# semanage port -l | grep http
http_cache_port_t 	tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t 	udp 3130
http_port_t 		tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t 	tcp 5988
pegasus_https_port_t 	tcp 5989

[root@server ~]# semanage port -l | grep dns
dns_port_t 		tcp 53, 853
dns_port_t 		udp 53, 853
dnssec_port_t 	tcp 8955

4.3.5. 布尔值的查询与修改:

作用:布尔值可以作为文件规则的开关来控制权限的给予:放行/阻塞

常用命令:

getsebool -a # 列出目前系统上面的所有布尔值条款
getsebool 规则名
setsebool -P 规则名=1|0 # 设置写入文件

4.4. 实验

4.4.1. 实验1

使用nginx服务演示安全上下文值的设定

服务端操作

# 恢复快照

# 开启selinux
[root@server ~]# vim /etc/selinux/config
SELINUX=enforcing

[root@server ~]# reboot

# 查看模式
[root@server ~]# getenforce
Enforcing

# nginx软件安装
[root@server ~]# yum install nginx -y

# 新建存储网页的目录
[root@server ~]# mkdir -p /www/zy

# 使用xftp将zy网站数据文件上传到/www/zy目录中

# 编辑nginx主配置文件
[root@server ~]# vim /etc/nginx/nginx.conf
				root 	/www/zy;
# 重启服务
[root@server ~]# systemctl restart nginx

# 测试,返回403,说明selinux对/www/zy的安全上下文件检测未通过

# 将/www/zy的策略类型改为已知可以访问的策略
[root@server ~]# ls -Zd /usr/share/nginx/html/
system_u:object_r:httpd_sys_content_t:s0 /usr/share/nginx/html/

[root@server ~]# ls -Zd /www/zy
unconfined_u:object_r:default_t:s0 /www/zy
[root@server ~]# chcon -Rv -t httpd_sys_content_t /www/zy

# 注意:chcon命令也可以使用参照范例文件修改来实现访问
[root@server ~]# chcon -R --reference=/usr/share/nginx/html/ /www/zy
[root@server ~]# ls -Zd /www/zy
system_u:object_r:httpd_sys_content_t:s0 /www/zy

# 浏览器中重新测试

4.4.2. 实验2

使用nginx服务的端口号修改演示selinux的设定

# 基于上例
# 检查selinux的状态
[root@server ~]# getenforce
Enforcing
# 编辑httpd的主配置文件修改监听端口号
[root@server ~]# vim /etc/nginx/nginx.conf
		server {
				listen 7777;

# 重启服务失败,selinux拦截端口的修改
[root@server ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for
details.

# 查看selinux允许的端口号
[root@server ~]# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988

# 使用semanage命令将7777端口号添加到http_port_t类型列表中
[root@server ~]# semanage port -a -t http_port_t -p tcp 7777
[root@server ~]# semanage port -l | grep http_port_t

# 重启服务
[root@server ~]# systemctl restart nginx

# 测试,浏览器输入:192.168.223.129:7777

4.4.3. 实验3

演示ssh端口号修改的selinux设定

[root@server ~]# vim /etc/ssh/sshd_config # 修改ssh的端口号为2222
Port 2222

[root@server ~]# systemctl restart sshd # 重启服务失败
Job for sshd.service failed because the control process exited with error code.
See "systemctl status sshd.service" and "journalctl -xeu sshd.service" for
details.

[root@server ~]# semanage port -l | grep ssh_port_t # 查看ssh的的端口号策略
ssh_port_t tcp 22
[root@server ~]# semanage port -a -t ssh_port_t -p tcp 2222 # 策略中添加新端口
[root@server ~]# semanage port -l | grep ssh_port_t
ssh_port_t 			tcp 			2222, 22
[root@server ~]# systemctl restart sshd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

纯静态微信小程序水果商城

首页代码 <view class"container"><!-- 轮播图 --><view class"swiper-container"><swiper class"screen-swiper" indicator-dots"true" circular"true" autoplay"true" interval"300…

穷游网酒店数据采集与可视化分析与实现

摘 要 穷游网酒店数据采集与可视化分析大屏的背景是为了满足用户对酒店数据的需求以及提供数据洞察和决策支持。随着旅游业的快速发展&#xff0c;人们对酒店信息的需求日益增加&#xff0c;而穷游网作为一家专注于旅游信息的网站&#xff0c;拥有丰富的酒店数据资源。 这个大…

计算机缺失duilib.dll的5种解决方法,轻松解决dll报错问题

计算机系统中丢失duilib.dll这个特定的动态链接库文件可能会引发一系列运行问题&#xff0c;具体表现和影响范围会根据该dll文件在系统或应用程序中的功能角色而有所不同。通常情况下&#xff0c;duilib.dll是一个与用户界面设计和渲染相关的库文件&#xff0c;它的缺失可能导致…

openGaussdb5.0单点企业版部署_KylinV10SP1

本文档环境&#xff1a;Kylin-Server-10-SP1 python2.7.16 交互式初始化环境方式 介绍 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验&#xff0c;结合企业级场景需求&#xff0c;持续构建…

MySQL 数据库表的增删改查(进阶版)

目录 1 数据库约束1.1 NOT NULL 约束1.2 UNIQUE 约束1.3 DEFAULT 约束1.4 PRIMARY KEY 约束1.5 FOREIGN KEY 约束1.6 CHECK 约束 2 表的关系2.1 三大范式2.2 表的设计2.2.1 一对一 (1:1)2.2.2 一对多 (1:n)2.2.3 多对多 (m:n) 3 进阶版CRUD操作3.1 新增(Create)3.2 查询(Retrie…

科技感十足的Pencil平替,功能全面手感丝滑,西圣Pencil 2上手

搭配Apple Pencil的iPad的确实可以大大提升工作效率&#xff0c;但是原厂的Apple Pencil价格实在偏高&#xff0c;而且容易遗失&#xff0c;所以很多人都会选择一些Apple Pencil的平替。最近我在用一款西圣Pencil 2&#xff0c;这款电容笔设计很有特点&#xff0c;看起来科技感…

《【Python】如何设置现代 Python 日志记录 | Python 基础教程 | Python 冷知识 | 十分钟高手系列》学习笔记

《【Python】如何设置现代 Python 日志记录 | Python 基础》 2 PUT ALL HANDLERS/FILTERS ON THE ROOT&#xff1a;扁平化的设计有助于简化维护成本 5 STORE CONFIG IN JSON OR YAML FILE&#xff1a;使用配置文件可以将配置和代码解耦&#xff0c;减少代码量 日志设置示例 7 …

LLM面面观之RLHF平替算法DPO

1. 背景 最近本qiang~老看到一些关于大语言模型的DPO、RLHF算法&#xff0c;但都有些云里雾里&#xff0c;因此静下心来收集资料、研读论文&#xff0c;并执行了下开源代码&#xff0c;以便加深印象。 此文是本qiang~针对大语言模型的DPO算法的整理&#xff0c;包括原理、流程…

python使用Schedule

目录 一&#xff1a;使用场景&#xff1a; 二&#xff1a;参数 三&#xff1a;实例 "Schedule"在Python中通常指的是时间调度或任务计划。Python中有多个库可以用来处理时间调度和任务计划&#xff0c;其中最流行的是schedule库。 一&#x…

Linux安装nexus maven 仓库

下载安装包 详情请参考https://blog.csdn.net/weixin_42585386/article/details/122108563 上传到服务器&#xff0c;解压缩 tar -xzvf nexus-3.31.1-01-unix.tar.gz启动服务 cd nexus-3.31.1-01/bin/ ./nexus -start登录私服 浏览器输入&#xff1a;http://192.168.80.10…

Docker打包镜像把jar包打成tar包

1.虚拟机中安装docker Cd /usr cd … 以后就在主目录操作 2.然后启动docker 启动命令:systemctl start docker 然后使用touch Dockerfile 创建Dockerfile 文件 使用vim Dockerfile 在此文件编辑配置等 编辑Dockerfile FROM openjdk:8-jre WORKDIR /home ADD emss-individua…

单元测试 | Junit4“单元测试“ ( Java中可用 )

目录: 使用JUnit4进行“单元测试” 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#xff01; 文章用于本人学习使用 &#xff0c; 同时希望能帮助大家。 欢迎大家点赞&#x1f44d; 收藏⭐ …

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…

一种手机短信验证码登录平台的解决方案

前提 爬取数据时&#xff0c;请求需要带上Cookie&#xff0c;这是很常见的一种防爬手段。更新Cookie&#xff0c;常用的方法就是Selenium模拟输入用户名和密码&#xff1b;偶尔会遇到图片验证码&#xff0c;现在打码平台很多且技术也很成熟&#xff0c;这个已经不成问题。所谓…

Qt QScrollArea 不显示滚动条 不滚动

使用QScrollArea时&#xff0c;发现添加的控件超出QScrollArea 并没有显示&#xff0c;且没有滚动条效果 原因是 scrollArea指的是scrollArea控件本身的大小&#xff0c;肉眼能看到的外形尺寸。 scrollAreaWidgetContents指的是scrollArea控件内部的显示区域&#xff0c;里面可…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

大创项目推荐 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…

C 变量

目录 1. C变量 2. C变量定义 2.1 变量初始化 2.2 C中的变量声明 3. C中的左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 1. C变量 在C语言中&#xff0c;变量可以根据其类型分为以下几种基本类型&#xff1a; 整型变量&#xff1a;用…

2.室内设计学习 - CAD 2021 调整经典界面教程及基本设置

设置经典界面 1.在第二行的空白处右击&#xff0c;弹出对话框&#xff0c;并点击【关闭】&#xff0c;关闭掉。 2.菜单栏没有显示的情况下&#xff0c;在最上面的一排&#xff0c;点击向下的箭头展开下拉框&#xff0c;勾选 【显示菜单栏】 3.点击菜单【工具】-【工具栏】-【a…

【Docker】在Windows下使用Docker Desktop创建nginx容器并访问默认网站

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…
最新文章