RustROS 上有了 docker 命令:导入镜像、运行和管理容器、在容器里执行命令,以及用 compose 文件管理一组服务。第一目标已经在测试机上达到:docker compose up -d 起一个 Debian 13 服务,docker exec -it 进到 bash 里 apt update && apt install -y curl,curl 访问外部网站成功;compose down 清理干净,再 up 照常。只改端口时容器不重启,只换映射。
| 步骤 | 内容 | 验收 |
|---|---|---|
| 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 compose | compose.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.md | docker_test 全程用 rustros-update.py docker;exec -it bash 在终端上交互 |
Vfs 加了 mount_bind、take_requests / answer(/sys/rustros 的请求);SysReq / SysAns;InstanceSpec.binds、InstanceInfo.addr / started;Admin::program_install,Admin::spawn 的镜像为空时按路径运行机器上的程序;updater 新命令 'Y'。VFS 交接格式 6。docker load -i)、build、save、具名卷、前台 run -it、随机宿主端口。docker exec -it 用的是 docker 自己的终端:程序认得出是终端,但 tty 命令说 “not a tty”。| 缺口 | 打算 |
|---|---|
| 从镜像仓库拉取、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(验收和整理)。