RustROS · 2026-10-27 · 主线 abccc9c

M7b 报告:Docker 式前端(docker 和 docker compose)

RustROS 上有了 docker 命令:导入镜像、运行和管理容器、在容器里执行命令,以及用 compose 文件管理一组服务。第一目标已经在测试机上达到:docker compose up -d 起一个 Debian 13 服务,docker exec -it 进到 bash 里 apt update && apt install -y curl,curl 访问外部网站成功;compose down 清理干净,再 up 照常。只改端口时容器不重启,只换映射。

回归测试(KVM 测试机)0 失败新增 docker 测试(全套里 734 s);单元测试 213 项;转发 TCP 19.4 / 19.4 Gbit/s,64 B 364 / 377 kpps,和之前一样
第一目标验收全部通过docker_test 60 多项:run / exec / 卷 / 端口;compose up、exec -it、apt、curl、只改端口、两个服务各用一个宿主地址的 80 端口、down 后再 up
内核405,504 字节比 397,312 多 8 KiB:/sys/rustros 的请求应答、进程进入实例、按路径启动程序、实例启动时挂卷
这次更新要重启一次内核和 api 改了:所有模块重装;发布清单新增“程序”:docker、images

M7b做了什么

步骤内容验收
M7b.1 控制通道和卷/sys/rustros:VFS 做的小文件系统,只给宿主机的 root:模块设置(读、写、写空值删除)、模块状态、实例信息(状态、1 号进程、地址、启动时间、用量、预算)、宿主机地址,以及 instances/<id>/enter(写入的进程进入那个实例,描述符不变:docker exec 就是这样保住终端的)。要内核回答的读写先返回 ERESTART,进程等待,内核在主循环里回答后它重做一次。绑定挂载(目录和单个文件,可只读),mount(2) 的 MS_BIND,容器设置 ct.<名>.vol单元测试:设置读写删、列表、实例信息、进入、权限、关闭时请求作废、交接;绑定挂载的读写、只读、..、宿主机仍打开时删除、交接。KVM:containers_test 加了 /sys/rustros 和卷的检查
M7b.2 docker用户态程序(Rust、静态 musl),以 images 为库:run / create / ps / start / stop / restart / rm / exec / logs / inspect / stats,load / images / rmi / tag。镜像第一次用时压平成只读层;每个容器自己的 /etc/hosts、/etc/hostname、/etc/resolv.conf(文件绑定挂载);1 号进程的程序按镜像的 PATH 找docker_test:前台运行的输出和退出码、--rm、-d、端口从测试机连进容器、环境变量 / 工作目录 / 用户、卷可写和只读、exec 的退出码、logs --tail、stop / start / restart、rm -f、被占用的镜像不能删、和宿主机服务冲突的端口被拒绝
M7b.3 composecompose.yaml / docker-compose.yml(yaml-rust2 解析,MIT/Apache):image、command、entrypoint、environment、env_file、ports(长短两种写法)、volumes(绑定)、restart、hostname、working_dir、user、内存和 CPU 限制、network_mode: host、depends_on、container_name;变量替换和 .env;不认识的键给警告。up -d、down、ps、logs、exec、start、stop、restart、config。只改端口时只改映射(容器的摘要不含端口)只改端口后 1 号进程不变,容器里的服务一直在跑,新地址立刻能连,旧地址不再接受新连接;两个服务同时用 10.0.2.15:8080 和 10.0.2.16:8080;b 在 /etc/hosts 里找得到 a
M7b.4 随发布分发发布清单新增 “programs”(docker、images,带各自需要的模块);pkg install docker 装到 /usr/lib/rustros/;rustros-update.py HOST program-install;第三方声明加上用户态程序的依赖和 musl(都不是 GPL);install.sh 的 --apps docker 带上它需要的模块docker_test 用 program-install 装进去,再从机器上运行
M7b.5 运行方式和文档控制台命令 docker ... / images ...(在自己的伪终端上,按键直通,所以控制台上 exec -it 也能交互);rustros-update.py HOST docker ...(本地是终端时交互,否则收集输出,退出码和 docker 一样);与 Docker 的不同写在 docs/docker-differences.mddocker_test 全程用 rustros-update.py docker;exec -it bash 在终端上交互

内核这次内核改了什么(按规则报告)

差异和 Docker 不一样的地方(摘要)

遗留还没有的

缺口打算
从镜像仓库拉取、docker save / build按 M6 的决定以后做
前台 docker run -it(1 号进程接终端)需要内核把终端交给实例的 1 号进程,以后做
容器里 exec 的终端名字(tty)让进入实例的进程的终端在实例的 /dev/pts 里可见
用户编号映射(卷里的文件属主)和 LXC 式前端一起
outbound_test 在整套并行跑时失败过一次,单独跑通过(smartflow 扫描判定的时间余量)再出现就放宽余量

请你确认

M7b 是否发布:内核改了,部署时重启一次,所有模块重装;发布清单新增程序 docker 和 images(部署后在机器上 pkg install docker,或用 program-install)。之后按计划是 M8(验收和整理)。