docker源码编译安装步骤解析
来源:互联网 发布:慧莫森软件科技 编辑:程序博客网 时间:2024/06/13 22:36
原料:linux 系统,本人在Ubuntu16.04上运行,网上有一些关于docker编译流程的文章但是由于docker发展太快,网上的信息很快就过时了,本人参考以往的一些文章,加上亲自查看相关的源码基本了解了docker17.06源码的编译流程,供大家参考。
step 0:
安装docker,终端执行
sudo apt—get install docker.io
因为docker的源码需要在容器中进行编译,因此必须要有docker安装在host上。
step 1:
git clone https://github.com/docker/docker.git
下载最新的源码,本人下载的源码是17.06
step 2:
在源码的根目录执行make build,这一步会调用Makefile中的build分支代码:
build: bundles init-go-pkg-cache docker build ${BUILD_APT_MIRROR} ${DOCKER_BUILD_ARGS} -t "$(DOCKER_IMAGE)" -f "$(DOCKERFILE)"
这一步会使用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image,这个image包含了docker源码编译所需的依赖文件。这一步会下载很多依赖的文件需要访问很多国外的网站,由于国内的网络问题经常会因访问不到而失败。本人所在的公司可以访问国外的大部分网站,在两次编译源码时第一次一次成功,第二次经过不同时间的多次尝试才成功,不知道国内的网站是否能够靠多次尝试成功。
step 3:
执行make binary,这会调用Makefile中的binary分支代码:
binary: build ## build the linux binaries $(DOCKER_RUN_DOCKER) hack/make.sh binary
这一步是在上一步创建的image中创建容器并在容器中运行hack/make.sh
在hack/make.sh 中会调用/hack/make/binary,
在hack/make/binary中会调用/hack/make/binary-client 和binary-daemon,这两个脚本会分别调用同目录下的.binary文件,这个.binary是一个隐藏文件。在.binary文件中会执行go build 语句实现源码的最终的编译:
go build \ -o "$DEST/$BINARY_FULLNAME" \ "${BUILDFLAGS[@]}" \ -ldflags " $LDFLAGS $LDFLAGS_STATIC_DOCKER " \ $GO_PACKAGE
我们可以追踪GO_PACKAGE,发现它就是/docker/cmd/docker/docker.go和/docker/cmd/dockerd/docker.go两个文件,也就是docker源码的两个入口文件。要继续搞清楚源码都做了些什么就要从这两个文件入手一步步查看。
这里推荐一下较早的孙宏亮的docker源码解析,这本书是基于docker1.2.0来写的,跟17.06源码有较大的差异,但是还是有一定的参考价值,可以大概了解docker的基本框架。
- docker源码编译安装步骤解析
- Docker源码编译安装
- dubbox源码编译 安装 步骤
- 源码编译安装YouCompleteMe步骤
- MySQL for Linux源码编译安装步骤
- MySQL 5.7.9源码编译安装步骤
- Mysql安装步骤(1)源码编译
- 【docker基础知识】编译Docker源码
- docker 安装步骤
- Docker安装步骤
- centos7安装Docker步骤
- centos源码编译docker
- Docker源码编译
- docker源码编译问题
- 快速编译docker源码
- 如何编译Docker源码
- weka源码编译步骤
- mysql 源码编译步骤
- boost学习之BOOST_PP_REPEAT
- 摄像头相关知识
- Android安全开发之启动私有组件漏洞浅谈
- Android 布局小问题
- Linux系统如何看目录属于哪个磁盘分区
- docker源码编译安装步骤解析
- mysql监控工具innotop
- iOS Label 设置多种字体、颜色,支持换行符
- tf moving average
- Http请求中Content-Type讲解
- php 添加 redis 扩展模块
- IOS TextField 属性设置大全
- linux awk命令详解
- 在java web项目中配置freemarker