1 . 含义及理解:
- 仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool等,可以提供大陆用户更稳定快速的访问。
- 当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
- 私有仓库的优势:
 有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,
 使用私有仓库可以节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可。而且提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
 Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。
2 . 搭建私有仓库:
首先将下载好的镜像导入到仓库里
[root@docker ~]# docker images registry
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            2                   f32a97de94e1        4 months ago        25.8MB
运行此容器
[root@docker ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2
##    创建并运行容器,设置数据卷,并做端口映射
查看容器运行运行情况以及映射端口开启情况:
[root@docker ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
cee722ac6ccb        registry:2          "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry
[root@docker ~]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1091/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1564/master         
tcp        0      0 192.168.13.111:22       192.168.13.250:40316    ESTABLISHED 5785/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      1091/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1564/master         
tcp6       0      0 :::5000                 :::*                    LISTEN      8994/docker-proxy   
上传镜像到本地仓库
在上传镜像的时候,一般会默认上传到docker hub官方仓库,现在需要上传到本地自己创建的仓库,需要指定上传的地址以及端口。如果使用ip默认使用tls加密,目前没有设置,所有直接指定到本机的端口。
docker tag nginx:latest localhost:5000/nginx
上传修改过标签的镜像到本地仓库:
docker push localhost:5000/nginx   # 上传curl localhost:5000/v2/_catalog   # 核实是否上传成功
查看其数据卷挂载点
运行容器的时候,设置了数据卷,可以子阿宿主机查看上传的结果:
cd /opt/registry/
cd docker/
cd registry/
cd v2/
cd repositories/
此时创建的私有仓库远程主机无法使用,并且不够安全,此时则可以采用私有仓库加证书加密的方式来创建私有仓库
3 . 私有仓库的TLS加密
以上仓库使用明文的方式,并且没有认证。存在较大的安全隐患,下面介绍使用TLS加密以及用户认证。
 为docker仓库添加证书加密功能
 docker远程主机访问私有仓库,默认必须使用TLS加密
1 . 生成证书
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/haha.com.key  -x509 -days 365 -out certs/haha.com.crt
2、重新启动registry容器:
docker  rm -f registry       先删除之前开启的容器
重新加密开启容器:
 docker run -d \ ##-d:打入后台 > --restart=always \ > --name registry \ 
>  -v "$(pwd)"/certs:/certs \
>   ##-v:手动指定数据卷的挂载 \
>    -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ ##-e:编辑registry的参数;监听443端口 
>     -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/haha.com.crt \ ##使用证书为生成的证书 
>     -e REGISTRY_HTTP_TLS_KEY=/certs/haha,com.key \ ##使用的私钥 
>      -p 443:443 \ ##端口映射
>       registry:2 ##仓库名查看容器运行情况以及端口开启情况:
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                            NAMES
d3063593b314        registry:2          "/entrypoint.sh /etc…"   33 seconds ago      Up 31 seconds       0.0.0.0:443->443/tcp, 5000/tcp   registrynetstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      656/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      778/master          
tcp        0      0 172.25.13.160:22        172.25.13.250:59964     ESTABLISHED 20132/sshd: root@pt 
tcp6       0      0 :::22                   :::*                    LISTEN      656/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      778/master          
tcp6       0      0 :::443                  :::*                    LISTEN      21555/docker-proxy  docker客户端的设置。
 mkdir -p /etc/docker/certs.d/toto.com   # 创建该目录,名称和证书域名一致
cd /etc/docker/certs.d/haha.com
cp /root/certs/haha.com.crt ca.crt
证书域名解析的更改
192.168.13.111  docker haha.com
验证部署是否成功
修改本地镜像标签为固定格式:域名/进行名称
docker tag nginx:v4 haha.com/nginx
上传镜像:
docker push haha.com/nginx
4 . Docker仓库添加用户认证功能
1 、创建用户密码文件:
 mkdir auth
docker run --rm --entrypoint htpasswd registry:2 \
-Bbn haha redhat > auth/htpasswd   #茶ungjian用户密码文件:用户haha密码redhat
2 由于创建密码文件已经开启了一个容器,需要先删除该容器
docker rmi registry
3 再次运行容器同时添加用户认证功能。
docker run -d \ ##-d:打入后台 
> --restart=always \ > --name registry \ 
>  -v "$(pwd)"/certs:/certs \
>   ##-v:手动指定数据卷的挂载 \
>    -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ ##-e:编辑registry的参数;监听443端口 
>     -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/toto.com.crt \ ##使用证书为生成的证书 
>     -e REGISTRY_HTTP_TLS_KEY=/certs/toto,com.key \ ##使用的私钥 
>      -p 443:443 \ ##端口映射
>      -v "$(pwd)"/auth:/auth \  ##挂载认证目录
>      -e "REGISTRY_AUTH=htpasswd" \  ##认证方式
>      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \  
>      -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  \  ##认证文件路径
>       registry:2 ##仓库名4 、查看容器以及端口开启情况:
docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                            NAMES
17a21a99d6a6        registry:2          "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   0.0.0.0:443->443/tcp, 5000/tcp   registrynetstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      656/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      778/master          
tcp        0      0 172.25.13.160:22        172.25.13.250:59964     ESTABLISHED 20132/sshd: root@pt 
tcp6       0      0 :::22                   :::*                    LISTEN      656/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      778/master          
tcp6       0      0 :::443                  :::*                    LISTEN      22096/docker-proxy 到次用户认证功能设置成功
 测试:
1 、再没有认证的情况下无法上传。
docker tag busybox:latest haha.com/busyboxdocker push haha.com/busybox
2 、进行认证登陆
 docker login haha.com
Username: haha
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
docker push haha.com/busybox
The push refers to repository [haha.com/busybox]
8a788232037e: Pushed 
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 5273 登陆成功后会产生认证文件
/root/.docker/config.json   #记录用户登陆信息