自己动手写Docker系列 -- 3.1构造实现run命令版本的容器

简介

通过对前面Linux的Namespace、Cgroups、Union File System的学习,对Docker实现的基础知识有了一点点了解,接下来就跟着作者开始编写

源码说明

同时放到了Gitee和Github上,都可进行获取

本章节对应的版本标签是:3.1,防止后面代码过多,不好查看,可切换到标签版本进行查看

思路整理

下图是《自动动手写docker》中这一章节的核心流程图,我们在跟着作者写的时候也是这个思路:

来源于:《自己动手写Docker》3.1章节

在学习的过程,根据自己的学习精简了下(是对于编写代码的精简)

  • 1.输入运行命令:如 run -ti /bin/sh
  • 2.解析参数:得到输入的参数
  • 3.创建并启动namespace隔离的容器进程:使用Linux的Namespace隔离进程环境
  • 4.容器内调用自己,挂载proc文件系统,完成运行

注:本章的代码运行一次后,再次运行会出现下面的错误提示:

{
   "level":"error","msg":"fork/exec /proc/self/exe: no such file or directory","time":"2022-03-05T08:51:07+08:00"}

此时,我们运行下面的命令后,再次运行就可以了,可能是挂载proc文件系统的影响

mount -t proc proc /proc

1.命令解析

在书中,使用了组件库进行实现,我们照抄即可:

文件: main.go

package main

import (
	"dockerDemo/mydocker/command"
	log "github.com/sirupsen/logrus"
	"github.com/urfave/cli"
	"os"
)

const usage = `mydocker is a simple container runtime implementation.
               The purpose of this projects is to learn how docker works and how to write a docker by ourselves
               Enjoy it, just for fun.`

func main() {
   
	app := cli.NewApp()
	app.Name = "mydocker"
	app.Usage = usage

	app.Commands = []cli.Command{
   
		command.InitCommand,
		command.RunCommand,
	}

	app.Before = func(context *cli.Context) error {
   
		log.SetFormatter(&log.JSONFormatter{
   })
		log.SetOutput(os.Stdout)
		return nil
	}

	if err := app.Run(os.Args); err != nil {
   
		log.Fatal(err
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值