搭建私有 Docker Registry

Oct. 19, 2016, 12:27 a.m.
标签: docker

Docker 用于项目部署实在是一件非常方便的事情,打包一次,一键运行,不需要重复安装依赖和配置环境。但是 Docker 镜像体积都很大,在国内的网络环境下使用起来不太现实,即使用 daocloud 加速也无法保证频繁构建的过程中始终能顺利 pull 和 push 。因此私有的 Docker Registry 就可以派上用场了,在局域网内搭建之后,可以结合 webhook 实现基于 Docker 的持续集成和自动部署,想想都很有逼格。

搭建 Registry

Docker 官方提供了 Registry 的镜像,可以直接运行。

但是考虑到国内网络环境,可以先从 DaoCloud 将镜像 pull 下来(需要安装 DaoCloud Toolbox):

$ dao pull registry

然后启动镜像,将镜像内的 5000 端口映射到本机,并将镜像存储目录 /var/lib/registry 挂载到当前目录下,为了方便后续操作,可以给当前创建的容器指定名称 docker-registry

$ docker run -d --name docker-registry -v $PWD/storage:/var/lib/registry -p 5000:5000 registry

这样就启动了一个 Docker Registry 的容器,在 5000 端口运行了一个 Docker 的 RESTful 服务器,可以供 Docker 客户端使用。到目前为止,就是这么简单。

使用 Registry

将官方的 ubuntu 镜像 push 到我们的私有 Registry 上:

# 给官方 ubuntu 加上私有 Registry 的 tag
$ docker tag ubuntu localhost:5000/ubuntu
# 然后 push
$ docker push localhost:5000/ubuntu

接下来就可以 pull 了:

$ docker pull localhost:5000/ubuntu

一切都很顺利有木有!然而,在本机上 push 和 pull 并没有什么意义,我们搭建 Registry 显然是希望给其他机器使用的。

值得注意的是, Docker 的客户端仅在 debug 模式(通过 localhost )下允许使用 HTTP 协议,其他情况下强制使用 TLS 加密。而服务端没有限制。

因此只需配置一个 nginx ,启用 HTTPS 并将其反向代理到这个 Registry 即可。这里就不多说了,可使用 Let's encrypt 免费证书

这样就建立了一个可通过网络访问的 Registry ,但是无需验证身份,任何人都可以 push 和 pull 。如果需要身份验证,可使用 htpasswd 生成账号密码数据库供 nginx 使用,这里就不多说了。