源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
SSL及Nginx代理搭建环境的Docker仓库_java

我的环境: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容器。

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

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


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


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

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

#都是返回{}

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

使用ctrl-c退出docker-compose,继续后面的步骤。

添加用户名和密码

在/data/programs/docker/nginx目录下执行下面命令创建用户名和密码对,如果要创建多个用户名和密码对,则不是使用“-c“选项。

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

然后修改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

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

搜索镜像

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

pull测试

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

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

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

#登陆后再测试

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

#登陆后可以pull

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

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

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