使用Registry2搭建Docker私有仓库

打造持续交付流水线一章中,在部署前,需要先打包Docker镜像,并上传到DockerHub镜像仓库。

DockerHub是由Docker推出的共有镜像仓库,使用广泛,但存在一下问题:

  • 由于众所周知的原因,从国内访问速度较慢

  • 对公网所有用户可见,存在泄密风险

  • 存在泄露风险

因此,搭建私有的容器镜像仓库,十分必要。

本节,我们将基于Docker官方的registry2,搭建私有镜像仓库。

启动

我们用Docker启动Docker镜像仓库:-)

  1. #!/bin/bash
  2. NAME="registry2"
  3. PUID="1000"
  4. PGID="1000"
  5. VOLUME="$HOME/docker_data/registry2"
  6. mkdir -p $VOLUME
  7. docker ps -q -a --filter "name=$NAME" | xargs -I {} docker rm -f {}
  8. docker run \
  9. --hostname $NAME \
  10. --name $NAME \
  11. --volume $VOLUME:/var/lib/registry \
  12. --env REGISTRY_STORAGE_DELETE_ENABLED=true \
  13. --env PUID=$PUID \
  14. --env PGID=$PGID \
  15. -p 5000:5000 \
  16. --detach \
  17. --restart always \
  18. registry:2

如上所示,我们添加了允许删除镜像的配置。

启动成功后,镜像仓库运行在 http://127.0.0.1:5000 地址上。

由于我们未启用https证书校验,因此需要在客户端上配置:

/etc/docker/daemon.json中添加一行

  1. "insecure-registries":["10.1.172.136:5000","127.0.0.1:5000"],

上传镜像

打tag

  1. docker tag 7aa22139eca1 127.0.0.1:5000/jenkins-my-agent:latest

上传,成功!

  1. docker push 127.0.0.1:5000/jenkins-my-agent:latest
  2. The push refers to repository [127.0.0.1:5000/jenkins-my-agent]
  3. 25af0e804bd9: Pushed
  4. d481382bb71b: Pushed
  5. 9a0d9a003e42: Pushed
  6. d90590887490: Pushed
  7. 2e10e3c8baa6: Pushed
  8. 260e081d58bf: Pushed
  9. 545b9645e192: Pushed
  10. ed0f1dee792d: Pushed
  11. ebb837d412f9: Pushed
  12. b80c59a58a8e: Pushed
  13. 953a3e11bab6: Pushed
  14. 833c84c9f2ea: Pushed
  15. 7a45298bdd53: Pushed
  16. 62a747bf1719: Pushed
  17. latest: digest: sha256:3b7ebd6948da5d7d9267e02b58698c3046e940f565eab9687243aaa8727ace29 size: 3266

我们查询下历史版本,这里发现有一个latest的版本了

  1. curl "127.0.0.1:5000/v2/jenkins-my-agent/tags/list"
  2. {"name":"jenkins-my-agent","tags":["latest"]}

尝试删除镜像,成功!

  1. registry='localhost:5000'
  2. name='jenkins-my-agent'
  3. curl -v -sSL -X DELETE "http://${registry}/v2/${name}/manifests/$(
  4. curl -sSL -I \
  5. -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
  6. "http://${registry}/v2/${name}/manifests/$(
  7. curl -sSL "http://${registry}/v2/${name}/tags/list" | jq -r '.tags[0]'
  8. )" \
  9. | awk '$1 == "Docker-Content-Digest:" { print $2 }' \
  10. | tr -d $'\r' \
  11. )"

至此,我们成功搭建了私有镜像。以下是拓展练习,留给你来实现:

  • 启用https证书(自签)

  • 支持每个容器保留最近5个tag

  • 打造持续交付流水线中的镜像仓库,替换为私有仓库