本文涉及一种在服务器部使用 registry 署私有镜像仓库的方法。经验证,可达到预期目标,并能应用在实际工作中。
由于测试服务器无法使用外部网络,而又需要容器化部署应用程序。经考虑,使用 registry 搭建 docker 镜像仓库服务。当然,能提供类似的软件很多,功能也比较强大,但时间紧任务重,使用最简单的方式即可。
拉取registry镜像:
docker pull registry:2
注:
实际操作中,因为服务器无法连接外部网络,因为是先在虚拟机下载好镜像,再通过docker save导出镜像,再用scp上传到服务器,再用docker load导入到服务器,完成“下载”动作。
新建工程目录,用于存储配置文件及数据文件。
新建config.yml配置文件:
version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
注:上述config.yml文件实际是笔者启动容器后,直接取 /etc/docker/registry/config.yml 文件内容的,因为要加配置,所以单独拿出挂载。
上述文件加了删除使能配置。
docker-compose.yaml配置文件:
version: '2'
services:
ttregistry:
image: registry:2
container_name: ttregistry
restart: always
volumes:
- ./registry_data:/var/lib/registry
- ./config.yml:/etc/docker/registry/config.yml
environment:
- TZ=Asia/Shanghai
ports:
- "5000:5000"
networks:
- registry-net
networks:
registry-net:
driver: bridge
启动:
docker-compose up -d
因为本文registry没有配置https模式,而docker命令默认是该模式,因此需要设置非安全仓库地址。在daemon.json
中添加,示例:
$ cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://a8qh6yqv.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com"
],
"insecure-registries": ["http://172.18.18.168:5000"]
}
不管推送镜像还是拉取镜像,都可能遇到此问题。因此,都要在相应的机器上进行设置。
设置好后,需要重启docker服务:
sudo systemctl restart docker
如不配置,则在推送或拉取镜像出错,示例:
Using default tag: latest
Error response from daemon: Get https://172.18.18.168:5000/v2/: http: server gave HTTP response to HTTPS client
拉取官方镜像
docker pull busybox
需要将镜像打上标签,否则默认上传到 docker 官方仓库。
#标记镜像
$ docker tag busybox 172.18.18.168:5000/busybox
推送镜像到私有仓库
$ docker push 172.18.18.168:5000/busybox
Using default tag: latest
The push refers to repository [172.18.18.168:5000/busybox]
01fd6df81c8e: Pushed
latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527
在另一机器上尝试拉取:
docker pull 172.18.18.168:5000/busybox
访问:http://172.18.18.168:5000/v2/,显示{}
,说明服务运行正常。
查询有哪些镜像:http://172.18.18.168:5000/v2/_catalog
查询某个镜像的版本:http://172.18.18.168:5000/v2/busybox/tags/list
curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/<镜像名称>/manifests/<镜像版本>
示例:
$curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/busybox/manifests/latest
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1456,
"digest": "sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 772788,
"digest": "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa"
}
]
}
注:
如果curl没有加-H字段,得到的结果较乱,不太方便分析,因此加上。
在浏览器直接访问亦可,但笔者测试发现,要下载文件再分析,故不采用。
删除镜像需指定digest
值,从获取镜像信息的config
字段中找到即可。命令:
curl -X DELETE http://172.18.18.168:5000/v2/<镜像>/manifests/sha256:
示例:
curl -X DELETE http://172.18.18.168:5000/v2/busybox/manifests/sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
垃圾回收:
docker exec -it ttregistry bin/registry garbage-collect /etc/docker/registry/config.yml
些法是直接在物理层面删除,通过重启服务方式彻底删除。可不用上面配置delete
功能。
删除存储卷上的镜像:
rm -rf registry_data/docker/registry/v2/repositories/busybox/
执行垃圾回收。
重启registry容器。
本着适目的(其实是时间不足),本文仅使用 registry 即能达到目标,因此不再继续研究 Harbor 等高端的服务,日后如有必要,再进行亦未晚。实际上,笔者对 Harbor 也有接触,那时有雄心有干劲(挣钱),但那是很多年前的事了。
李迟 2022.10.20 周四 夜