![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
从零自制docker
文章平均质量分 92
看星猩的柴狗
IT爱好者一枚,菜狗CTF-PWN手,记录自己的学习经历,请大佬多多指点
展开
-
从零自制docker-15-【实现 mydocker run -d 支持后台运行容器】
然后之前在后面发现upper中出现root是调用相关命令就会出现root,但当时没有啥修改的文件,这次全的busybox发现出现了下面的这个,那么确实就是因为调用命令引起的日志记录的变化导致的。当时是容器在挂载前就找相关命令,找到的这个是宿主机上的,但我们要的是在pivoroot后的根目录下的相关命令的路径,所以后面运行这个宿主机上的路径会显示路径找不到,因为此时是以容器的根目录为相对参考。加入的,因为我最后关闭了主进程最后自动删除cgroup的函数),最终可以看到top进程在后台运行。原创 2024-05-27 15:22:14 · 1161 阅读 · 0 评论 -
从零自制docker-14-【实现 mydocker commit 打包容器成镜像】
这个归档文件内部的所有文件和目录结构,每一项占一行,但并不会展开或提取这个归档文件的实际内容。返回的是一个字节切片,包含命令执行后的输出文本。piveroot切换工作目录到/merged后,通过docker commit将此时工作目录的文件系统保存下来,使用tar包将该文件系统打包为tar文件。它接受一个可变数量的字符串参数,第一个参数是命令名,后面的参数是传递给该命令的各个选项和参数。: 这是一个变量,代表要创建的归档文件的名称(包括路径)。综上所述,这段代码的功能是:在Go程序中执行一个命令,使用。原创 2024-05-25 16:44:18 · 896 阅读 · 0 评论 -
从零自制docker-13-【实现 mydocker run -v 支持数据卷挂载】
注意由于先挂载overlayfs再绑定挂载,此时绑定挂载点已经不属于overlayfs了,所以在绑定里面的修改将不会有overlayfs的机制(绑定挂载点如果在lower,但此时由于是绑定挂载,相当于并没有挂载到overlayfs,所以overlayfs机制对该挂载点不会生效,相当于lower层绑定挂载点变化,但upper层不会变化,merged绑定挂载点变化)此时先卸载绑定挂载点,因为绑定挂载点在overlayfs里面,如果先卸载overlayfs就会发现里面还有一个挂载点,此时卸载就会失败,原创 2024-05-14 09:40:56 · 935 阅读 · 0 评论 -
从零自制docker-12-【overlayfs】
如果执行过程中有错误,这个错误(一般命令执行失败)会被返回。参数之间以逗号分隔,并且每个参数都是一个单独的字符串,即使是那些在命令行中看起来像是一个整体的参数(例如带有空格的文件路径),也需要作为一个整体字符串传递。: 执行不同命令时,主要的格式差异在于命令本身的名称以及它需要的参数。每个命令根据其功能会有不同的参数需求和格式。这不改变基本的命令格式,但会影响命令执行的环境。这不影响命令的格式,但影响其交互方式。),这些选项的使用和它们后面的参数(如果有的话)也是。命令,并且它会自动执行。原创 2024-05-11 21:46:42 · 882 阅读 · 1 评论 -
从零自制docker-7-【Union File System】(Union File System overlay 挂载 docker 的overlay2 镜像和容器和overlay2 疑问点)
然后分别删除merged里面1.txt的内容,发现diff多了一个whiteout的1.txt文件,修改merged里面2.txt的内容,发现diff多了一个修改后的2.txt文件,在到merge新建一个4.txt,upper也出现一个一模一样的4.txt。下还能存放init层,和容器层,一个完整的容器分为3层:镜像层、init层和容器层,当docker创建一个容器时候就会创建init层和容器层。lowerdir :只读层,对应到当前层之下的所有层的文件。upperdir:读写层,当前层的文件。原创 2024-04-02 20:16:30 · 872 阅读 · 0 评论 -
从零自制docker-11-【pivotRoot切换实现文件系统隔离】
由于新根目录肯定在原根目录的挂载点中,为了使得二者不在同一个挂载点中,于是重复绑定,那么会使得当前进程认为新根目录所在的挂载点在新根目录。综上所述,这条命令的作用是将当前进程的整个文件系统挂载树(包括根目录和所有子目录)设置为私有挂载,确保在当前进程及其后代进程的挂载命名空间内进行的挂载操作不会影响到宿主机或其他进程的命名空间。下图是将当前进程根目录挂载点设置为私有和在mount namespace中直接启动后,挂载proc到当前容器内的/proc,发现此时并没有覆盖原主机上的/proc。原创 2024-04-20 17:19:37 · 1070 阅读 · 1 评论 -
从零自制docker-10-【cgroup进行容器资源限制】
例如,如果父 cgroup 只允许使用 CPU 0 和 CPU 1,那么即使子 cgroup 可以使用所有 CPU,但 cpuset.cpus.effective 也只会显示 CPU 0 和 CPU 1。假设我们有两个 cgroup,“D”和“E”,我们希望“D”获得三倍于“E”的 CPU 时间,但我们还希望限制“D”在 2 秒内只能使用 1 秒的 CPU 时间。这意味着,即使当前 cgroup 可以使用所有 CPU 资源,但由于父 cgroup 的限制,它实际只能使用 CPU 0 和 CPU 1。原创 2024-04-14 22:11:04 · 876 阅读 · 0 评论 -
从零自制docker-9-【管道实现run进程和init进程传参】
os.NewFile 函数接收两个参数,第一个参数是一个 uintptr 类型的值,表示一个已存在的文件描述符;第二个参数是一个字符串,用于指定文件的名称(在这个上下文中,通常是一个描述性的名称,而非实际路径)。这样做的目的是在执行外部命令时,将这些文件描述符传递给子进程,以便子进程能够访问和操作这些文件资源,比如进行进程间通信(IPC)等。包中的一个结构体类型,它代表一个打开的文件对象,可以是常规的磁盘文件,也可以是管道、终端设备等其他类型的I/O资源。是你想执行的命令或程序的名字(不包含其完整路径)。原创 2024-04-12 22:47:26 · 1112 阅读 · 0 评论 -
从零自制docker-8-【构建实现run命令的容器】
可选的额外挂载选项,通常是一个字符串,格式取决于所使用的文件系统类型,对于一些文件系统,可能包含挂载选项的列表或其他特定信息,对于不需要额外数据的文件系统,可以传入空字符串。失败(例如由于找不到要执行的程序或权限问题),它会返回一个错误,但这种情况下的“返回”实际上已经是当前进程内的紧急错误处理逻辑了,而不是原Go程序的逻辑继续执行。可执行程序的包,编译完成后会生成一个可执行文件、静态库的包编译之后会生成一个.a为后缀的文件(在$GOPATH/pkg/里),自己不能执行只能被可执行包引用。原创 2024-04-08 22:34:51 · 855 阅读 · 1 评论 -
从零自制docker-6-【Linux Cgroups】(Cgroups mount cgroup文件系统中的相关组件 相关演示 ubuntu22.04 docker使用cgroup)
在 Ubuntu 22.04 中,Docker 容器的 cgroup 位于 /sys/fs/cgroup 目录下的 system.slice 目录中。ubuntu22.04对应的cgroup设置的当前的进程的所占内存限制大小在memory.max中,查看显示max代表没有限制。此时当前进程的cgroup层次变化为/,代表在cgroup文件系统的根节点,因为是将其进程ID写到了根cgroup。通过mount命令可以查看当前系统中已挂载的文件系统信息,使用mount命令即可显示当前挂载点和设备的对应关系。原创 2024-03-27 21:34:11 · 922 阅读 · 2 评论 -
从零自制docker-5-【USER Namespace NETWORK Namespace】
即进程运行在一个新的namespace中,且该namespace中的User ID和Group IDA在该namespace内外可以不同,可以实现在namspace的用户是root但是对应到宿主机并不是root。即进程在namespace中拥有独立的(虚拟的)网络设备。发现在network namespace的进程没有网络设备(可能默认就是没有,需要相关初始化),宿主机依然存在网络设备。Cloneflags增加一个syscall.CLONE_NEWUSER即可。原创 2024-03-26 09:35:32 · 273 阅读 · 0 评论 -
从零自制docker-4-【PID Namespace MOUNT Namespace】
在你的房间里,你可以挂上你喜欢的画(就像在你的 mount namespace 中挂载文件系统),并且你可以随时更换或者取下这些画(就像在你的 mount namespace 中卸载文件系统)。在 mount -t proc proc /proc 这条命令中,-t proc 指定了我们要挂载的文件系统类型,这里是 proc。所以,mount -t proc proc /proc 这条命令的意思就是:“挂载一个类型为 proc 的文件系统,该文件系统的设备名为 proc,并把它挂载到 /proc 目录”。原创 2024-03-17 20:16:21 · 1179 阅读 · 0 评论 -
从零自制docker-3-【IPC Namespace】(System V IPC和POSIX IPC Namespace cmd.Run() 啥是消息队列 消息队列相关结构 ipcs -q ipc)
当你创建了一个新的IPC namespace后,你实际上是在现有的操作系统中创建了一个隔离的小社区,进程可以在这个小区内自由地传递信息,而外面的进程则不能干预。这时,学校的信息发布部门就可以通过这个邮箱号码(msqid)来发送通知,而其他学校的部门或者服务如果知道这个邮箱号码,也可以到"邮局"拿这个邮箱号码来接收通知。为了完成这项任务,他们会用到邮局提供的服务,比如信箱、包裹传送带、或者邮递员(这些对应于IPC的通信方式,如消息队列、信号量、共享内存等)。这样一来,每个社区内的通信都是独立和私密的。原创 2024-03-06 23:53:27 · 1023 阅读 · 0 评论 -
从零自制docker-0-【前置知识-go语言快速入门】(package main 变量 运算符 分支 循环 函数 数组 slice map 结构 指针 方法 接口 错误处理 并发)
在上面的示例中,我们定义了一个squareRoot函数,它接收一个float64类型的参数并返回一个float64类型的平方根值,以及一个error类型的错误对象。switch语句的自动 break: 在Go语言中,switch语句中的每个case自动地包括了一个break语句,不需要显式地使用break来阻止执行下一个case。而在C语言中,switch语句的条件表达式只能是一个整型或字符型的值。需要注意的是,通过在if语句的条件部分进行变量赋值,可以限制变量的作用域,并且该变量仅在if语句块中有效。原创 2024-03-04 23:58:46 · 866 阅读 · 0 评论 -
从零自制docker-2-【UTS Namespace】(UTS Namespace unshare命令和unshare系统调用 root用户没有普通用户go命令的解决 使用sudo go 代码解析)
创建的新进程以及它之后的所有子进程都会包含在指定的命名空间中。unshare 命令: unshare 是一个用于从命令行运行的用户级别工具,它用来在无需启动新的 init 进程的情况下,创建独立的命名空间。总体来说,上述代码的作用是将命令的输入、输出、错误输出流重定向到当前的终端,这样运行该命令时用户可以通过终端与命令交互,并且可以在终端上看到命令的输出和错误信息。标准错误是用来输出错误信息的,通过将标准错误设置到 os.Stderr,命令的错误信息将被直接显示在当前的错误输出设备上,通常也是终端。原创 2024-03-03 20:29:14 · 1202 阅读 · 0 评论 -
从零自制docker-1-【环境配置 docker go介绍与安装】
Docker可以看作是一种极其轻巧的“虚拟机”,它允许你将一个或多个程序及其运行环境打包在一起,形成一个标准化的单元,这个单元可以在任何支持Docker的系统上运行,不受底层操作系统的限制。如果用更贴近生活的例子来解释,Docker就像是软件世界中的“集装箱”。集装箱在物流行业中用于标准化运输,它可以装载货物,保护里面的物品不受外界环境影响,而且可以用同一种方式在全球范围内快速装卸和运输。原创 2024-03-02 23:38:15 · 1135 阅读 · 0 评论