当前位置:首页 > 技术 > 正文内容

构建简易容器运行时

访客 技术 2026年6月22日 5

容器本质上是通过内核隔离机制实现的受限进程环境。本实现利用Linux命名空间、cgroups和文件系统隔离技术构建轻量级容器运行时。

核心架构

int main(int argc, char **cmd_args) {
    if (argc < 2) {
        fprintf(stderr, "Usage: %s run|exec|ps [args]\n", cmd_args[0]);
        return 1;
    }
    if (strcmp(cmd_args[1], "run") == 0) {
        launch_container(cmd_args+2);
    } else if (strcmp(cmd_args[1], "exec") == 0) {
        attach_container(cmd_args+2);
    } else if (strcmp(cmd_args[1], "ps") == 0) {
        system("ls containers");
    } else {
        fprintf(stderr, "Invalid command\n");
        return 1;
    }
    return 0;
}

文件系统隔离

void prepare_fs(char **params) {
    char ts[20];
    get_timestamp(ts);
    char img_path[256], ctr_path[256];
    sprintf(ctr_path, "containers/%s", ts);
    sprintf(img_path, "images/%s", params[0]);
    
    mkdir(ctr_path, 0755);
    mkdir("runtime/tmpwork", 0755);
    char mnt_cmd[512];
    sprintf(mnt_cmd, "mount -t overlay overlay -o lowerdir=%s,upperdir=%s,workdir=runtime/tmpwork runtime/%s",
            img_path, ctr_path, ts);
    system(mnt_cmd);
    params[0] = ts;
}

OverlayFS实现分层存储:底层镜像只读,容器修改通过上层目录实现。文件操作遵循写时复制原则,确保基础镜像不变性。

进程隔离与资源限制

void create_isolated_process(char **args) {
    int ns_flags = CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | 
                  CLONE_NEWNET | CLONE_NEWIPC;
    char root_path[256];
    sprintf(root_path, "runtime/%s", args[0]);
    args[0] = root_path;
    
    pid_t child_pid = clone(container_entry, 
                           malloc(4096)+4096, 
                           ns_flags | SIGCHLD, 
                           args);
    
    setup_cgroups(child_pid);
    config_network(child_pid);
    waitpid(child_pid, NULL, 0);
    umount(root_path);
}

容器初始化

int container_entry(void *params) {
    char **args = (char **)params;
    chroot(args[0]);
    chdir("/");
    mount("proc", "/proc", "proc", MS_NOEXEC|MS_NOSUID|MS_NODEV, NULL);
    mount(NULL, "/", NULL, MS_PRIVATE|MS_REC, NULL);
    
    setenv("PATH", "/bin:/usr/bin", 1);
    setup_container_network();
    execvp(args[1], args+1);
    return 1;
}

clone()创建具有独立命名空间的新进程。chroot()限制文件系统视图,proc挂载提供进程信息隔离。

网络配置

void setup_veth(pid_t pid) {
    char cmd[128];
    sprintf(cmd, "ip link add vhost-%d type veth peer name vctr", pid);
    system(cmd);
    sprintf(cmd, "ip link set vctr netns %d", pid);
    system(cmd);
    sprintf(cmd, "ip link set vhost-%d up", pid);
    system(cmd);
}

void setup_container_netif() {
    system("ip link set lo up");
    system("ip link set vctr up");
    system("ip addr add 172.18.0.2/16 dev vctr");
    system("ip route add default via 172.18.0.1");
}

veth设备对连接容器与主机网络,网桥模式实现跨容器通信。IP配置确保容器获得独立网络标识。

资源管控

void limit_resources(pid_t pid) {
    char path[128];
    sprintf(path, "/sys/fs/cgroup/cpu/ctr_%d", pid);
    mkdir(path, 0755);
    
    sprintf(path, "%s/tasks", path);
    FILE *f = fopen(path, "w");
    fprintf(f, "%d\n", pid);
    fclose(f);
    
    sprintf(path, "/sys/fs/cgroup/cpu/ctr_%d/cpu.cfs_quota_us", pid);
    f = fopen(path, "w");
    fprintf(f, "20000");
    fclose(f);
}

cgroups通过文件系统接口实现CPU配额控制,限制容器资源使用上限。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。