Docker源码学习进度(1)

1.编译最为简单的Docker

①安装GO

其中包括,下载go的安装,并且加安装路径存入,$HOME/.bashrc中,使用go version来查看安装是否成功。

②配置GOPATH

将export GOPATH=/go 加入到./bashrc中

这样其代码路径都会到$GOPATH/src/github . com/xianlubird/mydocker 中,所有操作就在mydocker中进行。

③下载docker最为简单的版本

git clone https://github . com/xianlubird/mydocker.git

git checkout code - 3.1

④在mydocker目录下,输入命令go build进行编译,此时会生成mydocker可执行文件

⑤在mydocker目录下,输入./mydocker run -ti /bin/sh运行,此时会进入新的sh中

2.最为简单的docker的运行过程

①从main函数开始

    main函数创建了一个app结构,app结构,并初始化app.Name与app.usage

app.Commands以及app.Before.最后调用app.run函数。

②进入app.run函数

注:这里的解析过程是比较麻烦的一项,解析的具体过程,见FlagSet.Parse源码.解析以后,其解析内容放在context.flagset中的args与actual中。

    run中首先会解析argv, 这里的flag指的是如 -ti之类的。之后会调用app.Before

再调用app.Command.

③ 在调用app.Command,先调用runCommand

在runComand中调用函数run,再在run中调用NewParentProcess.

这时候fork出来的进程,是与/proc/self/exe相同的进程

再调用start()函数,启动第一个command,也就是init.

③ 在调用app.Command,再调用initCommand

在initCommand中先挂载proc,然后将通过syscall.exec将inti用/bin/sh替换掉

你可能感兴趣的:(Docker源码学习进度(1))