搭建私有docker registry
by 伊布
2017-04-07:推荐使用VMWare的Harbor,方便易用,基本可以获得跟Docker Hub接近的体验,例如一个可以查询的Dashboard,多用户,多namespace等。
由于docker没有CDN加速,所以我们在国内使用docker的时候,会感觉速度非常慢;另一方面,对于一些企业级应用来说,将自家应用放到Docker Hub中,总归是不太放心的。因此,需要做一个docker私有仓库,自己当家做主。
Docker私有仓库是docker/distribution这个项目实现的。实际使用时,registry是以docker 容器的方式运行的,所以我们第一步就是怎么获得容器的镜像。有三个办法。
- docker registry在Docker Hub有现成的镜像,你可以pull下来使用,但Docker Hub的速度实在是太感人了。命令很简单:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
- 从github上下载registry包,从里面的Dockerfile可以build出来最终镜像。
- 最好的办法,是问问周围有没有人做过,直接将他的docker registry镜像保存后自己load。
我选用的是第二个方法,没有为什么,练练手。选用第一个方法会比较简单。 另外,docker registry有v1和v2两个版本,我这里都是用的v2;v1已经不维护了。
1 准备registry镜像
1.1 下载registry包,解压并build
wget https://codeload.github.com/docker/distribution/zip/docker/1.10
mv 1.10 xx.zip
unzip xx.zip #得到distribution-docker-1.10目录
cd distribution-docker-1.10
docker build .
由于v2的registry使用的是go语言,所以需要先下载一个go docker镜像(相比较而言,v1使用python语言,需要下载一大堆包,v2轻巧一些)。下面是其中的Dockerfile,可以看到registry的base镜像是golang,需要安装几个apt包,之后设置GOPATH后make即可编译得到最终的registry可执行文件。
FROM golang:1.5.3
RUN apt-get update && \
apt-get install -y librados-dev apache2-utils && \
rm -rf /var/lib/apt/lists/*
ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution
ENV GOPATH $DISTRIBUTION_DIR/Godeps/_workspace:$GOPATH
ENV DOCKER_BUILDTAGS include_rados include_oss include_gcs
WORKDIR $DISTRIBUTION_DIR
COPY . $DISTRIBUTION_DIR
COPY cmd/registry/config-dev.yml /etc/docker/registry/config.yml
RUN make PREFIX=/go clean binaries
VOLUME ["/var/lib/registry"]
EXPOSE 5000
ENTRYPOINT ["registry"]
CMD ["/etc/docker/registry/config.yml"]
1.2 启动registry容器
由于Dockerfile定义了ENTRYPOINT,所以在run的时候不需要再指定其要执行的程序。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 35edc4804da9 5 seconds ago 825.7 MB
# netstat -antp|grep 5000
tcp6 0 0 :::5000 :::* LISTEN 27263/docker-proxy
# docker run -d -p 5000:5000 35edc4804da9
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5cab3904ae94 35edc4804da9 "registry /etc/docker" 2 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp big_darwin
# docker exec -ti 5cab3904ae94 /bin/bash
root@5cab3904ae94:/go/src/github.com/docker/distribution#which registry
/go/bin/registry
进去后可以看到,registry是在/go目录下编译的。当然更好的做法是run的时候,-p指定为80:5000,这样在使用的时候,只要写地址即可(访问registry实际是http服务,默认80端口),会方便一些。
2 使用私有registry服务
2.1 检查私有registry服务是否正常
使用curl命令检查registry能提供哪些repositories。
# curl "http://192.168.103.88:5000/v2/_catalog"
{"repositories":[]}
显然是空的。
2.2 上传镜像到私有registry
把本地的ubuntu:14.04镜像push到私有registry中。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 35edc4804da9 20 minutes ago 825.7 MB
ubuntu 14.04 2a956697b48a 24 hours ago 188 MB
# 打私有registry的标签
# docker tag ubuntu:14.04 192.168.103.88:5000/ubuntu:14.04
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 35edc4804da9 24 minutes ago 825.7 MB
192.168.103.88:5000/ubuntu 14.04 2a956697b48a 25 hours ago 188 MB
ubuntu 14.04 2a956697b48a 25 hours ago 188 MB
# 上传
# docker push 192.168.103.88:5000/ubuntu:14.04
The push refers to a repository [192.168.103.88:5000/ubuntu]
1a649ccebd00: Pushed
5f70bf18a086: Pushed
1b82ce694c3b: Pushed
db6b2d84f3c6: Pushed
05b940eef08d: Pushed
14.04: digest: sha256:d0b93c80d9d46495195246ed4e3d6c34cbc4e0ba9580557024e40c57a49d3672 size: 1336
# curl "http://192.168.103.88:5000/v2/_catalog"
{"repositories":["ubuntu"]}
2.3 从私有registry里拖镜像
pull时加上私有registry的地址端口号即可。
docker pull 192.168.103.88:5000/ubuntu:14.04
Subscribe via RSS