了解moby文件夹:
/api:命令行客户端与守护进程daemon通讯的http API,也可以用第三方软件控制daemon
/type:客户端与服务端共享的数据类型
swagger.yaml:生成API文档的依据。主要分成两部分:
/cli:
/client:docker命令使用这个包与守护进程通信。它还可以用于您自己的Go应用程序,用于执行命令行界面——运行容器、拖动图像、管理集群等。
/cmd: docker.go包含了docker daemon的主函数
/contrib:这个设计目录包含脚本、图像和其他一些不属于核心docker分布的有用的东西.
/daemon:
/distribution:
moby编译:
moby编译通docker源码编译一样,是在容器中编译所以需要先安装docker并启动:git下载源码,在moby跟目录下make build,在makefile可以看到该指令是docker用dockerfile创建镜像,如果出现错误可以到dockerfile查找出错的问题。编译成功生成docker-dev容器。
查看Makefile中的make build
DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD)
build: bundles init-go-pkg-cache
docker build ${BUILD_APT_MIRROR} ${DOCKER_BUILD_ARGS} -t "$(DOCKER_IMAGE)" -f "$(DOCKERFILE)" .##用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image
BUILD_APT_MIRROR :=$(if $(DOCKER_BUILD_APT_MIRROR),--build-arg APT_MIRROR=$(DOCKER_BUILD_APT_MIRROR))
DOCKER_FLAGS := docker run --rm -i --privileged $(DOCKER_CONTAINER_NAME) $(DOCKER_ENVS) $(DOCKER_MOUNT) $(DOCKER_PORT_FORWARD)##创建docker容器时的命令行,用docker创建一个临时的容器,并在容器中基于DOCKERFILE创建image
DOCKER_IMAGE := docker-dev$(if $(GIT_BRANCH_CLEAN),:$(GIT_BRANCH_CLEAN))##这是docker image参数,镜像名字是docker-dev,以当前docker版本作为tag
DOCKERFILE := $(shell bash -c 'source hack/make/.detect-daemon-osarch && echo $${DOCKERFILE}')
运行:docker run --rm -i --privileged -e BUILDFLAGS -e KEEPBUNDLE -e DOCKER_BUILD_GOGC -e DOCKER_BUILD_PKGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXPERIMENTAL -e DOCKER_GITCOMMIT -e DOCKER_GRAPHDRIVER=devicemapper -e DOCKER_INCREMENTAL_BINARY -e DOCKER_REMAP_ROOT -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "sxf/code/go/github.com/moby/bundles:/go/src/github.com/moby/moby/bundles" -t "docker-dev:HEAD" bash
进入容器中:hack/make.sh binary 或者 make binary编译静态docker,make dynbinary编译动态;两者调用的都是hack/make.sh binary,查看make.sh可知是在bundles文件夹下,latest文件是向后兼容的链接,export DEST="bundles/$(basename "$bundle")"生成的文件夹下是你的二进制文件。
make.sh:
DEFAULT_BUNDLES=(
binary-daemon
dynbinary
test-integration
test-docker-py
cross
)
if [ $# -lt 1 ]; then
bundles=(${DEFAULT_BUNDLES[@]})
else
bundles=($@)
for bundle in ${bundles[@]}; do
循环将bundles参数传入bundle() 函数
done
source "$SCRIPTDIR/make/$bundle" "$@"
hack/make/binary: . hack/make/binary-daemon
hack/make/binary-daemon:source "${MAKEDIR}/.binary"
.binary:go build \
-o "$DEST/$BINARY_FULLNAME" \
"${BUILDFLAGS[@]}" \
-ldflags "
$LDFLAGS
$LDFLAGS_STATIC_DOCKER
$DOCKER_LDFLAGS
" \
$GO_PACKAGE
编译github.com/docker/docker/cmd/dockerd