docker搭建私有仓库。上传本地镜像到私有仓库。搭建管理的ui界面 电脑版发表于:2022/8/22 11:54 [TOC] ## docker搭建私有仓库registry registry介绍: tn2>官方私有仓库,优点:简单;缺点:简单,无法进行复杂的管理操作 ### 一 下载 registry镜像 ``` docker pull registry ``` 默认是下载latest版本,也可以指定某个版本,比如2.8.1版本 docker pull registry:2.8.1  ### 二 创建daemon.json文件,添加一点配置 使用vi命令创建文件 ``` vi /etc/docker/daemon.json ``` 添加内容 ``` { "insecure-registries": ["192.168.6.226:5000"], "registry-mirrors": ["https://4abdkxlk.mirror.aliyuncs.com"] } ``` 查看文件 ``` cat /etc/docker/daemon.json ``` 效果如图  "insecure-registries": ["192.168.6.226:5000"]是指定私有仓库地址的意思。 tn2>如果etc下面没有docker这个文件夹,创建是不会成功的,先在etc目录下使用 mkdir docker创建一下docker文件夹就行 ### 三 重启docker ``` systemctl daemon-reload systemctl restart docker.service ``` 可能执行会报错 tn6>unable to configure the Docker daemon with file /etc/docker/daemon.json:... 是因为创建/etc/docker/daemon.json文件导致的。检查内容一定要对。可能出现错误的点,比如注释,空格之类的,如果有问题可以尝试把注释去掉,第一行加一个空格试试,一般都是一些不正确格式的注释引起的。比如修改成这样就可以解决上面报的那个错了:  也可以使用journalctl?-xe命令查看报错详情  我们可以看到确实是因为/etc/docker/daemon.json文件的内容问题,修改正确重新执行重启命令。 ### 四 创建registry容器并开放端口 ``` docker create -it registry /bin/bash docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry //-v表示挂载,前者是宿主机,后者是容器' ``` ## 上传本地镜像到私有仓库 ### 一 随便拉取一个镜像,比如nginx  ### 二 给本地镜像打个tag标签。标记本地镜像,将其归入某一仓库。 这里的标记就是私有仓库的ip地址和端口号。 ``` docker tag nginx 192.168.6.226:5000/nginx:v1 ```  ### 三 使用docker命令上传本地镜像到私有镜像仓库 ``` docker push 192.168.6.226:5000/nginx:v1 ``` 可以看到上传的进度  上传完毕的效果如下  ### 四 获取私有仓库列表查看是否上传成功 ``` curl -XGET http://192.168.6.226:5000/v2/_catalog ``` 如图:  ### 五 验证镜像,从私有仓库下载镜像 删除原有镜像 ``` docker tag nginx aojiancc/nginx:v1 ``` 删除后在查看一下镜像,确认下是否真的被删除掉。如图3.x所示刚刚标记的镜像已经被删除掉了  从本地仓库下载镜像 ``` docker pull 192.168.6.226:5000/nginx:v1 ``` 要注意拉取的时候要指定v1版本,不然拉取的就是latest版本,由于我们没有latest版本所以会报错,如图所示:  加上v1版本就可以被正确的拉取了  然后在使用docker images查看一下镜像即可。  ## 搭建管理的ui界面 ### 一: 拉取docker-registry-ui镜像 ``` docker pull joxit/docker-registry-ui:latest ``` ### 二: 给registry创建一个配置文件,主要是配置允许跨域 这里我们重新启动前面创建的registry容器,前面启动的容器可以先干掉都行。后面在介绍以下,不重新启动registry容器直接使用以前容器的方式。 ``` mkdir -p /etc/docker/registry cat > /etc/docker/registry/config.yml <<EOF version: 0.1 log: accesslog: disabled: true level: debug formatter: text fields: service: registry environment: staging storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] Access-Control-Allow-Origin: ['http://192.168.6.226'] Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] Access-Control-Allow-Headers: ['Authorization', 'Accept'] Access-Control-Max-Age: [1728000] Access-Control-Allow-Credentials: [true] Access-Control-Expose-Headers: ['Docker-Content-Digest'] http2: disabled: false health: storagedriver: enabled: true interval: 10s threshold: 3 EOF ``` ### 三: 使用docker-compose同时启动这两个容器即可 ``` cat > docker-compose.yaml <<EOF version: '2.0' services: registry: image: registry:2.8.1 ports: - 5000:5000 volumes: - /opt/registry:/var/lib/registry - /etc/docker/registry/config.yml:/etc/docker/registry/config.yml ui: image: joxit/docker-registry-ui:latest ports: - 80:80 environment: - REGISTRY_TITLE=My Private Docker Registry - REGISTRY_URL= http://192.168.6.226:5000 - SINGLE_REGISTRY=true depends_on: - registry EOF docker-compose up -d ``` 启动成功后,访问http://192.168.6.226即可查看私有镜像仓库的ui。 tn2>下面说一下不重新启动容器的方式,其实ui只是去调用registry里边的接口而已,所以我们也完全可以一个一个来。我们可以就使用我们前面创建得registry容器 ### 一: 使用docker-compose只启动docker-registry-ui ``` cat > docker-compose.yaml <<EOF version: '2.0' services: ui: image: joxit/docker-registry-ui:latest ports: - 80:80 environment: - REGISTRY_TITLE=My Private Docker Registry - REGISTRY_URL=http://192.168.6.226:5000 - SINGLE_REGISTRY=true EOF docker-compose up -d ``` ### 二: 然后访问私有镜像仓库的ui会出现跨域的错误。  所以我们要进行跨域配置。 如果是新启动的registry可以和使用docker-compose一样,创建一个配置文件然后在启动的时候映射一下配置文件即可。需要注意配置文件读写权限问题。 ``` docker run -p 5000:5000 -v /data/registry:/tmp/registry -v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml registry ``` 如果前面已经使用手动命令启动过registry,比如我们这里的情况,现在要修改配置,就需要进入容器内部在修改配置文件了。 以下操作涉及到了进入容器、查看目录、进入配置文件目录、查看默认配置文件内容等,如下图所示。  编辑文件添加如下可以跨域的内容:  在贴一下这块代码: ``` headers: X-Content-Type-Options: [nosniff] Access-Control-Allow-Origin: ['http://192.168.80.200'] Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] Access-Control-Allow-Headers: ['Authorization', 'Accept'] Access-Control-Max-Age: [1728000] Access-Control-Allow-Credentials: [true] Access-Control-Expose-Headers: ['Docker-Content-Digest'] ``` ### 三: 然后访问就可以了。可以看到我们前面上传的一个nginx镜像  ### 四: 重新打tag在上传一个镜像 打tag ``` docker tag registry 192.168.6.226:5000/registry:latest ```  上传镜像到私有仓库 ``` docker push 192.168.6.226:5000/registry:latest ```  然后就可以看到刚刚上传的镜像了  点击进去可以查看详情 注意这个时间,不是镜像的上传,而是镜像的创建时间  镜像的创建时间在你上传镜像的地方可以看到的,它拉取的是这个时间  ### 五: Registry中相关的接口可以参考 <https://docs.docker.com/registry/spec/api/#detail> 部分接口如下,也就是说你使用这些接口完全可以自己针对registry写一套ui出来。 ``` # API Version Check $ curl 192.168.80.200:5000/v2/ {} # Listing Repositories $ curl 192.168.80.200:5000/v2/_catalog {"repositories":["nginx"]} # Listing Image Tags $ curl 192.168.80.200:5000/v2/nginx/tags/list {"name":"nginx","tags":["latest"]} # Fetch the manifest by tag $ curl 192.168.80.200:5000/v2/nginx/manifests/latest # 获取镜像的digest $ curl -I 192.168.80.200:5000/v2/nginx/manifests/latest -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' ... Docker-Content-Digest: sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 # Deleting an Image by digest, not supported by tag (只是删除了相关的tag,但文件实体并未删除) $ curl -X DELETE 192.168.80.200:5000/v2/nginx/manifests/sha256:ee89b00528ff4f02f2405e4ee221743ebc3f8e8dd0bfd5c4c20a2fa2aaa7ede3 # 清理磁盘,是否已被删除的 blob 数据 $ docker exec -it docker-registry bin/registry garbage-collect /etc/docker/registry/config.yml ```