自己动手写 Docker 系列 -- 5.2 实现查看运行中的容器
简介
在上篇中我们实现了将容器后台运行,本篇中我们将实现 docker 的 ps 命令,查看当前正在运行中的容器列表
源码说明
同时放到了 Gitee 和 Github 上,都可进行获取
本章节对应的版本标签是:5.2,防止后面代码过多,不好查看,可切换到标签版本进行查看
代码实现
实现该功能的主要思路如下:
1.在容器启动的时候,将容器的信息写到指定的目录的文件中
2.在查看正在运行中的容器时,读取存放容器信息文件的目录,获取所有的容器信息文件,便可以得到正在运行中的容器列表
3.容器退出的时候,将指定目录下的文件进行删除
核心思路就如上所示,总体来说是比较简单的,下面我们就开始看具体的代码实现
容器启动时,存储容器信息,退出时删除
在启动函数中,我们在启动时,添加存储容器信息的逻辑
首先我们定义好容器信息结构类,如下:
ContainerInfo 是容器信息类,存放容器的信息
定义了容器状态的常量,为后面做准备,DefaultInfoLocation 是约定的容器信息存放的指定目录,ConfigName 是约定的容器信息存储文件名
在 run 命令中,我们添加可选的-name 参数,来设置容器的名称
具体的 Run 函数逻辑如下:
存储容器信息的函数逻辑如下:
1.首先是生成运行时容器的基本信息
2.将其序列化成 JSON 存储在约定的文件中
如果没有传入容器名,则随机取名
退出时删除容器的逻辑比较简单,直接删除文件即可:
读取文件列表,显示正在运行中的容器
在上面的代码代码中,我们可以得到容器的信息存放在: /var/run/mydocker/{containerName}/config.json
我们遍历 /var/run/mydocker 便可以得到所有的容器目录,读取其下的 config.json 便可以得到容器信息
我们首先添加 main.go 中添加 ps 命令
在 main_command 添加 ps command
ps 命令的具体实现如下:
遍历 /var/run/mydocker 便可以得到所有的容器目录,读取其下的 config.json 便可以得到容器信息
然后在控制台上进行打印
运行测试
我们启动两个后台容器,一个有名字,一个没有,结果如下,很 nice
但目前还存在问题,如果是前台运行的容器,退出后,容器信息文件会随着删除,但后台运行的就不行,导致 ps 命令还是有些异常,会显示已经退出运行的容器
也是可能是我自己写的有问题,后面需要调整修复下
版权声明: 本文为 InfoQ 作者【萧】的原创文章。
原文链接:【http://xie.infoq.cn/article/ac467ff5772f3ca56f4597e46】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论