Docker 搭建 registry 私有仓库

拉取 nginx 最新版镜像:

docker pull registry:latest

为 registry 创建一个文件夹:

mkdir -p /home/docker/registry/

启动 registry 容器:

docker run --name registry01 -d --restart=always -v /home/docker/registry/:/var/lib/registry/ -p 6000:5000 registry

因为宿主机的 5000 端口被占用了,所以我就改用了 6000 端口

在启动 registry 容器后,使用 -v 参数映射时会自动创建 docker/registry/ 目录,所以主机的映射目录就变成了:/home/docker/registry/docker/registry/... ,对于强迫症患者来说,实在太别扭了,所以直接映射到主机的 home/ 文件夹即可,停止并删除容器,然后重新执行:

docker run --name registry01 -d --restart=always -v /home/:/var/lib/registry/ -p 6000:5000 registry

registry 容器已成功运行,需要验证一下:

curl http://localhost:6000/v2/_catalog

若能正常访问 registry 接口 _catalog,证明 registry 服务启动成功。

在安装并成功启动 registry 服务后,还需要配置一下,编辑 /etc/docker/daemon.json 文件,添加配置代码 "insecure-registries":["localhost:6000"],然后执行 systemctl daemon-reload 重新加载配置,因为镜像在推送到仓库的时候,可能会遇到问题:http: server gave HTTP response to HTTPS client,默认是使用 https 协议的,但我们的仓库是使用的http,所以要么创建一个https映射,要么将仓库地址加入到不安全的仓库列表中。

下面我们来试一下,push 一个镜像到刚刚创建的私有仓库中,但在 push 之前需要先创建用户:

docker login localhost:6000
Username: zzy0209
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

为了指定镜像上传的目标地址,需要在镜像名称前加上私有仓库的访问地址和用户名,具体镜像名称格式如下:REGISTRY_HOST/USERNAME/IMAGE_NAME:TAG

可以通过 docker tag 命令来修改镜像的名称:

docker tag am/service_gateway:74a5635 localhost:6000/zzy0209/am/service_gateway:74a5635

最后,将这个镜像 push 到私有仓库中:

docker push localhost:6000/zzy0209/am/service_gateway

再通过 registry 的 _catalog 接口验证一下:

curl http://localhost:6000/v2/_catalog
{"repositories":["zzy0209/am/service_gateway"]}

OK~

补充:设置仓库允许跨域访问

先复制一份 config.yml 配置文件
docker cp registry01:/etc/docker/registry/config.yml /home/docker/registry/config.yml

添加跨域配置后保存
vi /home/docker/registry/config.yml

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
    Access-Control-Allow-Headers: ['Origin,Accept,Content-Type,Authorization']
    Access-Control-Allow-Origin: ['*']
    Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE']
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

删除之前的容器,重新创建容器,并挂载 config.yml 配置文件

docker rm -f registry01
docker run --name registry01 -d --restart=always -v /home/:/var/lib/registry/ -v /home/docker/registry/config.yml:/etc/docker/registry/config.yml -p 6000:5000 registry
一个简单的记录,希望有所帮助!
原文地址:https://www.cnblogs.com/journet/p/12789610.html