百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Docker编译流程、代码框架分析、自定义docker功能

ztj100 2025-02-06 17:13 13 浏览 0 评论

Docker编译流程与代码框架分析

所有文章皆可以在以下链接中找到:https://github.com/qwe624758472/Learning_set/tree/master/BookNote

Docker整体编译打包教程

环境搭建

docker的编译,需要在宿主机预先安装docker软件。因为编译docker的源码时,会构建一个docker镜像并运行,在这个容器里面进行build操作。由于这个容器已经包含了go语言环境,故宿主机无须额外安装golang。
宿主机系统:ubuntu
宿主机docker版本:Docker version 19.03.8, build 1b4342cd4c

下载编译源码

docker的github官方网站为:https://github.com/docker/docker-ce/。
docker以每月发布一个版本的节奏进行开发。命名规则为:
年份-月份-ce,其中ce表示社区版本。截至本文撰写时,最新版本为v17.12.0-ce,但下一版本v18.01.0-ce-dev已经处于开发阶段(带dev表示开发阶段),本文编译得到的版本即为v18.01.0-ce-dev
发行版本下载地址:https://github.com/docker/docker-ce/releases。
本文在
/home/latelee/docker/dev目录进行,请根据实际情况修改目录。
下载源码:

git clone https://github.com/docker/docker-ce
##或者
git clone https://gitee.com/ruog/docker-ce.git
123

进入docker-ce目录:

cd docker-ce
1

切换到最新的tag:

git checkout -b v18.01.0-ce
1

最后编译通过用的该命令:

在/home/hao/docker_work/docker-ce文件夹下执行该命令:

make  VERSION=18.01.0-ce-dev ENGINE_DIR=/home/hao/docker_work/docker-ce/components/engine CLI_DIR=/home/hao/docker_work/docker-ce/components/cli deb

make  VERSION=18.01.0-ce-dev ENGINE_DIR=/root/docker-ce/components/engine CLI_DIR=/root/docker-ce/components/cli deb
123

如果编译不通过,试试make clean.

命令解释:
该命令指定了版本号和docker组件的目录(VERSION、ENGINE、CLI分别指版本号、docker引擎、docker命令行),同时指定了要编译的系统版本(deb指编译所有debian平台包,ubuntu16.04代号为xenial).

大约经过半小时(github上下载速度为3m/s的情况下),编译成功。最终生成的deb包位于:components\packaging\deb\debbuild\ubuntu-xenial

和其他各deb下的版本文件夹中.

若因为github下载速度太慢导致不能编译通过时

修改下列文件,将文件中的github代码替换成gitee代码库:

./components/packaging/plugins/app.installer
./components/packaging/plugins/buildx.installer
./components/engine/hack/dockerfile/install/proxy.installer
./components/engine/hack/dockerfile/install/runc.installer
./components/engine/hack/dockerfile/install/tini.installer
./components/engine/hack/dockerfile/install/gotestsum.installer
./components/engine/hack/dockerfile/install/tomlv.installer
./components/engine/hack/dockerfile/install/golangci_lint.installer
./components/engine/hack/dockerfile/install/rootlesskit.installer
./components/engine/hack/dockerfile/install/dockercli.installer
./components/engine/hack/dockerfile/install/containerd.installer
./components/engine/hack/dockerfile/install/vndr.installer
./components/engine/hack/dockerfile/install/shfmt.installer
12345678910111213

以./components/packaging/plugins/app.installer 为例, 修改为如下图所示代码库:

Docker-cli编译教程

下载docker-ce代码:

git clone https://github.com/docker/docker-ce
##或者
git clone https://gitee.com/ruog/docker-ce.git
123

进入docker-ce/components/cli/目录下执行下面命令,编译docker-cli的二进制文件.

make -f docker.Makefile binary
1

编译好的二进制文件在

docker-ce/components/cli/build/docker-linux-amd64
1

将docker-linux-amd64替换已经安装在/usr/bin/docker 再次运行docker就为新编译的docker程序.

可以使用docker version查看docker版本.

Docker-ce编译流程分析

从主目录Makefile分析得, 编译deb包,会跳转到/components/packaging/下执行make deb

PACKAGING_DIR:=$(CURDIR)/components/packaging
.PHONY: deb
deb: #### build deb packages
	$(MAKE) VERSION=$(VERSION) CLI_DIR=$(CLI_DIR) ENGINE_DIR=$(ENGINE_DIR) -C $(PACKAGING_DIR) deb
1234

进入到components/packaging/下,查看Makefile, 发现检测cli和engine代码,同步分支.

创建src/github.com/docker/ 文件夹, 将components/cli拷贝到components/packaging/src/github.com/docker/下, 将components/engine/拷贝到components/packaging/src/github.com/docker/下,并改名成docker

然后进入到components/packaging/deb/下执行make deb

将components/packaging/src/github.com/docker/cli和engine打包成cli.tar.gz和engine.tar.gz放在components/packaging/deb/sources/下.

修改Dockerfile中github.com网站地址到gitee时,需要删除src/github.com/docker/文件夹下的docker. 和packaging/deb/sources/engine.tgz后,重新生成.

##编译脚本流程梳理:
components/packaging/deb/
	Makefile    
		运行ubuntu-xenial/Dockerfile  构建docker给环境.
		运行docker run 启动镜像并挂载组件代码.
		运行同目录下 build-deb脚本.
		
		components/packaging/deb/common/rules:  override_dh_auto_build: 
			./hack/make.sh dynbinary
			ack/dockerfile/install/install.sh tini
			hack/dockerfile/install/install.sh proxy dynamic
			hack/dockerfile/install/install.sh rootlesskit dynamic
			运行engine下 ./hack/make.sh dynbinary
				运行engine/hack/install.sh 下的所有*.installer文件,安装组件.
		编译二进制并打包

12345678910111213141516

自定义docker功能

1.修改docker-ce/components/packaging/deb/Makefile文件, 将在创建docker时加入挂载本地组件代码,而不是创建docker后在docker内从github上下载代码:

这部分内容涉及公司工作内容,拒绝提供。

Docker源码分析

1.Docker整体架构分析

总体架构图:

DockerClient:

? 发起docker的管理请求,命令执行后,发送请求到Dokcer Daemon,然后接受返回的请求响应并做出简单处理,为一次完整的生命周期.

DockerDaemon:

? 1.Docker Server:监听和接收client发来的请求,然后解析请求,匹配相应的路由项,调用对应的Handler来处理,然后回复client响应.

? 2.Engine:管理大部分Job的执行,通过handler配置相应的job.

? 3.Job:类似内核中的进程,一个任务的抽象.

Docker Registry:

? 分为公有registry和私有registry, docker hub就是最大的共有registry.

? docker运行过程中有3种情况可能与docker registry通信,分别为搜索镜像,下载镜像,上传镜像.对应的3个job名称分别为:search,pull和push.

Graph:

? 统一管理docker镜像,支持多种不同的镜像存储方式,同一种类型的镜像被称为一个repository.

Driver:

? 1.graphdriver:主要完成容器镜像的管理.

? 2.networkdriver:主要的作用完成docker容器网络环境的配置.

? 3.execdricer:docker的执行驱动,负责创建容器运行时的命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等.

libcontainer:

? 提供一套接口来满足上层对容器管理的需求. 可以不依靠任何依赖,直接访问内核中与容器相关的系统调用.

? docker可以直接调用libcontainer,而最终操作容器的namespaces,cgroups,apparmor,网络设备以及防火墙规则等.

Docker Container:

? docker服务交付的最终体验形式.

相关推荐

Vue3非兼容变更——函数式组件(vue 兼容)

在Vue2.X中,函数式组件有两个主要应用场景:作为性能优化,因为它们的初始化速度比有状态组件快得多;返回多个根节点。然而在Vue3.X中,有状态组件的性能已经提高到可以忽略不计的程度。此外,有状态组...

利用vue.js进行组件化开发,一学就会(一)

组件原理/组成组件(Component)扩展HTML元素,封装可重用的代码,核心目标是为了可重用性高,减少重复性的开发。组件预先定义好行为的ViewModel类。代码按照template\styl...

Vue3 新趋势:10 个最强 X 操作!(vue.3)

Vue3为前端开发带来了诸多革新,它不仅提升了性能,还提供了...

总结 Vue3 组件管理 12 种高级写法,灵活使用才能提高效率

SFC单文件组件顾名思义,就是一个.vue文件只写一个组件...

前端流行框架Vue3教程:17. _组件数据传递

_组件数据传递我们之前讲解过了组件之间的数据传递,...

前端流行框架Vue3教程:14. 组件传递Props效验

组件传递Props效验Vue组件可以更细致地声明对传入的props的校验要求...

前端流行框架Vue3教程:25. 组件保持存活

25.组件保持存活当使用...

5 个被低估的 Vue3 实战技巧,让你的项目性能提升 300%?

前端圈最近都在卷性能优化和工程化,你还在用老一套的Vue3开发方法?作为摸爬滚打多年的老前端,今天就把私藏的几个Vue3实战技巧分享出来,帮你在开发效率、代码质量和项目性能上实现弯道超车!一、...

绝望!Vue3 组件频繁崩溃?7 个硬核技巧让性能暴涨 400%!

前端的兄弟姐妹们五一假期快乐,谁还没在Vue3项目上栽过跟头?满心欢喜写好的组件,一到实际场景就频频崩溃,页面加载慢得像蜗牛,操作卡顿到让人想砸电脑。用户疯狂吐槽,领导脸色难看,自己改代码改到怀疑...

前端流行框架Vue3教程:15. 组件事件

组件事件在组件的模板表达式中,可以直接使用...

Vue3,看这篇就够了(vue3 从入门到实战)

一、前言最近很多技术网站,讨论的最多的无非就是Vue3了,大多数都是CompositionAPI和基于Proxy的原理分析。但是今天想着跟大家聊聊,Vue3对于一个低代码平台的前端更深层次意味着什么...

前端流行框架Vue3教程:24.动态组件

24.动态组件有些场景会需要在两个组件间来回切换,比如Tab界面...

前端流行框架Vue3教程:12. 组件的注册方式

组件的注册方式一个Vue组件在使用前需要先被“注册”,这样Vue才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册...

焦虑!Vue3 组件频繁假死?6 个奇招让页面流畅度狂飙 500%!

前端圈的朋友们,谁还没在Vue3项目上踩过性能的坑?满心期待开发出的组件,一到高并发场景就频繁假死,用户反馈页面点不动,产品经理追着问进度,自己调试到心态炸裂!别以为这是个例,不少人在电商大促、数...

前端流行框架Vue3教程:26. 异步组件

根据上节课的代码,我们在切换到B组件的时候,发现并没有网络请求:异步组件:...

取消回复欢迎 发表评论: