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 ![](https://img.tnblog.net/arcimg/aojiancc2/99a06d1c885b41e7bcdb1a1b2d234cbf.png) ### 二 创建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 ``` 效果如图 ![](https://img.tnblog.net/arcimg/aojiancc2/6ccac101232a4f03865479faa5c73df0.png) "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文件导致的。检查内容一定要对。可能出现错误的点,比如注释,空格之类的,如果有问题可以尝试把注释去掉,第一行加一个空格试试,一般都是一些不正确格式的注释引起的。比如修改成这样就可以解决上面报的那个错了: ![](https://img.tnblog.net/arcimg/aojiancc2/6ccac101232a4f03865479faa5c73df0.png) 也可以使用journalctl?-xe命令查看报错详情 ![](https://img.tnblog.net/arcimg/aojiancc2/9b8d6906b5ab4d7bbe2cf151d1b7ac7e.png) 我们可以看到确实是因为/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 ![](https://img.tnblog.net/arcimg/aojiancc2/39dc9e54c4ca435f95c2ff1e21fb1f64.png) ### 二 给本地镜像打个tag标签。标记本地镜像,将其归入某一仓库。 这里的标记就是私有仓库的ip地址和端口号。 ``` docker tag nginx 192.168.6.226:5000/nginx:v1 ``` ![](https://img.tnblog.net/arcimg/aojiancc2/e31c77af2a4645c79121b61c3ae2face.png) ### 三 使用docker命令上传本地镜像到私有镜像仓库 ``` docker push 192.168.6.226:5000/nginx:v1 ``` 可以看到上传的进度 ![](https://img.tnblog.net/arcimg/aojiancc2/993f2633ccaf43298887f60c2cb56fab.png) 上传完毕的效果如下 ![](https://img.tnblog.net/arcimg/aojiancc2/3e0db83c96bd44d5b0c722f1ec471058.png) ### 四 获取私有仓库列表查看是否上传成功 ``` curl -XGET http://192.168.6.226:5000/v2/_catalog ``` 如图: ![](https://img.tnblog.net/arcimg/aojiancc2/2d238b63218f42a9a2f1fa647c8fc978.png) ### 五 验证镜像,从私有仓库下载镜像 删除原有镜像 ``` docker tag nginx aojiancc/nginx:v1 ``` 删除后在查看一下镜像,确认下是否真的被删除掉。如图3.x所示刚刚标记的镜像已经被删除掉了 ![](https://img.tnblog.net/arcimg/aojiancc2/1df257579ef8409fa799377c50da90c4.png) 从本地仓库下载镜像 ``` docker pull 192.168.6.226:5000/nginx:v1 ``` 要注意拉取的时候要指定v1版本,不然拉取的就是latest版本,由于我们没有latest版本所以会报错,如图所示: ![](https://img.tnblog.net/arcimg/aojiancc2/22018273bf7b4993af93d347e1212900.png) 加上v1版本就可以被正确的拉取了 ![](https://img.tnblog.net/arcimg/aojiancc2/2eaf07d9d9104c1b92e8c83b51d3e593.png) 然后在使用docker images查看一下镜像即可。 ![](https://img.tnblog.net/arcimg/aojiancc2/e2e71796227d43bcb69a95b033442723.png) ## 搭建管理的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会出现跨域的错误。 ![](https://img.tnblog.net/arcimg/aojiancc2/4768653ff76d4648ba9b7262b161c353.png) 所以我们要进行跨域配置。 如果是新启动的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,比如我们这里的情况,现在要修改配置,就需要进入容器内部在修改配置文件了。 以下操作涉及到了进入容器、查看目录、进入配置文件目录、查看默认配置文件内容等,如下图所示。 ![](https://img.tnblog.net/arcimg/aojiancc2/f1e5903bece94ae7b024f23e18431dc8.png) 编辑文件添加如下可以跨域的内容: ![](https://img.tnblog.net/arcimg/aojiancc2/a8e71ba65ba947d781183bcf90c56a29.png) 在贴一下这块代码: ``` 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镜像 ![](https://img.tnblog.net/arcimg/aojiancc2/5c90b7f68da049639837f38786c8abef.png) ### 四: 重新打tag在上传一个镜像 打tag ``` docker tag registry 192.168.6.226:5000/registry:latest ``` ![](https://img.tnblog.net/arcimg/aojiancc2/e23fb079f6a5492f8b13f040bc920952.png) 上传镜像到私有仓库 ``` docker push 192.168.6.226:5000/registry:latest ``` ![](https://img.tnblog.net/arcimg/aojiancc2/0472916b83114ca396bd3b93f77e4559.png) 然后就可以看到刚刚上传的镜像了 ![](https://img.tnblog.net/arcimg/aojiancc2/5f164c3d331f4919b464dba2706b9a95.png) 点击进去可以查看详情 注意这个时间,不是镜像的上传,而是镜像的创建时间 ![](https://img.tnblog.net/arcimg/aojiancc2/51a8ab396e264d319bb2188d68379c56.png) 镜像的创建时间在你上传镜像的地方可以看到的,它拉取的是这个时间 ![](https://img.tnblog.net/arcimg/aojiancc2/87651cc8606c49e58b57e83b65670f0c.png) ### 五: 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 ```