实验环境:两台cnetos7.2版本虚拟机。(资源容许最好准备三台,一台作私有仓库,一台作上传镜像服务器,一台作下载镜像服务器)node
虚拟机1:192.168.1.200 python
虚拟机2:192.168.1.201linux
服务器防火墙和selinux关闭。hosts根据实际状况作解析,每台都须要解析。git
本实验hosts解析为:192168.1.201 hub.comdocker
此文档默认在Registry上操做,client上操做时会红色标记。浏览器
要实现ssl认证就须要证书支持,证书最好是服务商提供的证书,好比阿里云,腾讯云等等。这里因为作实验,使用自建证书。服务器
建立.key和.crtdom
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/cert/ca.key -x509 -days 365 -out /docker/cert/ca.crt
Country Name (2 letter code) [AU]:CN #国家代码,中国CN State or Province Name (full name) [Some-State]:Sichuan #省份全拼 Locality Name (eg, city) []:Chengdu #城市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:registry #组织名,公司名 Organizational Unit Name (eg, section) []:CA #部门名称 Common Name (e.g. server FQDN or YOUR name) []:hub.com #这里必须填写Docker Registry使用的域名 Email Address []:admin@domain.com #电子邮件
CentOS 6 / 7中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt 阿里云
cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
systemctl restart docker
mkdir /etc/docker/certs.d/hub.com/ #client上执行 scp /docker/cert/ca.crt 192.168.1.200:/etc/docker/certs.d/hub.com/ #registry 上执行。
cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt #client上执行
systemctl restart docker
docker run -d -p 5000:5000 --restart=always --name registry \ -v /registry:/var/lib/registry \ -v `pwd`/cert/:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ registry
解释:将宿主机的cert/目录映射到容器中的/certs目录中。指定registry启动使用/certs中的证书。`pwd` :当前目录,也可使用绝对路径:/docker/cert/spa
没使用证书的时候时走的http,使用证书后走的是https。
docker tag mariadb hub.com:5000/db:2.0 docker push hub.com:5000/db:2.0
cd /docker
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd
注:红色部分需改成你的用户名和密码
docker run -d -p 5000:5000 --restart=always --name registry \ -v /registry:/var/lib/registry \ -v `pwd`/auth:/auth \ -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ -v `pwd`/cert:/certs \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \ -e REGISTRY_STORAGE_DELETE_ENABLED=true \ registry:2
注:若是你registry正在运行,须要关闭。因为加了参数--restart=always,当你关闭registry容器时,会自动重启registry容器,因此只有使用 docker rm -f registry 强制删除registry容器。
使用你刚刚建立的用户和密码就能够登陆了。
docker tag mariadb hub.com:5000/db:3.0 docker push hub.com:5000/db:3.0
因为没有登陆刚刚的帐户,因此没有权限上传。
经过用户登陆
docker login hub.com:5000 docker push hub.com:5000/db3.0
1:用参数`pwd`时必定要注意启动时的目录是否对应。
2:删除registry'容器时记得删除挂载卷,否则上传的镜像还存在。docker stop registry && docker rm -v registry
3:访问失败时查看容器日志:docker logs registry -f 加上-f 实时查看。