2 回答

TA贡献1784条经验 获得超9个赞
她正在通过这样做来创建一种容器:
她将执行 main.go 并传递要在容器中执行的命令
为此,她运行了一个执行 run() 函数的进程
在 run() 函数中,她准备了一个要分叉的进程,该进程将执行 child() 函数
但在实际分叉之前,通过 syscall.SysProcAttr,她配置了一个新的命名空间:
“unix 分时”(syscall.CLONE_NEWUTS)这本质上将允许在子进程中有一个单独的主机名
PIDs (syscall.CLONE_NEWPID) 这样在她正在创建的“容器”中,她将拥有从 1 开始的新 PID
mounts (syscall.CLONE_NEWNS) 将使“容器”拥有单独的挂载
接下来她执行 fork (cmd.Run())
在分叉的进程中,child() 函数在这里执行:
她通过 cg() 准备了一个控制组,它将限制“容器”可用的资源,这是通过在 /sys/fs/cgroup/ 中编写一些适当的文件来完成的
接下来,她使用传递给 main.go 的 args 准备要执行的命令
她使用 chroot 到 /home/liz/ubuntufs 下的新根目录
她monuts特殊fs proc和另一个临时fs
最后,她执行作为参数提供给 main.go 的命令
在从头开始的视频容器中,她很好地呈现了这一切。在那里,她在容器中执行了一个 bash,该容器看到了新的 PID,有一个新的主机名,并且限制为 20 个进程。
为了让它工作,她需要在 /home/liz/ubuntufs 下有一个完整的 ubuntu fs 克隆。
要带回家的 3 个关键点是容器(以及她的“容器”)本质上是这样做的:
使用命名空间来定义容器将看到的 PID/挂载(在这个容器示例中她没有处理网络)
使用 chroot 将容器限制为文件系统的一部分
使用 cgroups 来限制容器可以使用的资源

TA贡献1831条经验 获得超9个赞
由于我缺乏 GO 经验以及对自定义 docker 容器的经验有限,我无法确认此代码的作用。
虽然这不是直接回答标题中的问题,但我想提供一个答案,帮助您学习 docker 的基础知识以帮助您入门。
你对容器的理解是正确的。尝试查找使用您熟悉的语言的更简单示例的教程。
一个让您入门的简单示例是创建一个您喜欢的 linux 操作系统的容器,将 docker 容器附加到您当前的终端,然后在容器中运行一些特定于操作系统的命令(例如在容器中安装软件或任何 linux 命令)
- 2 回答
- 0 关注
- 185 浏览
添加回答
举报