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

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

ztj100 2025-02-06 17:13 7 浏览 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服务交付的最终体验形式.

相关推荐

利用navicat将postgresql转为mysql

导航"拿来主义"吃得亏自己动手,丰衣足食...

Navicat的详细教程「偷偷收藏」(navicatlite)

Navicat是一套快速、可靠并价格适宜的数据库管理工具,适用于三种平台:Windows、macOS及Linux。可以用来对本机或远程的MySQL、SQLServer、SQLite、...

Linux系统安装SQL Server数据库(linux安装数据库命令)

一、官方说明...

Navicat推出免费数据库管理软件Premium Lite

IT之家6月26日消息,Navicat推出一款免费的数据库管理开发工具——NavicatPremiumLite,针对入门级用户,支持基础的数据库管理和协同合作功能。▲Navicat...

Docker安装部署Oracle/Sql Server

一、Docker安装Oracle12cOracle简介...

Docker安装MS SQL Server并使用Navicat远程连接

...

Web性能的计算方式与优化方案(二)

通过前面《...

网络入侵检测系统之Suricata(十四)——匹配流程

其实规则的匹配流程和加载流程是强相关的,你如何组织规则那么就会采用该种数据结构去匹配,例如你用radixtree组织海量ip规则,那么匹配的时候也是采用bittest确定前缀节点,然后逐一左右子树...

使用deepseek写一个图片转换代码(deepnode处理图片)

写一个photoshop代码,要求:可以将文件夹里面的图片都处理成CMYK模式。软件版本:photoshop2022,然后生成的代码如下://Photoshop2022CMYK批量转换专业版脚...

AI助力AUTOCAD,生成LSP插件(ai里面cad插件怎么使用)

以下是用AI生成的,用AUTOLISP语言编写的cad插件,分享给大家:一、将单线偏移为双线;;;;;;;;;;;;;;;;;;;;;;单线变双线...

Core Audio音频基础概述(core 音乐)

1、CoreAudioCoreAudio提供了数字音频服务为iOS与OSX,它提供了一系列框架去处理音频....

BlazorUI 组件库——反馈与弹层 (1)

组件是前端的基础。组件库也是前端框架的核心中的重点。组件库中有一个重要的板块:反馈与弹层!反馈与弹层在组件形态上,与Button、Input类等嵌入界面的组件有所不同,通常以层的形式出现。本篇文章...

怎样创建一个Xcode插件(xcode如何新建一个main.c)

译者:@yohunl译者注:原文使用的是xcode6.3.2,我翻译的时候,使用的是xcode7.2.1,经过验证,本部分中说的依然是有效的.在文中你可以学习到一系列的技能,非常值得一看.这些技能不单...

让SSL/TLS协议流行起来:深度解读SSL/TLS实现1

一前言SSL/TLS协议是网络安全通信的重要基石,本系列将简单介绍SSL/TLS协议,主要关注SSL/TLS协议的安全性,特别是SSL规范的正确实现。本系列的文章大体分为3个部分:SSL/TLS协...

社交软件开发6-客户端开发-ios端开发验证登陆部分

欢迎订阅我的头条号:一点热上一节说到,Android客户端的开发,主要是编写了,如何使用Androidstudio如何创建一个Android项目,已经使用gradle来加载第三方库,并且使用了异步...

取消回复欢迎 发表评论: