


docker搭建私有仓库registry
registry介绍:
官方私有仓库,优点:简单;缺点:简单,无法进行复杂的管理操作
一 下载 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”]是指定私有仓库地址的意思。
如果etc下面没有docker这个文件夹,创建是不会成功的,先在etc目录下使用 mkdir docker创建一下docker文件夹就行
三 重启docker
systemctl daemon-reload
systemctl restart docker.service
可能执行会报错
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。
下面说一下不重新启动容器的方式,其实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
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)
心酸
这个没有harbor 仓库界面好看