前言
在正式搭建环境之前,先捋一下我们要构建的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文件,加入了国内的镜像,可以直接无需代理安装,我会一步步演示一下这个过程
- 首先Clone moby代码到本地
git clone https://github.com/moby/moby.git
- 根据官方文档的要求,我们确保主机上没有安装不需要的docker镜像(其实没啥必要),所以可以使用下面的指令删除镜像
docker system prune -a
或者
docker rm $(docker ps -a -q)
其实个人感觉这样做没什么必要,可以先构建一下试试,如果出现了错误再过来运行这一步
- 删除所有的虚悬镜像(dangling image)
docker rmi -f $(docker images -q -a -f dangling=true)
- 一番操作完毕后,终于可以进入我们的正题了,这里,我们进入源码的文件夹中,开启terminal,执行构建任务
sudo make BIND_DIR=. shell
如果对自己网络很自信的同学可以执行一下试试。当然,不出意外的话是要出意外了,大概率会报网络错误
所以这里我们要对文件进行一些修改
- 先把下面的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源码快乐的玩耍了