Docker源码阅读(一) —— Docker源码(Moby)编译运行(无需代理)

前言

在正式搭建环境之前,先捋一下我们要构建的moby源码是什么。可能大家之前都是知道Docker是开源项目,这里突然蹦出来一个Moby让人有点懵逼,所以还是来和大家一起捋一捋。出于种种因素的考量(主要是利益因素),17年左右Docker开源项目更名为Moby。形成了如下图所示的 Moby -> Docker CE -> Docker EE 的架构,Docker CE就是在moby之上包含了Docker Hub、Docker Compose等等组件。而Docker EE就是在Docker CE之上添加了一些高级功能,如漏洞检测和安全监控等等。因此可以把Moby简单的理解为,开发版的Docker deamon
在这里插入图片描述

构建

弄懂了Moby是个什么东西,接下来就是进行构建了,其实构建的过程中,最大的问题就是网络问题了。很多人可能在连接Github的过程中超超时,至于解决办法,最简单的方式当然是挂代理。当然鉴于这个解决方案其实需要一定的门槛,所以我魔改了一下构建需要的DockerFile文件,加入了国内的镜像,可以直接无需代理安装,我会一步步演示一下这个过程

  1. 首先Clone moby代码到本地
git clone https://github.com/moby/moby.git
  1. 根据官方文档的要求,我们确保主机上没有安装不需要的docker镜像(其实没啥必要),所以可以使用下面的指令删除镜像
docker system prune -a

或者

docker rm $(docker ps -a -q)

其实个人感觉这样做没什么必要,可以先构建一下试试,如果出现了错误再过来运行这一步

  1. 删除所有的虚悬镜像(dangling image)
docker rmi -f $(docker images -q -a -f dangling=true)
  1. 一番操作完毕后,终于可以进入我们的正题了,这里,我们进入源码的文件夹中,开启terminal,执行构建任务
sudo make BIND_DIR=. shell

在这里插入图片描述
如果对自己网络很自信的同学可以执行一下试试。当然,不出意外的话是要出意外了,大概率会报网络错误
在这里插入图片描述

所以这里我们要对文件进行一些修改

  1. 先把下面的patch文件拷贝一下,然后在源码目录下新建一个文件proxy_cn.patch并且把内容拷贝进去
diff --git a/Dockerfile b/Dockerfile
index c5fa44064c..9e0453c2c4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -170,7 +170,7 @@ FROM base AS tomll
 ARG GOTOML_VERSION=v1.8.1
 RUN --mount=type=cache,target=/root/.cache/go-build \
     --mount=type=cache,target=/go/pkg/mod \
-        GOBIN=/build/ GO111MODULE=on go install "github.com/pelletier/go-toml/cmd/tomll@${GOTOML_VERSION}" \
+        GOBIN=/build/ GO111MODULE=on GOPROXY=https://goproxy.cn  go install "github.com/pelletier/go-toml/cmd/tomll@${GOTOML_VERSION}" \
      && /build/tomll --help
 
 FROM base AS gowinres
@@ -178,7 +178,7 @@ FROM base AS gowinres
 ARG GOWINRES_VERSION=v0.3.0
 RUN --mount=type=cache,target=/root/.cache/go-build \
     --mount=type=cache,target=/go/pkg/mod \
-        GOBIN=/build/ GO111MODULE=on go install "github.com/tc-hib/go-winres@${GOWINRES_VERSION}" \
+        GOBIN=/build/ GO111MODULE=on GOPROXY=https://goproxy.cn go install "github.com/tc-hib/go-winres@${GOWINRES_VERSION}" \
      && /build/go-winres --help
 
 # containerd
@@ -226,21 +226,21 @@ FROM base AS golangci_lint
 ARG GOLANGCI_LINT_VERSION=v1.51.2
 RUN --mount=type=cache,target=/root/.cache/go-build \
     --mount=type=cache,target=/go/pkg/mod \
-        GOBIN=/build/ GO111MODULE=on go install "github.com/golangci/golangci-lint/cmd/golangci-lint@${GOLANGCI_LINT_VERSION}" \
+        GOBIN=/build/ GO111MODULE=on GOPROXY=https://goproxy.cn go install "github.com/golangci/golangci-lint/cmd/golangci-lint@${GOLANGCI_LINT_VERSION}" \
      && /build/golangci-lint --version
 
 FROM base AS gotestsum
 ARG GOTESTSUM_VERSION=v1.8.2
 RUN --mount=type=cache,target=/root/.cache/go-build \
     --mount=type=cache,target=/go/pkg/mod \
-        GOBIN=/build/ GO111MODULE=on go install "gotest.tools/gotestsum@${GOTESTSUM_VERSION}" \
+        GOBIN=/build/ GO111MODULE=on GOPROXY=https://goproxy.cn go install "gotest.tools/gotestsum@${GOTESTSUM_VERSION}" \
      && /build/gotestsum --version
 
 FROM base AS shfmt
 ARG SHFMT_VERSION=v3.6.0
 RUN --mount=type=cache,target=/root/.cache/go-build \
     --mount=type=cache,target=/go/pkg/mod \
-        GOBIN=/build/ GO111MODULE=on go install "mvdan.cc/sh/v3/cmd/shfmt@${SHFMT_VERSION}" \
+        GOBIN=/build/ GO111MODULE=on GOPROXY=https://goproxy.cn go install "mvdan.cc/sh/v3/cmd/shfmt@${SHFMT_VERSION}" \
      && /build/shfmt --version
 
 # dockercli
@@ -357,6 +357,7 @@ RUN --mount=type=cache,sharing=locked,id=moby-rootlesskit-aptlib,target=/var/lib
         apt-get update && xx-apt-get install -y --no-install-recommends \
             gcc libc6-dev
 ENV GO111MODULE=on
+ENV GOPROXY=https://goproxy.cn
 ARG DOCKER_STATIC
 RUN --mount=from=rootlesskit-src,src=/usr/src/rootlesskit,rw \
     --mount=type=cache,target=/go/pkg/mod \
@@ -392,7 +393,9 @@ RUN --mount=type=cache,sharing=locked,id=moby-crun-aptlib,target=/var/lib/apt \
             libyajl-dev \
             python3 \
             ;
+
 RUN --mount=type=tmpfs,target=/tmp/crun-build \
+    git config --global url."https://ghproxy.com/https://github.com/".insteadOf https://github.com && \
     git clone https://github.com/containers/crun.git /tmp/crun-build && \
     cd /tmp/crun-build && \
     git checkout -q "${CRUN_VERSION}" && \
     

在这里插入图片描述
然后使用指令打上补丁

git apply proxy_cn.patch


如果这里碰到问题提示补丁文件损坏,可能是编码格式的问题,把第66行删掉,然后在第65行处按一个按一个回车,生成第66行即可
在这里插入图片描述
6. 再次构建
成功打上补丁之后,可以使用步骤4里的命令再次构建,文件内容有点大,静等构建完毕即可
在这里插入图片描述
出现这个界面就说明我们已经构建成功了~~

代码调试

成功构建了源码后,我们要开始进行代码调试的测试
首先运行如下指令,构建Dockerd

hack/make.sh binary install-binary

在这里插入图片描述
然后使用如下指令启动dockerd

dockerd -D &

在这里插入图片描述
启动完毕后,我们使用docker version可以看到docker的信息
在这里插入图片描述

注意看,这里的server下的version是dev,说明我们构建成功

接下来尝试修改源码,这里我们修改docker.go里的short
在这里插入图片描述
保存修改后,我们再次使用如下指令进行编译

hack/make.sh binary install-binary

运行dockerd --help 即可看到修改成功
在这里插入图片描述
至此,大功告成,可以和moby源码快乐的玩耍了

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值