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 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 5,784评论 0 7
  • 目标 这篇博客的目标是实现如下命令. 源码: 代码下载git checkout 实现 实现run方法 根据前面博客...
    nicktming阅读 5,587评论 0 0
  • 简介 此项目是一个模拟公民身份信息链的区块链项目 github 地址: https://github.com/ak...
    CrazyWolf_46a9阅读 12,817评论 0 0
  • 最近不得不说的就是延禧攻略,起初没人在意却出乎意料的火了。就算你再不经意也会在某些网页看到它的消息,也会在某些...
    可妞妈咪阅读 1,449评论 1 2
  • 产品体验报告:猫眼电影 ...
    半瓶醋KU阅读 9,810评论 0 13