Docker搭建带认证的私有仓库

为什么需要私有仓库

作为Docker官方的仓库,Docker Hub已经非常的成熟,里面也有非常多的公有镜像可以选择。同时,国内的公有仓库docker.cn也发展的非常的快,镜像也越来越丰富,国内用户使用起来也非常的方便。但是为什么需要搭建一个私有仓库呢?公有仓库的发展,推动了Docker在普通开发者之中的普及,但是Docker的商业化,私有仓库将会是一个关键的节点。毕竟任何一家商业化的公司,都不希望自己的核心业务的镜像放到公有仓库去随便供别人下载的。在国内提供私有仓库的服务商还没有成熟之前,搭建一个自己专属的私有仓库还是非常必要的。幸运的是,Docker开源了其仓库的核心组件Registry,普通的开发者或者使用Docker技术的公司,也可以快速搭建自己专属的私有仓库。

如何选择部署方案

下载一个Docker镜像,主要通过HTTPS的方式拉取,因此一个Docker仓库,主要包括Registry Server和存储两部分。我们用什么做存储呢?目前Registry已经支持了如下几种的存储方案:

  • local:用本地存储
  • s3:存到 Amazon S3 的 bucket
  • swift:存到 OpenStack 的 Swift 容器
  • glance:使用 OpenStack 的 Glance 项目
  • elliptics:使用 Elliptics 的键值存储方案

如果在腾讯云部署,可以选择腾讯云的“对象存储(COS)”作为存储方案,同时,也可以存储到云盘中。由于目前暂未推出支持COS的插件,因此这里我们选择本地存储的方案。实际是存储到腾讯云的云盘中。

除了存储以外,还需要一个运行registry的server。这里我们选用一台2核4G内存的云主机,挂载一个100G的云盘。操作系统选用Ubuntu 12.04 TLS 。

部署和配置

我们已经有自己的服务器了,下面我们来装几个必要软件吧。

# 安装软件之前,我们先更新一下软件源列表,然后重启
ubuntu@VM-201-98-ubuntu:~$ sudo apt-get update

# 切换到root用户
ubuntu@VM-201-98-ubuntu:~$ sudo su

# 安装nginx-extras包,我们要用其中的chunkin模块
root@VM-201-98-ubuntu:~# apt-get install git nginx-extras

# 安装apache2-utils包,这样我们就可以用htpasswd命令来设置密码
root@VM-201-98-ubuntu:~# apt-get install apache2-utils

# 安装一些必要的依赖
root@VM-201-98-ubuntu:~# apt-get install build-essential libevent-dev libssl-dev liblzma-dev python-dev python-pip

# 安装redis来实现我们的LRU缓存策略
root@VM-201-98-ubuntu:~# apt-get install redis-server
root@VM-201-98-ubuntu:~# apt-get clean

安装好了必要的软件后,我们开始安装docker registry。当前稳定版本是0.9.0

#从github下载源码
root@VM-201-98-ubuntu:~# git clone https://github.com/docker/docker-registry.git /opt/docker-registry
root@VM-201-98-ubuntu:~# cd /opt/docker-registry

# 准备好配置文件
root@VM-201-98-ubuntu:~# cp config/config_sample.yml /config/config.yml

# 安装版本
root@VM-201-98-ubuntu:~# python setup.py install

# 创建日志路径
root@VM-201-98-ubuntu:~# mkdir -p /var/log/docker-registry

注:docker registry安装到了/usr/local/lib/python2.7/dist-packages/docker_registry 目录,修改配置文件,需要在这个目录下的config目录去修改

启动&配置Docker Registry

到此为止,docker registry已经成功的安装到了服务器上面。接下来我们将进行一些简单的配置首先在网盘所在的目录创建一个仓库存储的数据目录。腾讯云的服务,网盘默认是挂在到/data/目录下的:

root@VM-201-98-ubuntu:/data# mkdir -p /data/registry

创建了数据目录以后,我们再来配置docker registry,在配置之前,先简要的解释一下docker registry的配置文件中的参数的意义。config.yml能够定义几个指定的flavor(运行环境)。是通过让你定义不同的模式来实现了(譬如有"development", "production",或者其他模式) 在一个config.yml的配置文件中,你可以看到如下几个flavor:

  • common:所有flavor共有的通用配置部分
  • local:存储数据在本地文件系统
  • s3:存储数据在AWS S3 bucket
  • ceph-s3:通过Ceph对象网关(Ceph Object Gateway)存储数据在Ceph集群,使用s3 API
  • azureblob:存储数据在Microsoft Azure Blob Storage
  • dev:使用local flavor时的基础配置
  • test:用于单元测试
  • prod:生产环境的配置信息。由于默认生产环境是使用s3,因此与s3 flavor的配置等价
  • gcs:存储数据在Google cloud storage
  • swift:存储数据在OpenStack Swift
  • glance:存储数据在OpenStack Glance,而回滚数据放在本地盘上
  • glance-swift:存储数据在OpenStack Glance,而回滚数据放在swift上面
  • elliptics:存储数据在Elliptics key/value存储上面

通过配置文件,可以指定使用哪一个flavor. 默认情况下,使用的是dev,当然也可以通过设置环境变量SETTINGSFLAVOR来选择特定的flavor,譬如SETTINGSFLAVOR = prod

由于腾讯云的云盘是挂载在机器上面当本地盘使用的,这里我们选择使用dev.因此,我们需要配置一下local的配置.

root@VM-201-98-ubuntu:~# cd /usr/local/lib/python2.7/dist-packages/docker_registry-0.9.0-py2.7.egg/config
root@VM-201-98-ubuntu:~# vi config.yml

找到dev flavor的配置部分,将存储目录改为/data/registry

dev:
    storage: local
    storage_path: /data/registry
    loglevel: debug

当所有的配置完成后,我们开始启动docker registry

root@VM-201-98-ubuntu:~# gunicorn --debug -k gevent -b 0.0.0.0:5000 -w 8 docker_registry.wsgi:application

服务启动后,在浏览器访问一下 http://ip:5000/ 浏览器出现:"\"docker-registry server\"" 则证明安装成功了。

配置Nginx及安全认证

浏览器能够访问,只是实现了第一步,但是实际要用起自己的私有仓库来,还是不够的。Docker Registry缺省情况下,是没有安全认证机制的。任何人都可以pull、push,显然没有任何企业能够接受。并且最新发布的docker 1.3.x版本强制基本鉴定(basic authentication)必须使用https。因此以传统的http的方式去pull或者push镜像显然不可能了。

这里,我们先使用Nginx实现https的服务。在配置Nginx之前,需要先准备好证书。比较,我们在测试阶段,不可能每个人都去花钱去搞一个认证机构授权的SSL密钥。因此我们尝试弄一个自己授权的SSL KEY,详细流程可以参见Akadia的教程

root@VM-201-98-ubuntu:~# openssl genrsa -des3 -out server.key 1024
root@VM-201-98-ubuntu:~# openssl req -new -key server.key -out server.csr
root@VM-201-98-ubuntu:~# cp server.key server.key.org
root@VM-201-98-ubuntu:~# openssl rsa -in server.key.org -out server.key
root@VM-201-98-ubuntu:~# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

到此为止,我们所需要的自签名的证书和私钥都准备好了,把他们拷贝到对应的目录(注:申请证书时需要绑定域名,这里我们设定的域名为 registry.example.com,同时申请自签名证书时,请保存好用户名,密码,邮件地址,后面登陆docker时需要用到)

root@VM-201-98-ubuntu:~# mv server.key /etc/ssl/private/docker-registry.key
root@VM-201-98-ubuntu:~# mv server.crt /etc/ssl/certs/docker-registry.crt

准备好了证书后,接下来可以配置Nginx了

root@VM-201-98-ubuntu:~# rm /etc/nginx/sites-enabled/default
root@VM-201-98-ubuntu:~# vim /etc/nginx/sites-enabled/docker-registry

nginx的配置信息如下:

upstream docker-registry {
    server localhost:5000;
    }
server {
    listen 443;
    server_name registry.example.com;
    ssl on;
    ssl_certificate /etc/ssl/certs/docker-registry.crt;
    ssl_certificate_key /etc/ssl/private/docker-registry.key;
    proxy_set_header Host             $http_host;   # required for docker client's sake
    proxy_set_header X-Real-IP        $remote_addr; # pass on real client's IP
    proxy_set_header Authorization    ""; # see https://github.com/dotcloud/docker-registry/issues/170
    client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
    location / {
        auth_basic              "Restricted";
        auth_basic_user_file    docker-registry.htpasswd;
        proxy_pass http://docker-registry;
        proxy_set_header Host $host;
        proxy_read_timeout 900;
    }
    location /_ping {
        auth_basic off;
        proxy_pass http://docker-registry;
        }
        location /v1/_ping {
            auth_basic off;
            proxy_pass http://docker-registry;
            }
}

配置好ngix后,记得要重启服务喔

root@VM-201-98-ubuntu:~# service nginx restart

验证一下,nginx是否支持https

root@VM-201-98-ubuntu:~# curl -i -k https://user:passwd@registry.example.com
HTTP/1.1 200 OK
Server: nginx/1.6.2
Date: Sat, 29 Nov 2014 09:21:18 GMT
Content-Type: application/json
Content-Length: 28
Connection: keep-alive
Expires: -1
Pragma: no-cache
Cache-Control: no-cache

"\"docker-registry server\""

done,测试通过,说明nginx已经支持了https

OK,是不是nginx支持了https就万事大吉了呢,现在来验证一下,Docker是否支持https登陆了。

root@VM-201-98-ubuntu:~# docker login

输入申请证书时填写的用户名和密码,发现并没有成功,出现下面的一段提示:

2014/12/01 23:47:17 Error response from daemon: Invalid registry endpoint https://registry.example.com/v1/: Get https://registry.example.com/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry registry.example.com` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/registry.example.com/ca.crt

这到底是怎么一回事呢?原来现在官方的 docker 还不能用自授权的证书。那怎么解决呢?办法总是有的,我们需要把服务器的根证书在docker这端自己认证一下。还记得之前申请自签名证书所生成的docker-registry.crt 文件吗?把这个文件下载到所要从registry服务器拉去镜像或者上传镜像的机器上面,加入到 boot2docker 的证书( /etc/ssl/certs/ca-certificates.crt )中去,这样,通过docker命令登陆到Docker Registry时,就可以通过认证了(这里,我们的测试机和Docker Registry是同一台机器)。

root@VM-201-98-ubuntu:~#cat /etc/ssl/certs/docker-registry.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt

重新使用docker login 命令登陆,问题解决。

验证使用

到此为止,一个带认证机制的私有仓库就搭建成功了。试着下载一个例子镜像,将其tag成私有仓库的地址,然后将镜像push上去,看看是否成功。到了这一步具体的流程就累述了。自己去参考怎么在一个私有仓库去上传,下载镜像。

后记

之前已经成功的搭载了一个私有仓库,并且可以上传镜像了,但是实际操作过程中,会发现push一个镜像后,1秒就结束,只上传了1k多,明显没有成功。看了一下registry服务端的日志,发现如下的错误日志:

api_error: Image is being uploaded, retry later

调试了registry代码,发现问题还是不能解决,后来请教了朋友圈里面的专家,发现是nginx本身的问题导致的,升级nginx版本,搞定

root@VM-201-98-ubuntu# service nginx stop
root@VM-201-98-ubuntu# add-apt-repository ppa:nginx/stable
root@VM-201-98-ubuntu# apt-get install python-software-properties
root@VM-201-98-ubuntu# apt-get update
root@VM-201-98-ubuntu# apt-get install nginx
root@VM-201-98-ubuntu# service nginx restart

参考文献

部署自己的私有 Docker Registry

用 Nginx 来做私有 docker registry 的安全控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值