Docker 非docker环境中编译安装

myonlyzzy · · 2536 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

最近要修改docker的源码做一些开发,但是docker的官网给的编译方式是用docker提供的dockerfile文件编译一个docker 镜像然后在这个容器里面通过脚步编译docker。我们都知道1.11以后的docker实际上有docker dockerd  docker-containerd  runc 几个进程组成。如何我修改一次就要全部编译一遍多麻烦。所以我觉定自己go build 出docker的几个可执行文件。

1. git clone github.com/moby/moby  现在docker 的代码从docker/docker 迁移到了 /moby/moby。当然你编译之前还需要安装go。这个golang 官网都有按照说明安装就好。

2. 编译docker  就是docker client 。代码在 cmd/docker  下,我这里是1.13.x 分支。在你的gopath 路径下还有一个docker/docker 的目录你要保持 docker下的分支和moby 下的一致。不然在moby 下build 会出错。然后 go build  。会生成docker  bin文件。

3.编译 dockerd  编译dockerd 的时候需要安装许多包。可以根据错误提示安装需要的包。例如我是fedora25 。 go build 会报 libdevmapper.h 缺少。然后 dnf install   device-mapper-devel.x86_6 。

4. 编译containerd . git clone github.com/docker/containerd .    编译containerd 使用containerd 的make file 来编译生成。 编译完以后会生成 containerd-shim ,containerd。  具体参考 containerd 的README。

5.编译生成runc 。runc是最终启动容器的工具,可以说容器的核心。实际上没有 dockerd 也是发送命令到containerd  containerd 再 启动 containd-shim containerd-shim 再调用runc 来启动容器 停止容器等容器运行生命周期的各种操作。其实没有前几个进程,可以直接发送数据给runc 启动容器。当然了要符合oci的标准。具体可以参考runc项目的readme runc 现在在 https://github.com/opencontainers/runc。docker 变曾经的libcontainer贡献出来改了个名字变成cncf下的runc 项目。 runc 编译 就go build 一下。具体看github的 readme 写的非常详细。

现在docker 需要的5个bin文件全部都编译生成完成。 分别是docker   dockerd  containerd  containerd-shim  和runc 。编译这些可执行文件主要是为了方便我调试docker  代码。后面我会修改docker dockerd   containerd 等 。从一条docker run  看 数据如何在 这几个进程间流动。如何互相调用。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:myonlyzzy

查看原文:Docker 非docker环境中编译安装

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2536 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传