设为首页 收藏本站
查看: 1128|回复: 0

[经验分享] 搭建本地私有docker仓库

[复制链接]

尚未签到

发表于 2019-2-21 11:21:24 | 显示全部楼层 |阅读模式
  1、使用registry镜像创建私有仓库
docker run -d -p 5000:5000   --restart=always --name registry registry:2  这条命令将自动下载并启动一个registry容器,创建本地的私有仓库

  --restart=always:表示当docker服务重启时,registry也会自动启动
  记得修改/etc/docker/daemon.json 配置文件,将私有仓库地址写入到配置文件中
{
  "registry-mirrors": ["https://1a4frcsa.mirror.aliyuncs.com"],
  "insecure-registries": ["http://172.16.2.14:5000"]
}  2、 从配置的公共registry地址下载ubuntu:16.04 镜像到本地
docker pull ubuntu:16.04  3、将镜像重新打一个tag
# docker tag ubuntu:16.04 localhost:5000/my-ubuntu
[root@OPS01-LINTEST02 ~]# docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
localhost:5000/my-ubuntu   latest              5e8b97a2a082        7 days ago          114MB
ubuntu                     16.04               5e8b97a2a082        7 days ago          114MB  4、将镜像push到自己搭建的私有仓库中
# docker push localhost:5000/my-ubuntu
The push refers to repository [localhost:5000/my-ubuntu]
2de391e51d73: Pushed
d73dd9e65295: Pushed
686245e78935: Pushed
d7ff1dc646ba: Pushed
644879075e24: Pushed
latest: digest: sha256:689aa49d87d325f951941d789f7f7c8fae3394490cbcf084144caddba9c1be12 size: 1357  5、删除本地缓存的ubuntu:16.04和localhost:5000/my-ubuntu 镜像,这不会删除私有仓库中的镜像。然后测试从私有仓库pull镜像。
# docker image remove ubuntu:16.04
# docker image remove localhost:5000/my-ubuntu  6、从本地私有仓库下载镜像
# docker pull localhost:5000/my-ubuntu
Using default tag: latest
latest: Pulling from my-ubuntu
b234f539f7a1: Pull complete
55172d420b43: Pull complete
5ba5bbeb6b91: Pull complete
43ae2841ad7a: Pull complete
f6c9c6de4190: Pull complete
Digest: sha256:689aa49d87d325f951941d789f7f7c8fae3394490cbcf084144caddba9c1be12
Status: Downloaded newer image for localhost:5000/my-ubuntu:latest  7、stop 本地registry

# docker container stop registry  停止私有仓库的容器
docker container stop registry && docker container rm -v registry  停止容器并删除
  8、自定义registry的端口,当5000端口被占用时,可以使用其他端口替代

# docker run -d -p 5001:5000 --name registry-test registry:2
29f769711de0c981abf7b2dff7e79297338e860abf01ec330d09036da8045a42
[root@OPS01-LINTEST02 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      506/rpcbind         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      73954/sshd         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1197/master         
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      960/zabbix_agentd   
tcp6       0      0 :::5001                 :::*                    LISTEN      111483/docker-proxy
tcp6       0      0 :::111                  :::*                    LISTEN      506/rpcbind         
tcp6       0      0 :::21                   :::*                    LISTEN      953/vsftpd         
tcp6       0      0 :::22                   :::*                    LISTEN      73954/sshd         
tcp6       0      0 :::10050                :::*                    LISTEN      960/zabbix_agentd  -p后面第一个5001是docker服务器对外的端口,第二个5000是容器的端口。
  9、如果想修改容器内的registry服务器监听的端口,可以使用下面的命令
docker run -d -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 -p 5001:5001 --name registry-test registry:2  10、将自定义仓库中的镜像存储到主机上
  默认情况下,我们上传到私有仓库中的镜像存储在容器的/var/lib/registry路径下,如果想将镜像保存到本地,可以在容器启动时,创建一个卷
docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2  这样重新上传的镜像也会保存在本地的/mnt/registry下

  通过API来查询本地仓库镜像信息
# curl http://172.16.2.14:5000/v2/_catalog
{"repositories":["my-ubuntu"]}#  curl http://172.16.2.14:5000/v2/my-ubuntu/tags/list
{"name":"my-ubuntu","tags":["latest"]}  API官方介绍参考:https://docs.docker.com/registry/spec/api/#deleting-a-layer
  搭建私有仓库,可以参考官方文档:https://docs.docker.com/registry/deploying/
  删除私有仓库中的镜像方法一:
  1、进入到容器中,修改配置文件
ersion: 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  2、
$ curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://172.16.33.1:5000/v2/mytest/manifests/latest 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
# 删除tag
$ curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://172.16.33.1:5000/v2/mytest/manifests/sha256:1f57b0eddcb21cb798e4841c8e5634a2b0269f4500c750d503a2e54dd91fe0e4
# 上一步删除后需要到registry容器中回收
$ docker exec -it registry_container_id sh
$ registry garbage-collect /etc/docker/registry/config.yml  删除镜像方法二
  使用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、给脚本添加执行权限

$ sudo chmod +x /usr/local/bin/delete_docker_registry_image  3、通过环境变量设置镜像保存在本地的路径
export REGISTRY_DATA_DIR=/opt/registry_data/docker/registry/v2  我本地测试环境的路径为

export REGISTRY_DATA_DIR=/mnt/registry/docker/registry/v2  4、测试执行删除一个repo,查看哪些目录需要删除

$ delete_docker_registry_image --image testrepo/awesomeimage --dry-run  这里testrepo/aweomeimage  就是你需要删除的,保存在本地的某个repo下的某个镜像,例如我上面上传的my-ubuntu
  改命令不会立即删除镜像,而是测试
# delete_docker_registry_image --image my-ubuntu --dry-run         
INFO     [2018-06-14 09:24:47,481]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/43/43ae2841ad7a7fd1aeae30028105cac7f6ee0ec955e5229e52b3333fea3c17b5
INFO     [2018-06-14 09:24:47,481]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/5e/5e8b97a2a0820b10338bd91674249a94679e4568fd1183ea46acff63b9883e9c
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/68/689aa49d87d325f951941d789f7f7c8fae3394490cbcf084144caddba9c1be12
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/55/55172d420b43cf03feeec11bcc917c7ddfc192036102e065ab57aa9abb95311e
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/f6/f6c9c6de41905e9a66f2bc2c4a19858c8dc5b0a94f01e03eafc719afe25888aa
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/5b/5ba5bbeb6b91e2676c98255c6babc66d7b05cac40185eeba4b3773199c701da0
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/blobs/sha256/b2/b234f539f7a1d65eabae1617e63c81ac01768abffd48b5cbbf7166efca6a3429
INFO     [2018-06-14 09:24:47,482]  DRY_RUN: would have deleted /mnt/registry/docker/registry/v2/repositories/my-ubuntu  查看本地镜像是否还在

# curl http://172.16.2.14:5000/v2/_catalog
{"repositories":["my-ubuntu"]}  可以看到镜像还没有被删除

  5、执行删除repo的操作(先停掉registry服务)
$ delete_docker_registry_image --image testrepo/awesomeimage  例如:我要删除上传的my-ubuntu镜像
# delete_docker_registry_image --image my-ubuntu
INFO     [2018-06-14 09:31:11,688]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/43/43ae2841ad7a7fd1aeae30028105cac7f6ee0ec955e5229e52b3333fea3c17b5
INFO     [2018-06-14 09:31:11,689]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/5e/5e8b97a2a0820b10338bd91674249a94679e4568fd1183ea46acff63b9883e9c
INFO     [2018-06-14 09:31:11,689]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/68/689aa49d87d325f951941d789f7f7c8fae3394490cbcf084144caddba9c1be12
INFO     [2018-06-14 09:31:11,689]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/55/55172d420b43cf03feeec11bcc917c7ddfc192036102e065ab57aa9abb95311e
INFO     [2018-06-14 09:31:11,689]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/f6/f6c9c6de41905e9a66f2bc2c4a19858c8dc5b0a94f01e03eafc719afe25888aa
INFO     [2018-06-14 09:31:11,690]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/5b/5ba5bbeb6b91e2676c98255c6babc66d7b05cac40185eeba4b3773199c701da0
INFO     [2018-06-14 09:31:11,690]  Deleting /mnt/registry/docker/registry/v2/blobs/sha256/b2/b234f539f7a1d65eabae1617e63c81ac01768abffd48b5cbbf7166efca6a3429
INFO     [2018-06-14 09:31:11,699]  Deleting /mnt/registry/docker/registry/v2/repositories/my-ubuntu  执行下面的命令,再次查看镜像是否存在
# curl http://172.16.2.14:5000/v2/_catalog      
{"repositories":[]}  可以看到my-ubuntu被删除了

  6、删除某个tag
$ delete_docker_registry_image --image testrepo/awesomeimage:tag  测试:将从公共仓库pull下来的centos:7 镜像打两个tag,然后push到私有仓库
docker tag centos:7 localhost:5000/my-centos:7
docker tag centos:7 localhost:5000/my-centos:latest  将镜像push到私有仓库
docker push localhost:5000/my-centos:7
curl http://172.16.2.14:5000/v2/my-centos/tags/list
{"name":"my-centos","tags":["7"]}  将my-centos:latest也push到本地私有仓库,会提示镜像已存在,这是因为这两个镜像完全相同,从镜像ID可以看出来
$ docker push localhost:5000/my-centos:latest
The push refers to repository [localhost:5000/my-centos]
bcc97fbfc9e1: Layer already exists
latest: digest: sha256:eed5b251b615d1e70b10bcec578d64e8aa839d2785c2ffd5424e472818c42755 size: 529
##查看my-centos镜像的所有tag,可以看到有两个,分别是7和latest
[root@OPS01-LINTEST02 bin]# curl http://172.16.2.14:5000/v2/my-centos/tags/list                  
{"name":"my-centos","tags":["7","latest"]}  删除latest这个tag执行下面的命令
$ delete_docker_registry_image --image my-centos:latest
INFO     [2018-06-14 09:45:00,802]  Deleting /mnt/registry/docker/registry/v2/repositories/my-centos/_manifests/tags/latest
$ curl http://172.16.2.14:5000/v2/my-centos/tags/list  
{"name":"my-centos","tags":["7"]}  7、添加访问权限和用户认证
  生产环境中,对私有仓库还需要进行访问代理,以及提供认证和用户管理
  我们可以用nginx代理来实现访问控制和用户管理。
  安装nginx
yum -y install nginx  注释掉/etc/nginx/nginx.conf中默认的index页面的配置
  在/etc/nginx/conf.d中新建一个配置文件docker-registry.conf,内容如下:
upstream docker-registry {
    server localhost:5000;
}
server {
    listen 15000;
    server_name mydockerrepo.com;
    add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forward-Proto $scheme;
    proxy_read_timeout  600;
    client_max_body_size 0;
    chunked_transfer_encoding on;
   location / {
      auth_basic "Please Input usernme/password";
##    auth_basic_user_file /etc/nginx/conf.d/passwd.txt;
## 可以写绝对路径,也可以写相对路径
      auth_basic_user_file conf.d/passwd.txt;
      proxy_pass http://docker-registry;
   }
}  生成账号密码配置文件
  安装httpd,使用htpasswd命令创建
htpasswd -c /etc/nginx/conf.d/passwd.txt user1
# cat passwd.txt
user1:$apr1$yyMVokyA$gM8n1QEvLF7AyYI1yTdSi/  输入两次密码即可,生成账户密码文件保存在passwd.txt中,通常将该文件隐藏。再次访问docker registry时,会要求输入账号密码





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675279-1-1.html 上篇帖子: Docker学习与实践 Ⅲ 下篇帖子: Docker高手十一法则
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表