Docker —— 隔离的基本操作(1)

发布于:2025-05-08 ⋅ 阅读:(18) ⋅ 点赞:(0)

我们之前已经了解了Docker技术架构演进的一个基本路线,如果还没有了解的小伙伴可以点击这里:

https://blog.csdn.net/qq_67693066/article/details/147678726

今天我们在学习Docker之前,我们先来了解一下操作系统自带的隔离,主要是要大家意识到,隔离并不是Docker的独家,操作系统自己早就实现了隔离,并且这些命令对于之后的Docker学习也是有帮助的。

Linux 操作系统通过多种机制实现进程、用户、文件系统、网络等资源的隔离,确保安全性和稳定性。以下是 Linux 的主要隔离技术及其实现方式:


1. 用户和权限隔离

Linux 使用 用户(User)和组(Group) 进行权限控制,确保不同用户只能访问授权资源:

  • uid(用户ID)和 gid(组ID):每个进程和文件都有所属用户和组。
  • chmodchown:控制文件访问权限(rwx)。
  • sudosu:限制普通用户执行特权操作。
  • /etc/passwd/etc/shadow:存储用户信息,密码加密存储。

示例:

# 查看当前用户信息
id
# 修改文件权限
chmod 600 /path/to/file  # 仅所有者可读写
chown user:group /path/to/file

2. 进程隔离

Linux 内核通过 命名空间(Namespaces) 实现进程间的隔离:

命名空间类型 作用
PID 进程ID 独立(不同命名空间的进程看不到彼此)
Mount (mnt) 文件系统挂载点隔离
Network (net) 独立网络栈(IP、端口、路由表等)
UTS 主机名和域名隔离
IPC 进程间通信(消息队列、共享内存等)隔离
User 用户和组ID 隔离(容器内 root ≠ 宿主机 root)
Cgroup (cgroup) 控制资源使用(CPU、内存等)

示例:查看进程的命名空间

ls -l /proc/$$/ns  # 查看当前进程的命名空间

3. 文件系统隔离

  • chroot:修改进程的根目录,限制其访问范围(早期容器技术)。
  • OverlayFS:联合文件系统(Docker 使用),实现分层存储。
  • mount --bind:挂载特定目录,实现文件访问控制。

示例:使用 chroot 创建隔离环境

# 创建一个简单的隔离环境
mkdir -p /jail/{bin,lib64}
cp /bin/bash /jail/bin/
cp /lib64/{ld-linux-x86-64.so.2,libc.so.6} /jail/lib64/
chroot /jail /bin/bash  # 进入隔离环境

4. 资源隔离(Cgroups)

Control Groups (cgroups) 限制进程的资源使用:

  • CPU:分配 CPU 时间片。
  • Memory:限制内存使用。
  • I/O:控制磁盘读写带宽。
  • Network:限制网络带宽。

示例:使用 cgroups v2 限制进程内存

# 创建 cgroup
mkdir /sys/fs/cgroup/memory/mycgroup
echo 100000000 > /sys/fs/cgroup/memory/mycgroup/memory.limit_in_bytes
# 将进程加入 cgroup
echo $$ > /sys/fs/cgroup/memory/mycgroup/cgroup.procs

5. 网络隔离

  • Network Namespace:每个容器/进程有独立的网络栈。
  • iptables/nftables:防火墙规则隔离流量。
  • veth 虚拟设备:连接不同网络命名空间。
  • bridge:虚拟交换机管理容器网络。

示例:创建网络命名空间

ip netns add mynetns  # 创建网络命名空间
ip netns exec mynetns ip a  # 在命名空间内执行命令

6. 安全增强(SELinux/AppArmor)

  • SELinux(Security-Enhanced Linux):强制访问控制(MAC),限制进程权限。
  • AppArmor:基于配置文件限制进程能力。

示例:查看 SELinux 状态

sestatus

7. 容器技术(Docker/LXC)

容器是上述隔离技术的组合:

  • Docker:使用 Namespaces + Cgroups + OverlayFS 实现轻量级虚拟化。
  • LXC:Linux 原生容器,直接调用内核功能。

示例:运行一个 Docker 容器

docker run -it --rm alpine sh

总结

隔离类型 技术 作用
用户隔离 uid/gid, sudo 限制用户权限
进程隔离 Namespaces 进程间资源隔离
文件系统隔离 chroot, OverlayFS 限制文件访问
资源隔离 Cgroups 限制 CPU、内存等
网络隔离 Network Namespace, iptables 独立网络环境
安全增强 SELinux, AppArmor 防止提权攻击
容器 Docker, LXC 综合隔离

我们今天主要来看进程隔离和文件隔离,但是在这之前,我们先了解几个命令:

dd

dd 是 Linux/Unix 系统中一个强大的 磁盘和文件操作工具,主要用于 数据复制、转换和备份。它可以直接访问设备文件,适用于磁盘克隆、创建镜像文件、数据擦除等场景。


基本语法

dd if=输入文件 of=输出文件 [选项]
  • if(input file):输入源(文件或设备,如 /dev/sda
  • of(output file):输出目标(文件或设备)
  • 其他常用选项
    • bs:块大小(默认 512B,建议设为 1M4K 提高效率)
    • count:复制的块数
    • skip:跳过输入文件开头的块
    • seek:跳过输出文件开头的块
    • status=progress:显示进度(GNU dd 支持)

常见用途示例

1. 磁盘/分区备份(克隆)

# 备份整个磁盘到镜像文件
sudo dd if=/dev/sda of=/backup/sda.img bs=4M status=progress

# 恢复镜像到磁盘
sudo dd if=/backup/sda.img of=/dev/sda bs=4M status=progress
  • 适用场景:全盘备份、系统迁移。

2. 创建空文件(预分配空间)

# 创建一个 1GB 的空文件
dd if=/dev/zero of=testfile bs=1M count=1024
  • /dev/zero:提供空字符流。

我们来试试这个,这个比较方便:
在这里插入图片描述
我们打开testfile,写一行hello world:
在这里插入图片描述
然后我们可以将所有的小写字母转换成大写:

dd if=testfile of=testfile_2 conv=ucase

在这里插入图片描述

3. 销毁磁盘数据(安全擦除)

# 用零填充整个磁盘(不可恢复)
sudo dd if=/dev/zero of=/dev/sdb bs=4M status=progress

# 随机数据填充(更安全)
sudo dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
  • 注意:操作不可逆,务必确认目标设备!

4. 复制 ISO 到 U 盘(制作启动盘)

sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress conv=fsync
  • /dev/sdb 是 U 盘设备(用 lsblk 确认)。
  • conv=fsync:确保数据完全写入。

5. 修改文件部分内容

# 替换文件开头 1KB 为 0
dd if=/dev/zero of=file.bin bs=1K count=1 conv=notrunc
  • notrunc:不截断原文件,仅覆盖指定部分。

6. 测试磁盘读写速度

# 写入速度测试
dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct

# 读取速度测试
dd if=./testfile of=/dev/null bs=1G count=1 iflag=direct
  • oflag=direct/iflag=direct:绕过缓存,测真实速度。

注意事项

  1. 谨慎操作

    • dd 直接操作设备,输入错误可能导致数据丢失!
    • 务必确认 ifof 参数(如误将 of=/dev/sda 写成 if=/dev/sda 会覆盖系统盘)。
  2. 进度查看

    • 较新版本的 dd 支持 status=progress
    • 旧版本可通过发送 USR1 信号查看进度:
      kill -USR1 $(pgrep ^dd)  # 另开终端执行
      
  3. 替代工具

    • pv:显示进度条(需安装):
      pv /dev/sda > sda.img
      
    • rsync:更安全的文件同步。

总结

用途 命令示例
磁盘备份 dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
制作启动盘 dd if=ubuntu.iso of=/dev/sdb bs=4M conv=fsync
安全擦除磁盘 dd if=/dev/urandom of=/dev/sdb bs=4M status=progress
创建大文件 dd if=/dev/zero of=largefile bs=1M count=1024
测试磁盘速度 dd if=/dev/zero of=./testfile bs=1G count=1 oflag=direct

dd 的核心功能就是“从输入源(if)读取原始数据,原封不动地写入输出目标(of)”,像一个二进制搬运工。

mkfs

mkfs(Make Filesystem)是 Linux 中用于 创建文件系统 的命令,相当于对磁盘或分区进行“格式化”。它会在目标设备(如分区、磁盘、镜像文件)上写入文件系统的元数据,使其能够被操作系统识别和使用。


基本语法

mkfs [选项] 设备或文件

或通过指定文件系统类型:

mkfs.文件系统类型 [选项] 设备或文件

例如:

mkfs.ext4 /dev/sdb1  # 将 /dev/sdb1 格式化为 ext4
mkfs.vfat /dev/sdc1  # 格式化为 FAT32

常见文件系统类型

文件系统 命令 适用场景
ext4 mkfs.ext4 Linux 默认文件系统(推荐)
ext3 mkfs.ext3 旧版 Linux 兼容
ext2 mkfs.ext2 极简需求(无日志功能)
XFS mkfs.xfs 大文件、高性能(企业级)
Btrfs mkfs.btrfs 支持快照、压缩(现代文件系统)
FAT32 mkfs.vfat U盘、跨平台(Windows/macOS/Linux)
NTFS mkfs.ntfs Windows 专用(需 ntfs-3g 包)

mkfs 命令参数详解

参数 说明 示例
-t fstype 指定要创建的文件系统类型(如 ext3, ext4, xfs, vfat 等) mkfs -t ext4 /dev/sdb1
filesys 目标设备文件名(如 /dev/sdb1)或镜像文件 mkfs.ext4 /dev/sdb1
blocks 指定文件系统的磁盘块数(一般自动计算,手动指定较少使用) mkfs.ext4 /dev/sdb1 204800(20万块)
-V 详细模式(显示操作过程) mkfs -V -t ext4 /dev/sdb1
fs-options 传递给具体文件系统的参数(需在 filesys 前指定) mkfs.ext4 -b 4096 /dev/sdb1

常见文件系统专用参数示例

1. ext4 文件系统
参数 说明 示例
-b block-size 指定块大小(如 1024, 4096 mkfs.ext4 -b 4096 /dev/sdb1
-L volume-label 设置卷标 mkfs.ext4 -L "mydata" /dev/sdb1
-m reserved-blocks-percent 保留空间百分比(默认5%) mkfs.ext4 -m 1 /dev/sdb1(设为1%)
-O feature 启用特性(如 encrypt, quota mkfs.ext4 -O encrypt /dev/sdb1
2. FAT/VFAT 文件系统
参数 说明 示例
-F fat-size 指定 FAT 类型(12, 16, 32 mkfs.vfat -F 32 /dev/sdc1
-I 强制格式化整个设备(无分区表) mkfs.vfat -I /dev/sdd
3. XFS 文件系统
参数 说明 示例
-f 强制覆盖现有文件系统 mkfs.xfs -f /dev/sdb2
-d agcount=N 设置分配组数量(性能调优) mkfs.xfs -d agcount=4 /dev/sdb2

常用操作示例

1. 格式化分区为 ext4(Linux 常用)

sudo mkfs.ext4 /dev/sdb1
  • 选项
    • -L:设置卷标(如 -L "mydata"
    • -m 0:减少保留空间(默认 5%,-m 0 设为 0% 以最大化可用空间)

我们将刚刚的testfile格式化为ext4格式:
在这里插入图片描述

2. 格式化 U 盘为 FAT32(兼容 Windows/macOS)

sudo mkfs.vfat -F 32 /dev/sdc1
  • -F 32:强制 FAT32 格式(默认可能格式化为 FAT16)

3. 格式化并启用 XFS(适合大文件)

sudo mkfs.xfs -f /dev/sdb2
  • -f:强制覆盖现有文件系统

4. 检查设备后再格式化

lsblk                     # 确认设备路径(如 /dev/sdb1)
sudo blkid /dev/sdb1      # 查看当前文件系统类型
sudo umount /dev/sdb1     # 先卸载(如果已挂载)
sudo mkfs.ext4 /dev/sdb1  # 再格式化

高级选项

1. 调整 inode 数量(适用于大量小文件)

sudo mkfs.ext4 -N 1000000 /dev/sdb1  # 分配 100 万个 inode

2. 启用文件系统加密(ext4)

sudo mkfs.ext4 -O encrypt /dev/sdb1

3. 指定块大小(block size)

sudo mkfs.ext4 -b 4096 /dev/sdb1  # 4KB 块(适合 SSD)

注意事项

  1. 数据会丢失!
    格式化会清空目标设备的所有数据,操作前务必确认设备路径。

  2. 必须先卸载分区

    sudo umount /dev/sdb1  # 卸载
    sudo mkfs.ext4 /dev/sdb1
    
  3. SSD 优化
    对 SSD 建议使用 ext4f2fs,并启用 TRIM:

    sudo mkfs.ext4 -E discard /dev/nvme0n1p1
    
  4. 修复误格式化
    如果误格式化,可尝试用 testdiskphotorec 恢复数据(但不保证成功)。


总结

操作 命令示例
格式化 ext4 sudo mkfs.ext4 /dev/sdb1
格式化 FAT32 sudo mkfs.vfat -F 32 /dev/sdc1
强制覆盖现有文件系统 sudo mkfs.xfs -f /dev/sdb2
设置卷标 sudo mkfs.ext4 -L "mydata" /dev/sdb1
优化 SSD sudo mkfs.ext4 -E discard /dev/nvme0n1p1

df

df 命令详解

df (Disk Filesystem) 命令用于显示 Linux 系统中文件系统的磁盘空间使用情况。它可以显示所有已挂载文件系统的可用空间和已用空间。

基本语法

df [选项] [文件或目录]

常用选项

选项 说明
-a 显示所有文件系统,包括虚拟文件系统
-h 以人类可读格式显示 (KB, MB, GB)
-H 类似 -h,但以 1000 为换算单位而非 1024
-i 显示 inode 使用情况而非块使用情况
-k 以 KB 为单位显示
-l 只显示本地文件系统
-P 使用 POSIX 输出格式
-T 显示文件系统类型
-t <类型> 只显示指定类型的文件系统
-x <类型> 排除指定类型的文件系统

常用示例

  1. 显示所有文件系统使用情况

    df
    
  2. 以人类可读格式显示

    df -h
    

    输出示例:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda1        20G  5.2G   14G  28% /
    tmpfs           1.9G     0  1.9G   0% /dev/shm
    
  3. 显示指定文件系统的使用情况

    df -h /dev/sda1
    
  4. 显示文件系统类型

    df -T
    
  5. 显示 inode 使用情况

    df -i
    
  6. 只显示 ext4 文件系统

    df -t ext4
    
  7. 排除特定文件系统类型

    df -x tmpfs
    

输出字段说明

字段 说明
Filesystem 文件系统对应的设备文件
Size 文件系统总大小
Used 已用空间
Avail 可用空间
Use% 使用百分比
Mounted on 挂载点

实用技巧

  1. 快速查看磁盘使用情况

    df -h --output=source,size,used,avail,pcent,target
    
  2. 按使用百分比排序

    df -h | sort -k5 -n -r
    
  3. 监控特定挂载点

    watch -n 1 'df -h /home'
    
  4. 结合 grep 过滤结果

    df -h | grep -v tmpfs
    

这个命令比较简单,我们举一个简单的例子:
在这里插入图片描述

df 命令是 Linux 系统管理员监控磁盘使用情况的重要工具,经常与 du 命令配合使用来分析和解决磁盘空间问题。

mount

mount 命令详解

mount 命令用于挂载文件系统到 Linux 目录树中的指定挂载点。它是 Linux 系统管理中最基础且重要的命令之一。

基本语法

mount [-选项] [设备] [挂载点]
mount [-选项] [-t 文件系统类型] [-o 挂载选项] 设备 挂载点

常用选项

选项 说明
-a 挂载 /etc/fstab 中所有文件系统
-t 指定文件系统类型 (ext4, ntfs, vfat 等)
-o 指定挂载选项 (多个选项用逗号分隔)
-l 显示已挂载设备及其标签
-v 显示详细执行过程
-r 以只读模式挂载
-w 以读写模式挂载 (默认)

常用挂载选项 (-o)

选项 说明
ro/rw 只读/读写挂载
remount 重新挂载已挂载的文件系统
noexec 不允许执行二进制文件
nosuid 忽略 suid/sgid 位
nodev 不解释设备文件
sync/async 同步/异步 I/O 操作
defaults 使用默认选项 (rw, suid, dev, exec, auto, nouser, async)
user 允许普通用户挂载
nouser 只允许 root 挂载 (默认)
loop 挂载镜像文件

常用示例

  1. 显示当前已挂载的文件系统

    mount
    

    mount -l
    
  2. 挂载设备到目录

    mount /dev/sdb1 /mnt/data
    

我们来试试:
在这里插入图片描述

  1. 指定文件系统类型挂载

    mount -t ext4 /dev/sdb1 /mnt/data
    
  2. 挂载 ISO 镜像文件

    mount -o loop ubuntu.iso /mnt/iso
    
  3. 挂载 USB 设备 (FAT32)

    mount -t vfat /dev/sdc1 /mnt/usb
    
  4. 挂载 Windows 共享 (CIFS/SMB)

    mount -t cifs //server/share /mnt/share -o username=user,password=pass
    
  5. 重新挂载为只读

    mount -o remount,ro /dev/sdb1
    
  6. 挂载所有 /etc/fstab 中的文件系统

    mount -a
    
  7. 挂载带特殊选项

    mount -o noexec,nosuid /dev/sdb1 /mnt/data
    

/etc/fstab 文件格式

/etc/fstab 文件用于定义自动挂载的文件系统,格式如下:

设备/UUID 挂载点 文件系统类型 挂载选项 dump fsck

示例:

/dev/sdb1 /mnt/data ext4 defaults 0 2
UUID=1234-5678 /mnt/usb vfat defaults 0 0

卸载文件系统

使用 umount 命令卸载:

umount /mnt/data

umount /dev/sdb1

常见问题解决

  1. 设备忙无法卸载

    fuser -vm /mnt/data  # 查看哪个进程在使用
    fuser -km /mnt/data  # 终止使用该挂载点的进程
    umount /mnt/data
    
  2. 挂载 NTFS 分区

    mount -t ntfs-3g /dev/sdb1 /mnt/ntfs
    
  3. 挂载时修复错误

    fsck /dev/sdb1
    mount /dev/sdb1 /mnt/data
    

mount 命令是 Linux 系统管理中不可或缺的工具,合理使用可以灵活管理各种存储设备和网络共享。


网站公告

今日签到

点亮在社区的每一天
去签到