150 likes | 955 Views
Develop docker. 马全一 Docker.cn. agenda. 使用 Dockerfile 编译 Docker 如何在 “墙内” 编译 Docker Make 命令 Docker 本地存储 Docker Hub & Registry API 扩展 Docker API Docker Registry API V2. 为什么要编译 docker.
E N D
Develop docker 马全一 Docker.cn
agenda • 使用 Dockerfile 编译 Docker • 如何在 “墙内” 编译 Docker • Make 命令 • Docker 本地存储 • Docker Hub&Registry API • 扩展 DockerAPI • Docker Registry API V2 meaglith@docker.cn
为什么要编译docker [任务] Docker.cn 为 “墙内” 开发者提供 Docker 镜像仓库存储服务[目标] “加密” 镜像仓库存储服务[过程] 1. 扩展 push 和 pull 命令2. 扩展hubapi 和 Registry api3.dockerbucket meaglith@docker.cn
使用 Docker 编译 docker daemon go build $SRC/docker/docker.go 得到的 docker client,无法执行 。 • 8.8 M VS 13 M • docker -d “This is a client-only binary - running the Docker daemon is not supported.” make 编译 dockerdaemon ->$SRC/hack/make.sh • default : binary • cross : 交叉编译不同平台的 docker • test : 交叉编译进行测试 meaglith@docker.cn
Dockefile • FROM ubuntu:14.04 • RUN git clone --no--checkout https://git.fedorahosted.org/git/lvm2.git /usr/local/lvm2 … • RUN curl -sSL http://golang.org/dl/go1.3.3.src.tar.gz … • RUN go get code.google.com/p/go.tools/cmd/cover • RUN gem install --no-rdoc --no-ri fpm --version 1.0.3 meaglith@docker.cn
Dockefile One • FROM docker.cn/docker/docker-dev:v1.2.0 • VOLUME /var/lib/docker • WORKDIR /go/src/github.com/docker/docker • ENV DOCKER_BUILDTAGS apparmorselinux • ENTRYPOINT [“hack/dind”] • COPY . /go/src/github.com/docker/docker meaglith@docker.cn
Dockefile two • FROM docker.cn/docker/ubuntu:14.04 • RUN echo “deb http://mirrors.aliyun.com/ubuntu trusty main universe ” > /etc/apt/sources.list && … • RUN git clone --no--checkout https://coding.net/gendna/lvm2.git /usr/local/lvm2 … • RUN curl –sSL http://docker-cn.qiniu.com/go1.3.3.src.tar.gz … • RUN mkdir -p /go/src/github.com/gpmgo && … && go install • RUN gopm -v code.google.com/p/go.tools/cmd/cover • RUN gem sources --remove https://rubygems.org/ && gem sources -a https://ruby.taobao.org/ && gem install --no-rdoc --no-ri fpm --version 1.0.2 meaglith@docker.cn
Dockefile two • FROM docker.cn/docker/ubuntu:14.04 • RUN echo “deb http://mirrors.aliyun.com/ubuntu trusty main universe ” > /etc/apt/sources.list && … • RUN git clone --no--checkout https://coding.net/gendna/lvm2.git /usr/local/lvm2 … • RUN curl –sSL http://docker-cn.qiniu.com/go1.3.3.src.tar.gz … • RUN mkdir –p /go/src/github.com/gpmgo && … && go install • RUN gopm -v code.google.com/p/go.tools/cmd/cover • RUN gem sources --remove https://rubygems.org/ && gem sources -a https://ruby.taobao.org/ && gem install --no-rdoc --no-ri fpm --version 1.0.2 meaglith@docker.cn
Make/hack/bindary #!/bin/bash set -e DEST=$1 go build -o “$DEST/docker-$VERSION” “${BUILDFLAGS[@]}” -ldflags “ $LDFLAGS $LDFLAGS_STATIC_DOCKER” ./docker echo “Create binary: $DEST/docker-$VERSION” ln -sf “docker-$VERSION” “DEST/docker” hash_files “DEST/docker-$VERSION” meaglith@docker.cn
Docker local storage • 存储路径 /var/lib/docker 或者 docker -d -g /xxx/somewhere • 镜像仓库信息存储 repositories-aufs && repositories-devicemapper … • AUFS:diff/layer/mnt • Devicemapper : devicemapper/metadata/mnt • gz、bzip2、gzip、xz meaglith@docker.cn
Docker hub & Registry概念 • [standalone] Hub 和 Registry 是否同一个程序提供服务 • [standalone=true] 在 HTTP HEADER 的 Authorization 中使用Basic Authorization 验证 • [standalone=false] 在 HTTPHEADER 的 Authorization 字段使用 Token 验证 • [X-Docker-Token=true] 生成一个 Token 返回,否则 dockerclient 会报 Index response didn’t contain an access token 的错误 • [Cookie] docker client 支持 Cookie, 所以在 PUSH 的第一次调用的时候就处理 meaglith@docker.cn
Docker login • [PUT /v1/users] 创建用户;如果 HTTPSTATUECODE 返回 401 ,docker client 会进行登录。 • [GET /v1/users] 用户登录:使用 BASIC AUTHORIZATION 验证。 • Authorization: Basic ZnNrOmZsdfdf== meaglith@docker.cn
Docker PUSH • [PUT /v1/repositories/<namespace>/<repository>] 把镜像仓库所有的镜像和标签信息组织为 JSON 格式 PUT 到服务器。 • [GET /v1/images/<image>/json] 获取镜像的 JSON 信息,如果 HTTPSTATUSCODE 是 200, 判定服务器已经有此镜像,不需要有再上传;如果是 404 ,判断服务器不存在此镜像,进行上传。 • [PUT /v1/images/<image>/json] 把镜像的 JSON 信息发送到服务器。 • [PUT /v1/images/<image>/layer] 把镜像目录压缩为 tar 流,放在 HTTP BODY 里面发送到服务器 • [PUT /v1/images/<image>/checksum] 在 HTTPHEADER 中发送镜像的 checksum 值,X-Docker-Checksum 和 X-Docker-Checksum-Payload • [PUT /v1/repositories/<namespace>/<repository>/tags/<tag>] 向服务器写入镜像和标签的对应信息 • [PUT /v1/repositories/<namespace>/<repository>/images] meaglith@docker.cn
Docker PULL • [GET /v1/repositories/<namespace>/<repository>/images] 从服务器读取镜像仓库的所有镜像信息 • [GET /v1/repositories/<namespace>/<repository>/tags] 从服务器读取镜像仓库的标签 信息 • [GET /v1/images/<image>/ancestry] 获取一个镜像的祖先信息。 • [GET /v1/images/<image>/json] 获取镜像的 JSON 信息。 • [GET /v1/images/<image>/layer] 获取一个镜像的 tar 文件。 meaglith@docker.cn
Docker ENcrypt • 通过增加 HTTP HEADER 信息扩展 Registry API 。 • 在服务器和 docker client 中增加 [X-Docker-Encrypt] 和 [X-Docker-Sign] 来处理 meaglith@docker.cn