SSL及Nginx代理搭建环境的Docker仓库

使用私有仓库有许多优点:节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

我的环境:CentOS-7-x86_64-Everything-1511
Docker版本:Version: 1.10.3,API version: 1.22,Go version: go1.5.3
在下载Linux发行版的时候需要下载较新的版本,Docker所支持的Linux kernel版本过低会出现问题。

一、安装Docker

CentOS中更新源后安装docker,官网https://docs.docker.com/engine/installation/linux/centos/
安装完成Docker环境之后不要去关闭CentOS的防火墙和Selinux,因为Docker的安全机制是基于iptables的,关闭selinux会是的Docker的安装出错。
Docker: Error response from daemon: failed to create endpoint registry on network bridge: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination 172.17.0.2:5000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1).

二、安装Docker Registry

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。
1.官网安装 registry
https://docs.docker.com/registry/
2.使用Docker-compose安装(推荐)
Docker-compose是一个非常有用的Docker运行,管理的工具。你可以通过定义compose文件,使用简单的一条命令同时起多个Docker Container运行不同的服务。Docker-compose对于开发,测试,环境保存以及CI都提供了非常大的便利。
Docker-compose是用Python开发的一个工具,所以可以用pip直接安装。

需要注意的是,docker-compose可能对requests module的版本有限制,而本机上可能安装了更高版本的requests模块,造成运行时报错。可以使用pip-conflict-checker检查版本冲突,卸载不合适的版本,重新安装一个合适的版本。

实际使用操作中使用pip安装的docker-compose可能在执行时还会报代码有bug。
所以推荐直接从github中下载稳定的release版本安装。

安装htpasswd
因为需要使用nginx提供安全验证的功能,需要一个地方放置用户名和密码对。
使用由httpd-tools提供的htpasswd工具生成用户名密码对。
安装httpd-tools.

三、运行Registry Container并使用Nginx做代理

运行nginx和registry容器
创建一个工作目录,例如/data/programs/docker,并在该目录下创建docker-compose.yml文件,将以下docker-compose.yml内容复制粘贴到你的docker-compose.yml文件中。

内容大致意思为,基于“nginx:1.9” image运行nginx容器,暴露容器443端口到host 443端口。并挂载当前目录下的nginx/目录为容器的/etc/nginx/config.d目录。

nginx link到registry容器。基于registry:2 image创建registry容器,将容器5000端口暴露到host 5000端口,使用环境变量指明使用/data为根目录,并将当前目录下data/文件夹挂载到容器的/data目录。

配置nginx
在nginx目录中创建registry.conf文件配置nginx。配置nginx与registry的关系,转发端口,以及其他nginx的配置选项。复制,粘贴如下内容到你的registry.conf文件中:

配置文件创建完成后,回到工作目录执行docker-compose up运行registry和nginx容器。

执行docker-compose up后。注意是否有容器启动失败的消息,如果容器启动失败的消息,需要检查网络,是否能从dockerhub上pull image(需代理,或使用使用国内镜像,使用国内镜像需更改docker-compose.yml文件中image项)。也由可能粘贴配置文件错误,需仔细检查。

启动后也可以使用docker ps命令查看是否两个容器都正常运行。

确定docker容器都正常运行后,用curl 命令验证功能是否正常运行。使得localhost:5000和localhost:443访问registry都应该返回{}。
#都是返回{}

使用ctrl-c退出docker-compose,继续后面的步骤。
添加用户名和密码
在/data/programs/docker/nginx目录下执行下面命令创建用户名和密码对,如果要创建多个用户名和密码对,则不是使用“-c“选项。

然后修改Registry.conf文件,取消下面三行的注释。

再次执行docker-compose up运行registry,这时使用localhost:5000端口访问得到的结果为”{}”,但是使用localhost:443访问将得到”401 Authorisation Required“的提示。加入用户名和密码验证才能得到与直接访问registry 5000端口相同的结果。

四、加入SSL验证

如果你有经过认证机构认证的证书,则直接使用将证书放入nginx目录下即可。如果没有,则使用openssl创建自己的证书。
进行/data/programs/docker/nginx目录,生成一个新的root key

生成根证书(一路回车即可)

为server创建一个key。(这个key将被nginx配置文件registry.con中ssl_certificate_key域引用)

制作证书签名请求。注意在执行下面命令时,命令会提示输入一些信息,”Common Name”一项一定要输入你的域名(官方说IP也行,但是也有IP不能加密的说法),其他项随便输入什么都可以。不要输入任何challenge密码,直接回车即可。

签署认证请求

配置nginx使用证书
修改registry.conf配置文件,取消如下三行的注释

运行Registry
执行docker-compose up -d在后台运行Registry,并使用curl验证结果。这时使用localhost:5000端口仍然可以直接访问Registry,但是如果使用443端口通过nginx代理访问,因为已经加了SSL认证,所以使用http将返回“400 bad request”

应该使用https协议

由于是使用的未经任何认证机构认证的证书,并且还没有在本地应用自己生成的证书。所以此时会提示使用的是未经认证的证书,可以使用“-k"选项不进行验证。

五、Docker客户端使用Registry

添加证书
Centos 6/7 添加证书具体步骤如下:
安装ca-certificates包

使能动态CA配置功能

将key拷贝到/etc/pki/ca-trust/source/anchors/

使新拷贝的证书生效

证书拷贝后,需要重启docker以保证docker能使用新的证书

Docker pull/push image测试
制作要push到registry的镜像
#查看本地已有镜像

#为本地镜像打标签

push测试

#不登陆直接push镜像到registry,会提示失败

#登陆后,再试

#可以push 镜像到registry

搜索镜像

pull测试

#不登陆registry直接pull镜像也会失败

#登陆后再测试

#登陆后可以pull

六、CentOS 7安装Docker及常用命令

作者简介:
蒋暕青@上海宽带技术及应用工程研究中心:SDN技术实践者,大四北上思博伦实习半年,现工作地点上海

--------------华丽的分割线------------------
本文系《SDNLAB原创文章奖励计划》投稿文章,该计划旨在鼓励广大从业人员在SDN/NFV/Cloud网络领域创新技术、开源项目、产业动态等方面进行经验和成果的文字传播、分享、交流。有意向投稿的同学请通过官方唯一指定投稿通道进行文章投递,投稿细则请参考《SDNLAB原创文章奖励计划》


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。
  • 本文链接http://www.sdnlab.com/16546.html
  • 本文标签技术/tech

分享到:
相关阅读
0条评论

登录后才可以评论

蒋暕青 发表于16-04-15
0