搭建带ssl认证的docker registry私有仓库

1、首先Docker pull registry默认下载最新版的镜像,我这边是2.6.2版本

2、这边考虑私有仓库部署的服务器可能没有网络,可以使用docker save -o registry.tar registry:2.6.2保存一个镜像,然后把registry.tar打包到部署包里面,下次使用docker load -i registry.tar加载到本地镜像

3、保证ssl已安装,且/ect/ssl/openssl.cnf中关于生成密码定义的字段都有(网上可以查)

docker run --entrypoint htpasswd registry:2.6.2 -Bbn ${username} ${password} > ${dir}/auth/htpasswd openssl req -x509 -days 3650 -subj "/C=CN/ST=GuangDong/L=ShenZhen/CN=Registry/O=Company/CN=test.io/" -nodes -newkey rsa:2048 -keyout ${dir}/certs/registry.key -out ${dir}/certs/registry.crt

4、这里username password是你要设置ssl认证通过的用户名和密码,这里需要你自己记住的几个目录dir下的auth,certs,data。auth是存放你生成的用户名密码文件,certs是存放生成的证书文件,data后续准备用来挂载私有仓库的镜像存放目录的

docker run -d -p 5000:5000 --privileged=true --restart=always --name ${name} \
-v ${dir}/config.yml:/etc/docker/registry/config.yml \
-v ${dir}/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=registry on test.io" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v ${dir}/certs:/certs \
-v ${dir}/data:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key registry:2.6.2

这里的name是你要创建的私有仓库容器的名字,从挂载的三个目录我们可以看到是为了一一对应私有仓库容器内的目录结构的。这里我们可以看到私有仓库容器内存放镜像的目录为/var/lib/registry。这里说一下config.yml的映射原因:

version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        blobdescriptor: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
    delete:
        enabled: true
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

相比默认配置文件增加了delete:enabled:true选项,这是为了后面使用remote api支持删除镜像的,后面再说,到这里私有仓库就建好了。

5、现在要想使用私有仓库连接私有仓库并下载镜像查询删除镜像,你的主机需要的条件

/etc/hosts需要有xx.xx.xx.xx test.io的对应关系
/etc/ssl目录下有certs目录
你要在你的/etc/docker/certs.d目录下新建一个文件夹,命名为test.io:5000,然后把私有仓库${dir}/certs目录下的registry.crt证书拷贝到test.io:5000文件夹下(我这里的crt证书名字是registry.crt看上面生成的shell),最后我们使用docker login -u username -p password test.io:5000登陆。就可以开始使用私有仓库了。

6、如果你要上传镜像的话可以

docker tag test:latest test.io:5000/test:1.0
docker push test.io:5000/test:1.0

7、如果你要下载镜像的话可以

docker pull test.io:5000/test:1.0

8.现在要重点说v2版本之后的remote api改变

查询有哪些镜像:

curl -s –insecure –user username:password https://test.io:5000/v2/_catalog

这里curl使用了-s选项,因为有些情况下会出现%Total %Received %Xferd这些状态信息

查询镜像有哪些tag:curl -s –insecure –user username:password

https://test.io:5000/v2/image_name/tags/list

删除镜像:curl –header “Accept:

application/vnd.docker.distribution.manifest.v2+json” -I -X HEAD –insecure –user username:password https://test.io:5000/v2/image_name/manifests/image_tag

这里先拿到Docker-Content-Digest的值,后面从sha256都要带上(注意带上sha256)

curl –insecure –user username:password -X DELETE https://test.io:5000/v2/image_name/manifests/sha256:1583251f6052c35180381fbf28e93db0b9a26c2971f45532a5263c5dc4d18b61

这样删除就完成了。

但是,我测过有一个问题,使用curl删除之后,你再来使用curl来查询所有的镜像它还是存在的,你使用curl查询这个镜像的tag你会看到tag变为了null,然后你pull也是会失败的。也就是说你删除镜像仅仅只是阻止了pull,然后查询那里只是让tag变为了null。我自己试过把私有仓库容器的/var/lib/registry/docker/registry/v2/repositories/下对应镜像名字的文件夹删除掉,再查询就查不到了。最后删除了镜像还要回收空间,使用docker exec name bin/registry garbage-collect /etc/docker/registry/config.yml,这里name是你的私有仓库容器名字,/var/lib/registry/docker/registry/v2/blob是存放镜像的地方,使用gc垃圾回收这里的占用硬盘大小可以看到质的变化,我们可以在这里看垃圾回收的效果。

标签:Docker 发布于:2019-11-13 09:12:09