Docker——私有仓库集群构建

编程入门 行业动态 更新时间:2024-10-09 08:34:13

Docker——私有仓库<a href=https://www.elefans.com/category/jswz/34/1771240.html style=集群构建"/>

Docker——私有仓库集群构建

摘要

随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库。目前常用的两种仓库:公共仓库和私有仓库。最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传时,是需要注册的。私有仓库最常用的就是Registry、Harbor两种,那接下来详细介绍如何搭建registry私有仓库。

一、环境准备

两台CentOS7.4,一台为Docker私有仓库;另一台为Docker客户端,测试使用;

二、配置registry私有仓库

#  <!--docker宿主机开启路由功能-->echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf <!--刷新配置-->sysctl -pnet.ipv4.ip_forward = 1<!--配置镜像加速-->vim /etc/docker/daemon.json<!--添加阿里云加速--> {"registry-mirrors":[""]} <!--重新启动docker服务-->systemctl reload docker<!--查找registry镜像-->docker search registrydocker pull registry<!--registry镜像可以直接先pull下来,也可以不下载,根据自己情况而定-->docker run -d -p 5000:5000 --name registry --restart=always -v /opt/registry:/var/lib/registry registry<!--查看docker运行的容器-->docker ps<!--查看docker所有镜像-->docker images  <!--配置docker服务支持registry服务-->vim /etc/docker/daemon.json {"registry-mirrors":[""],
"insecure-registries":["192.168.100.10:5000"]  <!--添加此行-->
}<!--重新启动docker服务-->systemctl reload docker docker info

三、registry上传与下载镜像

# 给镜像打标签docker tag mysql 192.168.25.140:5000/mysql# 上传的镜像docker push 192.168.25.140:5000/mysql<!--客户端安装docker服务,配置镜像加速--><!--配置docker支持registry服务 -->vim /etc/docker/daemon.json {"registry-mirrors":[""],
"insecure-registries":["192.168.100.10:5000"]  <!--添加此行-->
}<!--重新启动docker服务-->systemctl restart docker <!--客户端下载私有仓库中的镜像-->docker pull 192.168.25.140:5000/mysql docker images <!--查看镜像是否下载成功-->

四、配置registry加载身份验证

但是现在存在一个问题,如果这也部署的话企业内部所有人员皆可访问我们的私有仓库,为了安全起见,接下来为registry添加一个身份验证,只有通过了身份验证才可以上传或者下载私有仓库中的镜像。

<!--安装加密工具httpd-tools-->yum -y install httpd-tools  <!--创建存放验证密钥目录-->mkdir /opt/registry-auth<!--配置registry身份验证数据库-->
<!--"-Bbn”参数解释:B强制密码加密;b在命令中输入密码,不提示输入密码;n不更新密钥文件-->htpasswd -Bbn bob pwd@123 > /opt/registry-auth/htpasswd<!--删除此服务器上的所有容器,接下来重新生成一个需要身份验证的私有仓库容器-->docker run -d -p 5000:5000 --restart=always \
-v /opt/registry-auth/:/auth/ \
-v /opt/registry:/var/lib/registry --name registry-auth -e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry <!--重新运行一个支持身份验证的registry私有镜像仓库容器-->docker tag tomcat:latest 192.168.100.10:5000/image/tomcat:1.0 docker push 192.168.100.10:5000/image/tomcat:1.0<!--测试不通过身份验证是否可以往私有仓库上传镜像--><!--提示没有身份验证,上传不了-->no basic auth credentials<!--登录私有镜像仓库,通过身份验证即可上传-->docker login 192.168.100.10:5000 Username: bob   <!--输入bob-->
Password:    <!--输入密码--><!--再次上传镜像到私有仓库-->docker push 192.168.100.10:5000/image/tomcat:1.0 <!--docker客户端不通过身份验证直接下载私有仓库中的镜像直接被拒绝-->docker pull 192.168.100.10:5000/image/tomcat:1.0Error response from daemon: Get http://192.168.100.10:5000/v2/image/tomcat/manifests/1.0: no basic auth credentials<!--登录私有仓库,通过身份验证-->
docker login 192.168.100.10:5000 Username: bob  <!--输入bob-->
Password:     <!--输入密码-->docker pull 192.168.100.10:5000/image/tomcat:1.0 <!--下载私有仓库中的镜像--><!--查看docker客户端镜像-->docker images  

五、docker registry 私有仓库查询、删除

修改tag (以hello-world为例)

拉取镜像docker pull hello-world修改镜像docker tag  hello-world  hub.test:5000/hello-world:1.0上传、删除、再下载镜像,删除后能下载成功docker imagesdocker push  hub.test:5000/hello-world:1.0docker rmi hub.test:5000/hello-world:1.0docker imagesdocker pull  hub.test:5000/hello-world:1.0docker images

 查看仓库镜像

curl hub.test:5000/v2/_catalog

registry开启删除

#查看默认配置
docker exec -it  registry sh -c 'cat /etc/docker/registry/config.yml'
#开启删除(添加  delete: enabled: true)
docker exec -it  registry sh -c "sed -i '/storage:/a\  delete:' /etc/docker/registry/config.yml"
docker exec -it  registry sh -c "sed -i '/delete:/a\    enabled: true' /etc/docker/registry/config.yml"
#重启
docker restart registry

查询、删除镜像 

#查询镜像
curl  <仓库地址>/v2/_catalog#查询镜像tag(版本)
curl  <仓库地址>/v2/<镜像名>/tags/list#删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"#获取镜像digest_hash
curl  <仓库地址>/v2/<镜像名>/manifests/<tag> \--header "Accept: application/vnd.docker.distribution.manifest.v2+json"

六、docker registry集群构建

为了保证的仓库的高可用,利用的docker registry构建多个镜像仓库。但是docker registry好像是没有提供各个仓库之间镜像构建的功能。因此如果你自己需要做docker registry集群构建的相关工具,这里提供一个思路给你参考,帮助你实现docker registry集群构建。

  • 首先获取到源 Registry 里的所有镜像列表
  • 然后逐个获取镜像的 tags
  • 然后依次遍历将对应的镜像拉到本地,然后 docker tag 一下,命名为新的 registry 镜像名称
  • 然后 push docker 镜像到新的 registry
  • 删除下载到本地的镜像和推送到新的 registry 的镜像、

这里提供一个powershell脚本供大家参考

# variables
$srcRegUser = "xxx"
$srcRegPwd = "111111"
$srcRegHost = "xxx.azurecr"
$destRegUser = "yyy"
$destRegPwd = "222"
$destRegHost = "registry.xxx"# get repositories from source registry
# httpie
$response = (http -b -a "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# curl
#$response = (curl -u "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# repository
$repositories = $response.repositories#
Write-Host $repositories# login source registry
docker login $srcRegHost -u $srcRegUser -p $srcRegPwd
# login dest registry
docker login $destRegHost -u $destRegUser -p $destRegPwd# sync
foreach($repo in $repositories)
{Write-Host "sync $repo begin"$srcTag = "${srcRegHost}/${repo}:latest"$destTag = "${destRegHost}/${repo}:latest"Write-Host "source image tag: $srcTag"Write-Host "dest image tag $destTag"Write-Host "docker pull $srcTag begin"docker pull $srcTagWrite-Host "docker pull $srcTag completed"Write-Host "docker tag $srcTag $destTag ing"docker tag $srcTag $destTagWrite-Host "docker push $destTag begin"docker push $destTagWrite-Host "docker push $destTag completed"Write-Host "docker rmi $srcTag $destTag begin"docker rmi $srcTag $destTagWrite-Host "docker rmi $srcTag $destTag end"Write-Host "sync $repo completed"
}Write-Host "Completed..."

阿里云好像有一个镜像同步工具,GitHub - AliyunContainerService/image-syncer: Docker image synchronization tool for Docker Registry V2 based services image-syncer 是一个docker镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的docker镜像仓库服务,看介绍还是很棒的,有需要 registry 之间同步镜像的可以试试这个工具,看介绍这个工具不会拉取到本地磁盘,从源 registry 获取镜像数据之后直接就推送到新的 registry 里了,效率会高很多。

七、Docker registry仓库历史镜像批量清理

7.1 查询镜像层

在了解以上前提后,开始排查哪些registry repo的历史镜像较多(分层数量多)。1.从宿主机进入docker registry容器内部,使用registry GC分析命令查看分层情况:

# 1.--dry-run选项为layer层级分析,并不实际进行GCregistry garbage-collect --dry-run /etc/docker/registry/config.yml  # 2.可以便捷使用以下命令对分层数较多的镜像做一个排序:registry garbage-collect --dry-run /etc/docker/registry/config.yml  >> res.txt
6ac03183e197:~# cat res.txt | awk -F : '{print $1}' | sort | uniq -c | sort -rn -k1 | head -10 | grep -v "redis\|jdk\|php\|mysql\|nginx\|apache\|zk\|elastic"134161 zdtest
56101  ordertest
42691  bjdev
35881  zhqtest
13801  systemtest
9601   zddev
9361   bjtest
7411   dsystemtest
505    tooltest

7.2 删除镜像

无论是delete方法调用restful接口,还是registry 自带工具的GC清理,都需要registry的配置文件中开启允许删除功能:vim /etc/docker/registry/config.ymlstorage:delete:enabled: true

由于数量较多,因此使用python多线程来调用registry restful api进行删除操作,脚本内容如下,可根据自己的场景修改registry url:

import requests
from concurrent.futures import ThreadPoolExecutorclass DockerHub(object):def __init__(self, hub, repos):self.hub = hubself.repos = repos@staticmethoddef get_tag_list(hub, repo):# 获取这个repo的所有tagstag_list_url = '%s/v2/%s/tags/list' % (hub, repo)r1 = requests.get(url=tag_list_url)tag_list = r1.json().get('tags')return tag_listdef main(self):thpool = ThreadPoolExecutor(10)for repo in self.repos:thpool.submit(self.delete_images, repo)thpool.shutdown(wait=True)def delete_images(self, repo):hub = self.hubtag_list = self.get_tag_list(hub=hub, repo=repo)num = 0try:# 保留最后两个版本的镜像for tag in tag_list[:-2]:# 获取image digest摘要信息get_info_url = '{}/v2/{}/manifests/{}'.format(hub, repo, tag)header = {"Accept": "application/vnd.docker.distribution.manifest.v2+json"}r2 = requests.get(url=get_info_url, headers=header, timeout=10)digest = r2.headers.get('Docker-Content-Digest')# 删除镜像delete_url = '%s/v2/%s/manifests/%s' % (hub, repo, digest)r3 = requests.delete(url=delete_url)if r3.status_code == 202:num += 1except Exception as e:print(str(e))print('仓库%s 共删除了%i个历史镜像' % (repo, num))if __name__ == '__main__':hub = ':5000'repos = ['zdtest', 'ordertest', 'bjdev', 'zhqtest', 'systemtest', 'zddev', 'bjtest', 'dsystemtest', 'tooltest']d = DockerHub(hub=hub, repos=repos)d.main()

回到docker registry容器内,直接运行GC命令,这次不再加 --dry-run选项

 registry garbage-collect /etc/docker/registry/config.yml

 查看磁盘,可以发现磁盘容量已经空闲出许多了,镜像清理及存储空间释放完成!

博文参考

.htm

安装docker registry - MartinEDM - 博客园

更多推荐

Docker——私有仓库集群构建

本文发布于:2024-03-08 16:54:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1721516.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:集群   仓库   Docker

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!