Docker仓库主要用于存放Docker镜像,Docker仓库分为公共仓库和私有仓库,基于registry可以搭建本地私有仓库,使用私有仓库的优点如下:

1)节省网络带宽,针对于每个镜像不用去Docker官网仓库下载;

2)下载Docker镜像从本地私有仓库中下载;

3)组件公司内部私有仓库,方便各部门使用,服务器管理更加统一;

4)可以基于GIT或者SVN、Jenkins更新本地Docker私有仓库镜像版本。

       官方提供Docker Registry来构建本地私有仓库,目前最新版本为v2,最新版的docker已不再支持v1,Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如下为在192.168.0.123服务器上构建Docker本地私有仓库的方法及步骤:

一、搭建本地私有仓库(无证书)

1、下载Docker registry镜像



docker pull registry



2、启动私有仓库容器



mkdir -p  /data/registry/
docker run -itd -p 5000:5000 -v /data/registry:/var/lib/registry --privileged docker.io/registry



3、上传镜像至本地私有仓库(可以从本地或者另一台机器上传镜像到仓库)

1)客户端上传镜像至本地私有仓库,如下以tomcat镜像为例,将tomcat上传至私有仓库服务器。



docker pull tomcat
docker tag docker.io/tomcat:latest 10.6.191.182:5000/tomcat:v1
docker rmi docker.io/tomcat:latest



2)客户端docker配置文件(vi /etc/sysconfig/docker)添加如下代码,同时重启docker服务,获取本地私有仓库



OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry 10.6.191.182:5000'
ADD_REGISTRY='--add-registry 10.6.191.182:5000'



在OPTIONS后面添加 --insecure-registry 10.6.191.182:5000解决HTTPS错误问题;

dockerhub私有仓库 设置密码 docker私有仓库的优点_java

添加 ADD_REGISTRY代码将pull源修改为本地仓库地址,这时候直接 docker pull tomcal:v1(必须加上tag标签,不然将会从官网下载latest)

dockerhub私有仓库 设置密码 docker私有仓库的优点_docker_02

3)将镜像上传至本地私有仓库



docker push  10.6.191.182:5000/tomcat:v1



4、检测本地私有仓库



curl -XGET http://10.6.191.182:5000/v2/_catalog              查看本地私有仓库已有镜像
curl -XGET http://10.6.191.182:5000/v2/tomcat/tags/list     查看本地私有仓库镜像以及tag号



二、搭建本地私有仓库(有证书)

1、生成根证书



mkdir -p certs && openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/rootCA.key -x509 -days 1825 -out certs/rootCA.crt



dockerhub私有仓库 设置密码 docker私有仓库的优点_运维_03

2、生成证书



cd certs
openssl genrsa -out domain.key 2048
openssl req -new -newkey rsa:2048 -nodes -sha256 -key domain.key -out domain.csr -subj "/C=CN/ST=HB/L=WH/O=DM/OU=YPT/CN=domain"
cat >openssl-exts.conf <<EOF
extensions = san
[san]
keyUsage = digitalSignature
extendedKeyUsage = clientAuth,serverAuth
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = IP:192.168.0.200,IP:127.0.0.1,DNS:192.168.0.200:5000,DNS:localhost,DNS:192.168.0.200
EOF
openssl x509 -req -sha256 -in domain.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out domain.crt -days 99999 -extfile ./openssl-exts.conf
rm domain.csr
rm openssl-exts.conf



3、复制根证书



mkdir -p  /etc/docker/certs.d/192.168.0.200:5000
cp certs/rootCA.crt /etc/docker/certs.d/192.168.0.200\:5000/ca.crt



4、启动镜像



docker pull registry
或者使用本地tar包
docker load -i registry_2.6.1.tar
docker tag f32a97de94e1 192.168.0.200:5000/registry:2.6.1
docker rmi docker.io/registry
mkdir -p /home/mnt/disks/registry
docker run -d -p 5000:5000 --restart=always --name secure_registry \ 
-v /root/registry/certs:/certs \ 
-v /home/mnt/disks/registry:/var/lib/registry \ 
-e REGISTRY_HTTP_SECRET=mytokensecret \ 
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \ 
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
 192.168.0.200:5000/registry:2.6.1



5、客户端使用仓库



mkdir /etc/docker/certs.d/192.168.0.200:5000
scp 192.168.0.200:/etc/docker/certs.d/192.168.0.200\:5000/ca.crt /etc/docker/certs.d/192.168.0.200\:5000/



三、安装私有仓库的web界面



mkdir -p /home/mnt/disks/registry-web-db
docker load -i ./images/docker-registry-web_v0.1.2.tar
docker tag hyper/docker-registry-web:v0.1.2  192.168.0.203:5000/docker-registry-web:v0.1.2
docker rmi hyper/docker-registry-web:v0.1.2
docker run  -itd --restart=always  -e ENV_DEFAULT_TAGS_PER_PAGE=5  -e ENV_DEFAULT_REPOSITORIES_PER_PAGE=10 \
-v /home/ansible_mgr/registry/conf/registry-web.yml:/conf/config.yml -v /home/ansible_mgr/registry/certs/domain.key:/conf/auth.key \
-v /home/mnt/disks/registry-web-db:/data -e REGISTRY_URL=https://192.168.0.203:5000/v2 \
-e REGISTRY_TRUST_ANY_SSL=true -e REGISTRY_BASIC_AUTH="YWRtaW46Y2hhbmdlbWU=" \
-e REGISTRY_NAME=192.168.0.203:5000   -p 18080:8080 --link secure_registry --name registry-web  192.168.0.203:5000/docker-registry-web:v0.1.2



registry-web.yml内容如下:



registry:
  url: https://docker.test.com:5000/v2
  name: docker.test.com:5000
  # To allow image delete, should be false
  readonly: false
  auth:
    # Enable authentication
    enabled: true
    # Token issuer
    # should equals to auth.token.issuer of docker registry
    issuer: 'YPT'
    # Private key for token signing
    # certificate used on auth.token.rootcertbundle should signed by this key
    key: /conf/auth.key



 

四、删除本地私有仓库镜像

删除镜像方法一

使用github上别人所写的工具,地址https://github.com/burnettk/delete-docker-registry-image

1、安装脚本,会将脚本下载到本地/usr/local/bin/delete_docker_registry_image

curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null



2、给脚本添加执行权限



chmod +x /usr/local/bin/delete_docker_registry_image



3、通过环境变量设置镜像保存在本地的路径



export REGISTRY_DATA_DIR=/data/registry/docker/registry/v2/



4、测试执行删除一个repo,查看哪些目录需要删除,改命令不会立即删除镜像,而是测试



delete_docker_registry_image --image tomcat --dry-run



dockerhub私有仓库 设置密码 docker私有仓库的优点_java_04

查看本地镜像是否还在



curl http://10.6.191.182:5000/v2/_catalog



dockerhub私有仓库 设置密码 docker私有仓库的优点_运维_05

5、执行删除repo的操作



delete_docker_registry_image --image tomcat



dockerhub私有仓库 设置密码 docker私有仓库的优点_dockerhub私有仓库 设置密码_06

6、删除某个tag



delete_docker_registry_image --image tomcat:v1



测试:将从公共仓库pull下来的centos:7 镜像打两个tag,然后push到私有仓库,会提示镜像已存在,这是因为这两个镜像完全相同,从镜像ID可以看出来