# container **Repository Path**: clouddea/container ## Basic Information - **Project Name**: container - **Description**: 用go语言写的最小容器实现,支持分层拉取dockerhub的镜像并启动。容器之间网络隔离并互通。支持限制容器使用的cpu和内存资源。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-06-08 - **Last Updated**: 2023-03-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 最小的容器实现 + [x] 实现了基本的镜像管理功能。镜像docker仓库分层拉取 + [x] 实现挂载基于overlay2的根文件系统,在新的名字空间中(通过chroot和namespace)中运行一个容器,执行入口命令 + [x] 实现在已运行的容器中通过exec 执行命令 + [x] 使用桥接网络(bridge)连接容器和宿主机 + [x] 使容器能够连接互联网 + [x] 使用cgroup v2 限制容器使用的资源 + [ ] 发布deb安装包 # 开发环境 建议的环境: + go 1.20 + ubuntu 22.04 ## 手工构建 ```shell go run . # 运行 go build . # 编译成可执行文件 # 单元测试 go test ./utils -v go test -run TestIPAdrrToInt ./utils -v go test -timeout 30s -run ^TestIPAdrrToInt$ cloudea.com/container/utils ``` # 命令 命令格式: ```shell container args... ``` 例如: ```shell container pull : # 接取镜像 container images # 查看镜像列表 container rmi : # 删除镜像 container run options : [...] #运行一个容器 container ps [-a] # 查看已有的容器 container rm # 删除容器 container exec -d|-it ... # 在运行中的容器中执行一条命令 container help # 查看命令帮助 ``` run 命令的选项: ```shell --name= 必选,容器的名字 --it 可选,容器前台运行 --cpu= cpu个数,可以为小数或整数 --mem= 内存大小,例如1G,128M ``` 编程建议:先下载到缓存,从缓存解压到容器目录。 # 存在的问题 + [已解决]. 三层镜像以上无法挂载 + 2. exec时,部分namespace不能设置:mnt、user、time + [已解决]. bridge 重启后消失问题 + [已解决]. mount 重启后消失问题 + [已解决]. 对连接互联网的网卡只选择默认的一个,不是很准,待解决 + 6. 删除容器持载问题优化 + 7. 守护进程脱离父进程的会话终端 与关闭文件描述符(普通文件和0,1,2三个标准输入输出文件)