这段 Bash 脚本实现了一个简单的容器管理工具,称为 bocker,类似于 Docker 的精简实现。以下是脚本的关键功能和核心解释:
全局配置:
1. 安全性设置:
set -o errexit -o nounset -o pipefail; shopt -s nullglob
• errexit:发生错误时脚本立即退出。
• nounset:引用未定义变量时会退出。
• pipefail:管道中任意命令失败会导致整个管道失败。
• nullglob:模式匹配无结果时返回空字符串而非模式本身。
2. 路径和资源配置:
btrfs_path='/var/bocker'
cgroups='cpu,cpuacct,memory'
• btrfs_path:存放容器和镜像的根路径,依赖于 Btrfs 文件系统。
• cgroups:为容器指定的控制组,限制 CPU 和内存等资源。
命令行参数解析:
• 支持形如 --key=value 的参数格式,通过以下代码解析:
[[ \(# -gt 0 ]] && while [ "\){1:0:2}" == '--' ]; do
OPTION=${1:2}
[[ \(OPTION =~ = ]] && declare "BOCKER_\){OPTION/=*/}=\({OPTION/*=/}" || declare "BOCKER_\){OPTION}=x"
shift
done
• 将参数存储为全局变量,前缀为 BOCKER_。
核心功能:
1. bocker_check:检查镜像或容器是否存在
function bocker_check() {
btrfs subvolume list "$btrfs_path" | grep -qw "$1" && echo 0 || echo 1
}
• 在 btrfs 文件系统中查找是否存在对应子卷(镜像或容器)。
2. bocker_init:从目录创建镜像
function bocker_init() {
uuid="img_$(shuf -i 42002-42254 -n 1)"
if [[ -d "\(1" ]]; then
[[ "\)(bocker_check "\(uuid")" == 0 ]] && bocker_run "\)@"
btrfs subvolume create "\(btrfs_path/\)uuid"
cp -rf --reflink=auto "\(1"/* "\)btrfs_path/$uuid"
echo "\(1" > "\)btrfs_path/$uuid/img.source"
echo "Created: $uuid"
else
echo "No directory named '$1' exists"
fi
}
• 使用 Btrfs 子卷为镜像分配唯一 ID。
• 复制目录内容并设置其来源(img.source 文件)。
3. bocker_pull:从 Docker Hub 拉取镜像
function bocker_pull() {
token="\((curl -sL -o /dev/null -D- -H 'X-Docker-Token: true' ...)"
registry='https://registry-1.docker.io/v1'
id="\)(curl -sL -H "Authorization: Token \(token" "\)registry/repositories/$1/tags/$2" | sed 's/"//g')"
...
}
• 获取镜像的授权 token 和层信息。
• 逐层下载并解压到临时目录,最终用 bocker_init 创建镜像。
4. bocker_run:运行容器
function bocker_run() {
uuid="ps_\((shuf -i 42002-42254 -n 1)"
[[ "\)(bocker_check "$1")" == 1 ]] && echo "No image named '\(1' exists" && exit 1
btrfs subvolume snapshot "\)btrfs_path/\(1" "\)btrfs_path/\(uuid"
...
cgexec -g "\)cgroups:\(uuid" \
ip netns exec netns_"\)uuid"
unshare -fmuip --mount-proc
chroot "\(btrfs_path/\)uuid"
/bin/sh -c "/bin/mount -t proc proc /proc && $cmd"
}
• 基于指定镜像创建 Btrfs 子卷(快照)。
• 设置网络命名空间、虚拟以太网对(veth)和路由。
• 使用 unshare 创建隔离的进程和挂载空间。
• 使用 cgroups 限制资源。
5. bocker_rm:删除镜像或容器
function bocker_rm() {
btrfs subvolume delete "$btrfs_path/\(1"
cgdelete -g "\)cgroups:/$1"
echo "Removed: $1"
}
• 删除对应 Btrfs 子卷并释放 cgroups 资源。
6. 其他命令:
• bocker_images:列出镜像。
• bocker_ps:列出容器。
• bocker_exec:在运行中的容器内执行命令。
• bocker_logs:查看容器日志。
• bocker_commit:将容器保存为新镜像。
总结:
bocker 是一个简化版的容器管理工具,利用 Btrfs 的子卷功能模拟 Docker 镜像和容器的管理。同时结合 Linux 的命名空间(netns)、cgroups 和 chroot 实现资源隔离和命令执行。
标签:bocker,uuid,容器,btrfs,代码,byGPT,Bocker,path,镜像 From: https://www.cnblogs.com/math/p/18566559/bocker