Chapter Ⅰ 提高命令行生产率
SHELL脚本
#/bin/bash
声明使用的shell翻译器
for循环
for VAR in LIST
doCOMMAND1COMMAND2
done
实验1:显示host1-5
#! /bin/bash
for host in host{1..5}
doecho $host
done
实验2:显示包含kernel的软件包安装时间
#! /bin/bash
for PACKAGE in $(rpm -qa | grep kernel)
doecho "$PACKAGE was installed on $(date -d @$(rpm -q --qf "%{INSTALLTIME}" $PACKAGE))"
done
注:date -d 可以将天数转换为标准时间
IF判断
echo $?
返回非0,测试不成功;返回为0,测试成功
两种做判断的方法
test 1 -gt 2; echo $?
[[ 1 -gt 2 ]]; echo $?
[ 1 -gt 2 ]; echo $?
单层IF语句
if <CONDITION> ; thenCOMMAND1
elseCOMMAND2
fi
多层嵌套IF
if <CONDITION> ; thenCOMMAND1
elsif <CONDITION2> ; thenCOMMAND2elseCOMMAND3
fi
实验:判断部分服务是否运行
#! /bin/bash
for SERVICE in sshd chronyd httpd
dosystemctl is-active $SERVICE > /dev/nullif [ $? -eq 0 ]; thenecho "$SERVICE is running"elseecho "$SERVICE is dead"fi
done
正则表达式
示例文档内容:
cat
caaat
coot
cot
cut
c2t
dog
concatenate
dogma
category
educated
boondoggle
vindication
chilidog
选项 | 说明 | 表达式 | 匹配内容 |
---|---|---|---|
. | 匹配任意单个字符 | c.t | cat、cot、cut、c2t、concatenate、category、educated、vindication |
* | 前面的项目匹配零次或多次 | ca*t | cat、caaat、concatenate、category、educated、vindication |
{n} | 前面的项目匹配n次 | ca{3}t | caaat |
grep -v
:包含
grep -e
:扩展匹配,grep -e cat -e dog file1
grep -A 2 -B 3 cat file1
:在file1中查找cat字符串,同时输出前三行(Before)和后两行(After)
grep -i
:忽略大小写
Chapter Ⅱ 计划将来的任务
工作场景:修改防火墙前,使用定时任务恢复防火墙配置,在出问题时可以在一定时间后自动恢复
at定时任务(一次性)
systemctl status atd
直接使用at命令设置一次性执行的指令,交互式输入(ctrl+d退出)
at now + 5min # 5分钟后执行
at 17:35 # 17:35执行at -l 或者 atq # 查看at的任务列表
at -c JOBID # 查看JOBID的任务详细信息atrm JOBID # 删除JOBID的任务
crontab定时任务(周期性)
crontab [ -u user ] { -l | -r | -e }
-u user 是指设定指定 user 的时程表;如果不使用 -u user 的话,就是表示设定自己的时程表。
f1 f2 f3 f4 f5 program
f1表示分钟;f2表示小时;f3表示一个月份中的第几日;f4表示月份;f5表示一个星期中的第几天;program表示要执行的任务
当f1为时表示每分钟要执行program,f2为时表示每小时都要执行程序,其余类推
当f1为a-b时表示从第a分钟到第b分钟这段时间内要执行,f2为a-b时表示从a到b小时都要执行,其余类推
当f1为*/n时表示每n分钟个时间间隔执行一次,f2为*/n时表示每n小时个时间间隔执行一次,其余类推
当f1为a,b,c…时表示第a、b、c…分钟要执行,f2为a,b,c…时表示第a、b、c…个小时要执行,其余类推
• 只需要把相应的脚本放到/etc/cron.hourly、cron.daily、cron.weekly和cron.monthly的文件夹下,即可实现定时任务,而不需要编辑crontab配置文件
• /etc/cron.deny中配置的用户,不能使用定时任务(对root用户无效)
systemd提供的计时timer(周期性)
一般和其他服务结合使用,比如应用在清理临时文件
定时器systemd-tmpfiles-clean.timer:定义了多久运行一次定时器,以及定时到期后唤起哪个clean清理服务
清理服务systemd-tmpfiles:定义了清理的位置,以及多久未使用的文件会被清理
1、定时器
systemctl daemon-reload
– 重新加载systemd的定时器配置文件(每个服务对应自己的timer定时器配置文件)
[root@localhost ~]# systemctl cat systemd-tmpfiles-clean.timer
# /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
OnBootSec:开机后多久开始计时
OnUnitActiveSec:定时的时间间隔
2、清理服务
systemd-tmpfiles --create /etc/tmpfiles.d/tmp.conf
–指定创建清理服务
systemd-tmpfiles --clean /etc/tmpfiles.d/tmp.conf
–按照配置文件定义开始清理
Chapter Ⅲ 调优系统性能
系统调优tuned
systemctl status tuned
tuned-adm list或tuned-adm profile # 列出可用的优化列表
tuned-adm recommand # 显示推荐的优化配置
tuned-adm profile xxx # 设置优化配置为xxx
tuned-adm active # 显示当前在用的优化配置
tuned-adm off # 关闭系统调优
调优配置文件
调优配置文件 | 用途 |
---|---|
balanced | 性能和节能间的折衷 |
desktop | 优化图形化界面的性能 |
latency-performance | 侧重于延迟 |
network-latency | 侧重于更低的网络延迟 |
network-throughput | 侧重于网络吞吐量 |
powersave | 省电,强制CPU尽可能使用最低的时钟频率 |
throughput-performance | 侧重于吞吐量 |
virtual-guest | 当系统在虚拟机上运行时,调优系统以获得最高性能 |
virtual-host | 当系统当虚拟机的主机时,调优系统以获得最高性能 |
[root@localhost ~]# tuned-adm profile
Available profiles:
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-guest
进程调优nice
进程调度程序针对不同的进程采用不同的调度策略,该策略为运行的进程指定相对优先级,这个优先级成为nice值
nice取值范围为-20(最高)到19(最低),默认值为0
- nice值越高,表示优先级越低,该进程容易将其CPU使用量让给其他进程
- nice值越低,表示优先级越高,该进程更加不倾向于让出CPU
- 如果不存在资源争用,nice值没有意义
1、使用top查看运行进程的nice值
NI列显示进程的nice值,PR列显示其调度优先级(PR=NI+20)
2、使用ps查看进程的nice
ps axo pid,comm,nice,cls --sort=-nice
3、启动具有不同nice级别的进程
nice -n 数字 指令
(默认为0)
4、更改现有进程的nice级别
renice -n 数字 PID
Chapter Ⅳ 使用ACL控制对文件的访问
单独对某个用户或组进行的文件访问权限控制
1、查看文件ACL
getfacl file
没有ACL的情况
有ACL的情况
2、查看目录ACL
getfacl directory
优先级
一般情况:所属者 > 所属组 > 其他(3个权限只有一个有效,判断一个权限满足后不会再判断后面的权限)
ACL情况:所属者 > ACL权限.用户 > 所属组 > ACL权限.组 > 其他(只要满足一个就不会往下判断)
3、修改ACL
setfacl -m u:devops:rwx,g:wheel:rw-,o::- 2.txt
也可以使用getfacl作为输入
getfacl 2.txt | setfacl --set-file=- 3.txt
其中–set-file选项可接受来自文件或stdin的输入,短划线字符(-)指定使用stdin
4、删除ACL
setfacl -x u:name,g:name file
5、默认权限
为了确保在目录中创建的文件和目录继承特定的ACL,需要在目录上使用默认ACL
setfacl -m d:u:name:rx directory
对父目录dir1设置默认权限,在里面新建子目录dir2,将继承父目录的默认权限
setfacl d:u:devops:- dir1
使用setfacl -k /home/student/dir1
的默认权限后,在里面新建子目录dir22,将不再继承
Chapter Ⅴ 管理SELinux安全性
SELinux(Security Enhanced Linux):控制进程可以访问哪些文件或目录
三种模式 = { e n f o r c i n g :强制执行访问控制规则 p e r m i s s i v e :只监测发告警但不控制 d i s a b l e : S E L i n u x 关闭 三种模式=\left\{ \begin{matrix} enforcing:强制执行访问控制规则 \\ permissive:只监测发告警但不控制 \\ disable:SELinux关闭 \end{matrix} \right. 三种模式=⎩ ⎨ ⎧enforcing:强制执行访问控制规则permissive:只监测发告警但不控制disable:SELinux关闭
SELinux文件上下文
进程有个标签,文件也有标签,两者的标签匹配上了进程才可以访问文件
比如Apache的标签为httpd_t,/var/www/html的标签为httpd_sys_content_t,匹配上,所以apache进程可以访问该目录
查看进程的标签:ps auxZ
或者 ps -ZC
进程
查看文件或目录的标签:ls -Z
或者ls -dZ
临时关闭SELinux
setenforce 0 关闭
setenforce 1 开启
getenforce 查询
永久关闭SELinux
/etc/selinux/config
临时修改标签
chcon -t 标签值 文件名
恢复默认值
restorecon -Rv 文件名
永久修改标签
semanage fcontext -at 标签值 文件名
semanage fcontext -l 查看
fcontext最常用的扩展正则表达式是(/.*)?,表示匹配目录及该目录中的所有内容
不同操作对标签值的影响
操作 | 标签值的变化 |
---|---|
创建 | 继承父目录的标签值 |
复制 | 继承复制到的目录的标签值 |
剪切 | 保留原有标签值 |
实验:创建一个新目录,并将apache的访问目录指定这个目录,修改标签值查看curl访问结果
1、在/data下创建一个index.html,其标签继承了父目录的标签default_t
2、修改apache配置文件,将缺省目录指定在/data,并查询httpd进程的标签为httpd_t
3、在workstation上访问失败
4、修改/data/的SELinux属性
5、在workstation上再次访问,已经正常
SEBOOL值
部分系统自定义好的参数(比如FTP是否上传),SEBOOL和SELinux都允许的情况才可以
sebool可以自定义,但非常麻烦
查询:getsebool
临时关闭:setsebool virt_use_usb off
永久关闭:setsebool -P virt_use_usb off
查看sebool列表:semanage boolean -l
触发的SELinux日志
/var/log/messages,以sealert开头
Chapter Ⅵ 管理基本存储
1、分区方案
MBR:最多支持4个主分区,通过扩展分区最多可扩展到15个,大小最大为2TB
GPT:最多支持128个分区,大小最大为8ZB
2、parted分区命令
-
向磁盘写入分区表
写入MBR磁盘标签:parted /dev/sdb mklabel msdos
写入GPT磁盘标签:parted /dev/sdb mklabel gpt
-
创建分区
parted /dev/sdb mkpart primary ext4 2048s 1000MB
- primary:对于MBR分区,超过四个分区时,可以创建三个主分区和一个扩展分区,扩展分区上可以创建多个逻辑分区;对于GPT分区,指定分区的自定义名字即可
- ext4:指示要在分区上创建的文件系统类型,并不会在分区上创建,仅仅作为指示
- 2048s:起始值,s标识扇区,也可以使用MB、GB等,对于大多数磁盘而言,假设起始扇区为2048的倍数可以保证分区对齐,较为安全
- 1000MB:分区的结束值
删除分区:parted /dev/sdb rm 2
查看分区:parted /dev/sdb print
打标记: parted /dev/sdb set 2 flag FLAGS
创建文件系统
mkfs.ext4
mkfs.xfs
临时挂载,用mount;永久挂载在/etc/fstab中修改(建议用UUID),挂载后,可以用mount /dev/sdb1的指令进行验证,通过systemctl daemon-reload
加载fstab文件
lsblk -f
可以查看文件系统,-p查看全路径
交换分区
在磁盘上划分出一部分空间,当内存不够用时,将此部分空间当作内存使用。
由于交换分区位于磁盘上,所以与RAM相比,交换会比较慢。虽然是用于增加系统RAM,但对于RAM不足以满足工作负载需求的问题,不应将交换空间视为可持续性的解决方案
将分区格式化成swap格式
mkswap /dev/sdb1
swapon /dev/sdb1
在sdb1上开启交换分区
swapoff /dev/sdb1
关闭sdb1的交换分区
swapon --show
查看
/etc/fstab上永久生效
UUID swap swap defaults 0 0
注:第一个swap是挂载点,但交换分区没有挂载点,所以用swap字段占位
Chapter Ⅶ 管理逻辑卷
PV-VG-LV的关系
1、创建物理卷pvcreate
pvcreate
会将物理卷分成若干固定大小的物理区块(PE),如4MB
pvdisplay
- PV NAME:映射到设备名称
- VG NAME:显示将PV分配到的卷组
- PV Size:显示PV的物理大小,包括任何不可用的空间
- PE Size:物理区块大小,是逻辑卷中可分配的最小大小
- Free PE:显示有多少PE单位可用于分配给新逻辑卷
2、创建卷组vgcreate
使用vgcreate
将一个或多个物理卷PV结合为一个卷组VG
- VG Name:卷组的名称
- VG Size:存储池可用于逻辑卷分配的总大小
- Total PE:以PE单位表示的总大小
- Free PE/Size:显示VG中有多少空间可用于分配给新LV或扩展现有LV
3、创建逻辑卷lvcreate
使用lvcreate可根据VG中的可用物理块创建新的逻辑卷LV
lvcreate -n
指定LV的名字
lvcreate -L
指定LV的大小
lvcreate -l
指定LV都少个PE
lvdisplay
- LV Path:显示逻辑卷的设备名称
- VG Name:显示从其分配LV的卷组
- LV Size:显示LV的总大小,使用文件系统工具确定可用空间喝数据存储的已用空间
- Current LE:显示此LV使用的逻辑区块数。LE通常映射到VG中的物理区块,并因此映射到物理卷
4、创建LV的文件系统
mkfs -t xfs /dev/mapper/vg01-lv01
mkfs -t xfs /dev/vg01/lv01
两种方式均可
逻辑卷的扩展
1、扩展卷组:vgextend
2、缩减卷组:pvreduce
3、扩展逻辑卷:lvextend
扩展完逻辑卷后,还需要调整文件系统大小
1、xfs:xfs_growfs /mnt/data
(挂载点)
2、ext4: resize2fs /dev/vg01/lv01
(逻辑卷)
注意:
xfs可扩,ext4可扩可缩
逻辑卷的迁移
pvmove 迁移PV 目的PV
Chapter Ⅷ 实施高级存储功能
Stratis
将物理磁盘划分成资源池,然后在上面做出多个文件系统,实现灵活管理
yum install stratisd stratis-cli
1、池
创建:stratis pool create test_pool /dev/sdb
增加:stratis pool add-data test_pool /dev/sdc
查看:stratis pool list
2、文件系统
创建:stratis filesystem create test_pool test_fs
查看:stratis filesystem list
VDO,虚拟数据优化器
两个内核模块:kvdo模块用于以透明的方式控制数据压缩;uds用于重复数据删除
安装vdo:yum install vdo kmod-kvdo
创建vdo卷:vdo create --name=vdo1 --device=/dev/vdd --vdoLogicalSize=50G
管理vdo卷:vdo start --name=vdo1
vdo stop --name=vdo1
vdo status --name=vdo1
查看统计信息:vdostats --human-readable
实验:通过向vdo卷内copy相同的文件副本,理解压缩和删除重复数据的概念
创建vdo_test卷后,压缩和删除重复的功能会自动开启
将/mnt/ 挂载到/dev/mapper/vdo_test上,并逐步将副本copy到此
初始状态下,vdo_test,总大小5G,已用3G(VDO保留),此时可用2G,压缩率99%
将副本1拷贝后,压缩率降至50%
将相同内容的副本2拷贝后,压缩率变为67%(因为副本1和副本2相同,所以vdo删除了重复的内容)
注:创建指定大小的文件,dd if=/dev/urandom of=/root/install.img bs=1M count=1024
永久挂载fstab
挂载选项 ,x-systemd.requires=vdo.service 意思为可延迟挂在文件系统,直到vdo.service启动为止
Chapter Ⅸ 访问网络附加存储
NFS,网络文件系统
- 服务端:共享目录
主配置文件:/etc/exports
自定义配置文件:/etc/exports.d/
/share_remote 172.25.250*(rw,sync,no_roo_squash) serverb(ro,root_squash)
/share_remote:共享的目录
172.25.250(rw,sync,no_root_squash)*:定义了172.25.250.*的访问者的权限
- no_root_squash:登录NFS主机使用分享目录的使用者,如果是root的话,那么对于这个分享的目录来说,他就具有root权限。极不安全,不建议使用
- root_squash:登录NFS主机使用分享目录的使用者如果是root时,那么这个使用者的权限会被压缩成为匿名使用者 nfsnobody,通常他的UDI和GID都会变成nobody这个系统账号的身份
使用exportfs -a
使修改生效
防火墙修改:
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=mountd
- 客户端:挂载目录
配置文件/etc/nfs.conf
nfsconf --get nfsd tcp
nfsconf --set nfsd tcp
nfsconf --unset nfsd tcp
将挂载目录挂载到nfs共享目录上
mount serverb:/shares /mnt/public
(mount nfs服务端:共享目录 挂载目录)
showmount命令用于查询NFS服务器的相关信息(showmount -e serverb)
-e或–exports:显示NFS服务器的共享目录
autofs,自动挂载网络附加存储
根据需要(进入目录)自动挂载NFS共享,并将在不再使用NFS共享时自动卸载共享
yum install autofs
主配置文件/etc/auto.master
自定义配置文件/etc/auto.master.d/
以自定义配置文件为例,在auto.master.d文件夹下,必须以.autofs作为扩展名;
/rhel /etc/auto.test
/rhel为间接自动挂载的基础目录,/etc/auto.test包含挂载详细信息
/etc/auto.test,test反应了映射关系
user1 -rw,sync workstation:/rhel/user1
安全挂载点是/rhel/user1;rw表示具有读/写权限;sync表示写入操作期间服务器会立即同步;最后一部分是服务端的挂载点
验证:
在未进入挂载点时,df -h看不到挂载点,cd进入后激活autofs,df -h可以看到挂载点
Chapter Ⅹ 控制启动过程
- 重启和关机
poweroff:停止所有的服务,卸载所有文件系统,然后关闭系统
halt:用于停止系统,与poweroff不通的是不会关闭系统,而是让系统进入能安全手动关闭的状态
reboot:停止所有的服务,卸载所有文件系统,然后重启系统
shutdown:默认一分钟后关机
shutdown -c :取消关机
- SYSTEMD Target
Target | 用途 |
---|---|
graphical.target | 图形化 |
multi-user.target | 命令行 |
rescue.target | 救援模式 |
emergency.target | 紧急模式 |
查看所有的Target:systemctl list-units --all --type=target
查看缺省的Target:systemctl get-default
设置缺省Target:systemctl set-default multi-user.target
切换至图形化:systemctl isolate grahpical.target
- 进入救援(rescue)模式
在启动内核界面,按e进入编辑模式,然后在启动参数处添加 systemd.unit=rescue.target,并按Ctrl+x启动
进入后输入root口令,通过mount查看,可以发现/根目录是ro权限
通过mount -o remount,rw /改为rw权限
- 进入紧急(emergence)模式
与救援模式类似,参数为systemd.unit=emergence.target;进入系统后,用mount查询,发现/根目录为只读权限,无法进行应急操作,可以下面的指令改为读写权限
mount -o remount,rw /
- 重置root密码
1、在启动参数上,末尾添加rd.break,按Ctrl+x启动
2、/sysroot为启动的临时根目录,以读写形式重新挂载该目录
mount -o remount,rw /sysroot
3、切换为chroot存放位置,其中/sysroot被视为文件系统树的根
chroot /sysroot
4、设置root密码
passwd root
5、将系统配置为在启动后自动执行完整SELinux重新标记
touch /.autorelabel
6、继续启动系统
键入两次exit或者按两次Ctrl+d
Chapter Ⅺ 管理网络安全
在CentOS 7及之前版本中,iptables也提供了类似firewalld的daemon,用户可以选择iptables或firewalld daemon其一。CentOS 8已弃用iptables,只用nftables。
nftables和iptables负责的应该属于数据包过滤框架,iptables实际由iptables、ip6tables、arptables和ebtables构成。
▪ 查看所有zone和默认zone
firewall-cmd --get-default-zone
[root@localhost ~]# firewall-cmd --get-default-zone
public
firewall-cmd --get-zones
[root@localhost ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
firewalld区域默认配置
区域名称 | 默认配置 |
---|---|
trusted | 允许所有流入流量 |
home | 续费于传出流量相关,或与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量 |
internal | 除非与传出流量相关,或与ssh、mdns、ipp-client、samba-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量(一开始与home区域相同) |
work | 除非与传出流量相关,或与ssh、ipp-client或dhcpv6-client预定义服务匹配,否则拒绝传入流量 |
public | 除非与传出流量相关,或与ssh或dhcpv6-client预定义服务匹配,否则拒绝传入流量 |
external | 除非与传出流量相关,或与ssh预定义服务匹配,否则拒绝传入流量。通过此区域转发的IPv4传出流量将进行伪装,以使其看起来像是来自传出完了过接口的IPv4地址 |
dmz | 除非与传出流量相关,或与ssh预定义服务匹配,否则拒绝传入流量 |
block | 除非与传出流量相关,否则拒绝所有传入流量 |
drop | 除非与传出流量相关,否则拒绝所有丢弃流量(甚至不产生包含ICMP错误的响应) |
▪ 添加策略
firewall-cmd --permanent --add-port=9090/tcp
[root@localhost ~]# firewall-cmd --permanent --add-
--add-forward-port= --add-lockdown-whitelist-command= --add-masquerade --add-service=
--add-icmp-block= --add-lockdown-whitelist-context= --add-port= --add-source=
--add-icmp-block-inversion --add-lockdown-whitelist-uid= --add-protocol= --add-source-port=
--add-interface= --add-lockdown-whitelist-user= --add-rich-rule=
▪ 重新加载
firewall-cmd --reload
// 先移除默认开启的没有访问限制的ssh服务
firewall-cmd --permanent --remove-service=ssh
// 添加复杂规则,只允许指定IP段访问22端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'
Chapter Ⅻ Podman
容器发展历史
- LXC(Linux containers):最早的容器技术,Google 公司
- docker:以 LXC 为基础,开源、最为流行的容器技术,docker 公司(初创公司)
- rkt(Rocket):CoreOS公司主导,得到了Redhat、Google、Vmware等公司的支持
- Podman:开源容器技术,区别于 docker,进程化和非 root 管理,Redhat 公司
- Kubernetes:对容器的管理技术,通过标准化的 CRI 接口对容器进行管理,目前已经宣布不再支持 docker;Google 公司
- OpenShift:管理和编排 Kubernetes ,Redhat 公司
容器化与虚拟化的区别
容器和虚拟机与硬件和底层操作系统交互方式不同
▪ 虚拟化:- 可以在单一硬件平台运行多操作系统
- 使用 hypervisor 将硬件拆分成多个虚拟硬件,允许多个操作系统并行运行
- 需要完整的操作系统来支持应用运行
- 隔离性更好
▪ 容器化: - 在操作系统上直接运行,容器之间分享硬件和操作资源,容器中应用轻量化和快速并行运行
- 共享操作系统内核,将容器化的应用程序进程与系统的其余部分隔离,并使用与该内核兼容的任何软件
- 比虚拟化要求更少的硬件资源,可以快速启动和停止,减少存储需求;可快速(上千台)批量秒级部署
- 代码与系统分离,升级方便
- 适用于测试/迭代上线/版本演进
- 网络互通问题存在问题(上千台容器共有网络的分配;上千台容器间的网络互访 等)
容器核心技术 - Control Groups(cgroups):资源管理
- NameSpace:进程隔离
- SElinux和Seccomp(Secure Computing mode)加强安全边界
容器利用 NameSpace 为资源(如进程、网络通信和卷)提供独立的、隔离的环境;在容器中运行的进程与主机上的所有其他进程是隔离的
容器核心要素
- images(映像):提供已经封装的文件,容器都是从 images 复制而来
- 自己做
- 官方提供:registry.hub.docker.com
- 第三方:redhat、阿里等
- Tag(标记):用于区分 image 版本,如果 image 名称中不含有 tag,将默认使用 latest tag
registry_name/user_name/image_name:tag
- registry_name:是存储 image 的 registry 名称,一般是registry 的域名
- user_name:是 image 所属的用户或组织
- image_name:必须在用户 userspace 中唯一
Podman
含义:Pod Manager
三大组件
配置步骤
1、安装 container 软件包
yum module install container-tools
2、修改配置文件
vim /etc/containers/registries.conf
# 使用本地库
[registries.search]
registries = [' registry.access.redhat.com', ' registry.redhat.io']# 使用远程库,insecure表示不做安全检查
[registries.search]
registries = ['workstation.lab.example.com:5000']
[registries.insecure]
registries = ['workstation.lab.example.com:5000']
3、查看库
本地库:podman images
远程库:podman search workstation.lab.example.com:5000/
4、下载 PULL 容器映像 images
使用 Podman pull 从 registry 中下载 images,应始终使用完整的 image 名称
podman pull 命令从 registry 中提取指定的 image 并保存到本地
下载后可以通过 podman images 查看下载到本地 image
也可以通过 podman rmi IMAGE-ID 删除下载后的映像
5、运行容器
podman run --privileged -d --name registry -p 5000:5000 -v /var/lib/registry/:/var/lib/registry
主要参数列表
参数 | 说明 |
---|---|
–privilege | Give extended privileges to container |
-d | 后台运行 Run container in background and print container ID |
-it | 将终端分配给容器,并允许向其发送键盘指令 |
–name | 容器名称 |
-p | 本地端口:容器端口 Publish a container’s port, or a range of ports, to the host (default []) |
-v | 本地目录:容器目录Bind mount a volume into the container (default []) |
-e | 传递环境变量 Set environment variables in container |
5、停止/删除容器
podman stop 容器id
podman rm 容器id
6、查看容器运行情况
查看所有容器:podman ps -a
查看运行容器:podman ps
容器随系统启动
▪ 当数据库或 web 服务器等服务部署为容器时,通常希望这些容器与服务器一起自启动
▪ 通过为无根(rootless)容器创建 systemd user unit 文件,可使 systemctl 命令管理,类似常规服务
▪ 如果容器以 rootless 模式运行,可以用非 root 账户管理这些服务,提高安全性
▪ 要对许多基于容器的应用程序和服务进行更复杂的伸缩和编排,可使用基于 Kubernetes 的企业编排平台,如 RedHat Openshift Container Platform(少量容器的不需要扩展的小型部署可以使用 systemd unit管理)
配置步骤:
1、定义 systemd user service
创建 ~/.config/systemd/user/ 目录来存储 unit 文件
2、创建 unit 文件
podman generate --name web --files --new
–name container_name:指定容器名称,用作模板来生成 unit 文件;生成文件名称为 containers-container_name.service
–files:指示 Podman 在当前目录中生成 unit 文件;没有这个选项,Podman 将在标准输出中显示该文件
–new:指示 Podman 配置 systemd 服务,以便在服务启动时创建容器,并在服务停止时删除。在这种模式下,容器是临时的,通过需要持久存储来保存数据。没有 --new 选项,Podman 配置服务启动和停止现有的容器,而不删除
3、使用 systemd 启动和停止容器
systemd监视容器状态,并在它们失败时重新启动它们,不要使用 podman 命令来启动或停止这些容器,否则会干扰systemd监视
systemctl --user start container-web
systemctl --user stop container-web
systemctl --user status container-web
4、激活用户实例
激活的用户实例 systemd user unit,只有在用户登录会话后,才会运行。
如果要让用户实例 systemd user unit 随系统自动启动,需要再执行命令:
loginctl enable-linger
配置系统和用户服务
Storing custom unit files | System services | /etc/systemd/system/unit.service |
User services | ~/.config/systemd/user/unit.service | |
Reloading unit files | System services | # systemctl daemon-reload |
User services | $ systemctl --user daemon-reload | |
Starting and stopping a service | System services | # systemctl start UNIT # systemctl stop UNIT |
User services | $ systemctl --user start UNIT $ systemctl --user stop UNIT | |
Starting a service when the machine starts | System services | # systemctl enable UNIT |
User services | $ loginctl enable-linger $ systemctl --user enable UNIT |