用于
解决公有镜像仓库管理不便;
希望内部用户之间分享镜像,不希望暴露镜像出去的问题
环境:Docker私有仓库:192.168.3.37;客户端:192.168.3.59
安装Docker Registry
Docker Registry工具目前最新为2.0版本,此版本与一些类库,工具一起被打包为负责容器内容分发的工具集Docker Distribution,目前其核心功能组件仍为负责镜像仓库的管理
新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+的API,非常适合用来构建私有的镜像注册服务器
用户可以通过容器运行和源码安装两种方式来使用Registry
基于容器安装运行
搜索镜像
1 | docker search registry |

拉取镜像
1 | docker pull docker.io/registry |

创建容器
1 | docker run -d -p 5000:5000 --restart always --name registry docker.io/registry |
1 | Docker容器的重启策略如下: |

验证容器运行
访问
1 | http://IP:5000/v2/ |

通过命令,指定本地主机的配置文件
Registry默认的配置文件为容器内/etc/docker/registry/config.yml
1 | docker run -d -p 5000:5000 \ |
通过命令,指定本地主机的存储位置
Registry默认的存储位置为容器内/var/lib/registry/
如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/var/lib/registry/下, 这样本地主机与容器内都会存在镜像文件
1 | docker run -d -p 5000:5000 \ |
配置TLS证书
当本地主机运行Registry服务后,所有能访问到该主机的Dockr Host都可以将其当作私有仓库使用。只需要在镜像名称前添加具体的服务器地址
例:将本地的ubuntu:latest镜像上传到私有仓库myrep.com
1 | docker tag ubuntu myrep.com:5000/ubuntu |
从私有仓库myrep.com下载镜像到本地
1 | docker pull myrep.com:5000/ubuntu |
私有仓库需要启用TLS认证,否则会报错
Docker从1.3.X之后,与docker registry交互默认使用的是https,当搭建的私有仓库只提供http服务时,就会报错。
为了解决这个问题需要客户端启动docker server时增加启动参数为默认使用http访问。
需要客户端在docker的配置文件/etc/sysconfig/docker
(ubuntu系统中的docker配置文件是/etc/default/docker )
添加参数--insecure-registry=192.168.3.37:5000,表示信任私有仓库
1 | vim /etc/sysconfig/docker |
自行生成证书
使用openssl生成私人证书文件
一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf,添加subjectAltName行
1 | vim /etc/pki/tls/openssl.cnf |
若为自定义域名访问的私有仓库,需要修改客户端hosts文件,将域名与IP关系进行对应
生成自签名证书
1 | mkdir -p certs |

这里的服务器域名写成”192.168.3.37:5000”,后续就使用该地址访问私有仓库。其余项直接回车即可。
生成结果为在certs目录中生成证书文件myrep.crt与密钥文件myrep.key
创建带有TLS认证的Registry容器
1 | docker run \ |
配置客户端本地主机
把registry所在主机上,刚生成的证书:/root/certs/myrep.crt复制到客户端本地主机上的:/etc/docker/certs.d/192.168.3.37:5000/ca.crt
更新CA证书1
update-ca-trust

即可对私有仓库进行上传或下载镜像
配置用户认证
生成仓库登陆用户密码
1 | mkdir auth |
docker仓库添加用户的登录用户名和密码
1 | docker run --entrypoint htpasswd docker.io/registry -Bbn admin admin >> ~/auth/htpasswd |
这里设置私有仓库登陆名与密码都为admin
重启docker服务
1 | systemctl restart docker |
创建Registry容器(带用户认证与TLS认证)
1 | docker run -d -p 5000:5000 --restart=always --name registry \ |
则客户端需对私有仓库进行docker login登陆后才可进行上传下载操作