一、Docker简介

1、什么是虚拟化、容器化

物理机:实际的服务器或计算机。

虚拟化:通过虚拟技术将一台计算机虚拟为多台逻辑计算机。(就是安装的Ubuntu、CentOS之类的的操作系统)

容器化:操作层虚拟化,将操作系统内核虚拟化。

2、为什么要虚拟化、容器化

资源利用率高、环境标准化、资源弹性伸缩、差异化环境提供、沙箱安全、维护和扩展容易、容器对比虚拟机更清亮而且启动更快

3、虚拟化实现方式

3.1应用程序执行环境分层

从上到下:应用程序层、函数库层、操作系统层、硬件层

3.2虚拟化常见类别

虚拟机:伪造硬件接口

容器:伪造操作系统的接口

JVM:伪造函数库层、应用程序层的api

3.3常见虚拟化实现

3.3.1主机虚拟化实现

在物理服务器上安装一个虚拟化层来实现,这个虚拟化层通常由一个软件来实现(Xen、Vmware;后者需要通过Host OS)

3.3.2容器虚拟化实现

原理:操作系统层的虚拟化,通过namespace进行各程序的隔离,用cgroups进行资源的控制。

NameSpace:命名空间,用来隔离内核资源。让一些进程只能看到与自己相关的一部分资源,另外一些进程也只能看到与自己相关的一部分资源,且这些资源互相感知不到对方的存在。

NameSpace隔离实战
1、dd命令

用于读取、转换、输出数据

dd option

生成固定大小的测试文件

mkdir -p /data/maxhou/testns
cd /data/maxhou/testns/
dir
ls -l
dd if=/dev/zero of=test.img bs=8k count=1024
ll -h
dd if=/dev/zero of=test2.img bs=8k count=10240
ll -h

文件大小写转换

vi in.txt
dd if=in.txt of=out.txt conv=ucase
cat in.txt
cat out.txt

2、mkfs命令

在设备上创建LInux文件系统,即格式化。

mkfs [-V] [-t fstype] [fs-options] filesys [blocks]

格式化dd命令创建的镜像文件

mkfs -t ext4 ./test.img

3、df命令

显示目前在LInux系统上的文件系统磁盘使用情况

df [option]... [file]...
参数全称作用示例
-h--human-readable人性化显示(KB/MB/GB),最常用df -h 查看所有挂载点空间
-T--print-type显示文件系统类型(ext4/xfs 等)df -hT 查看类型 + 空间
-i--inodes显示 inode 使用情况(文件数限制)df -hi 查看 inode 占用
-a--all显示所有文件系统(含伪文件系统)df -a 查看完整列表
-l--local仅显示本地文件系统(过滤网络挂载)df -hl 只看本地磁盘
4、mount命令

把文件系统加载到指定的加载点,常用于挂载光盘,使能够方位光盘中的数据。直接将光盘插入光驱中,LInux并不会自动挂载,必须使用LInux mount命令手动挂载。

mount [-l]
mount [-t vfstype] [-o options] device dir

挂载实战

ll
mkfs -t ext4 ./test.img
mkdir -p /data/testmymount
ll /data/testmymount/    #查看新建文件夹中的内容
mount ./test.img /data/testmymount    #把文件挂载到目录中
df -h
cd /data/testmymount/
echo "123" >test.txt
ll -h
cat test.txt

5、unshare命令

使用与父进程不共享的名称空间运行程序

unshare [options] program [arguments]
参数全称隔离内容适用场景示例
-m/--mount[=file]mount namespace文件系统挂载点隔离磁盘挂载,如测试分区unshare -m --mount-proc bash
-u/--uts[=file]UTS namespace主机名、域名修改主机名不影响主机unshare -u hostname test-ns
-i/--ipc[=file]IPC namespace消息队列、共享内存隔离进程间通信unshare -i ipcmk -Q
-n/--net[=file]network namespace网络设备、IP、端口测试网络配置,模拟独立主机unshare -n ping 127.0.0.1
-p/--pid[=file]PID namespace进程 ID 编号空间隔离进程树,新 PID 从 1 开始unshare -pf --mount-proc bash
-U/--user[=file]user namespace用户 / 组 ID 映射非 root 用户获得隔离环境中的 root 权限unshare -Ur bash
-C/--cgroup[=file]cgroup namespace控制组资源限制隔离资源限制策略unshare -C systemd-run --scope sleep 10
-T/--time[=file]time namespace系统时间隔离时间设置,测试时间敏感程序unshare -T date -s "2023-01-01"

实操hostname隔离

unshare -u /bin/bash
hostname test1
hostname
6、实操——PID隔离
unshare --fork --pid --mount-proc /bin/bash
7、实操——Mount隔离
unshare --mount --fork /bin/bash
dd if=/dev/zero of=data2.img bs=8k count=10240
cgroups隔离实战

Control Groups是LInux内核提供的一种机制。本质上来说,cgroups是内核附加在程序上的一系列钩子,通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

1、pidstat

用于监控全部或指定的进程的CPU、内存、线程、设备IO等系统资源的占用情况。

pidstat [选项] [<时间间隔>] [<次数>]

Ubuntu上的安装和卸载

#卸载
apt remove sysstat -y

#安装
apt install sysstat -y

2、stress

是LInux的一个压力测试工具,可以对CPU、Memory、IO、磁盘进行压力测试。

stress [OPTION [ARG]]

Ubuntu上的安装和卸载

#卸载
apt remove stress -y

#安装
apt install stress -y

3、实操——cgroups信息查看

(1)cgroups版本查看

cat /etc/*release*
cat /proc/filesystems |grep cg

(2)cgroups子系统查看

cat /proc/cgroups

(3)cgroups挂载信息查看

mount |grep cgroup

4、实操——使用cgroups对内存进行控制
#创建控制组
mount |grep cg
ll /sys/fs/cgroup/memory
mkdir test_memlimit
ls -l

#限制内存
echo "20971520" > memory.limit_in_bytes

5、实操——使用cgroups对cpu进行控制
#创建CPU控制组
mount |grep cg
cd /sys/fs/cgroup/cpu
mkdir test_cpu
cd test_cpu/
ls -l

#创建stress进程,通过pidstat进行监控

#对控制组做CPU使用率的限制

#把pid挪到控制组
LXC隔离实战

LInux Containers,一种操作系统层虚拟化技术,是LInux内核容器功能的一个用户空间接口。

Ubuntu上的卸载和安装

#检查是否安装,清理资源

#卸载软件

#检查服务已经没有该服务了

#安装
1、lxc-checkconfig

检查系统环境是否满足容器使用要求

lxc-checkconfig

2、lxc-create

创建lxc容器

lxc-create -n NAME -t TEMPLATE_NAME [--template-options]
3、lxc-start

启动容器

lxc-start -n NAME -d
4、lxc-ls

列出所有容器

lxc-ls *f
5、lxc-info

查看容器的相关信息

lxc-info -n NAME
6、lxc-attach

进入容器执行命令

lxc-attach --name=NAME [--COMMAND]
7、lxc-stop

停止容器

lxc-stop -n NAME
8、lxc-destory

删除处于停机状态的容器

lxc-destroy -n NAME

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐