我们知道Docker Registry默认是使用本地文件系统存储镜像文件的,存储路径为
/var/lib/registry
。官方Registry目前尚不支持自动复制和同步镜像功能,因此使用本地单机文件系统保存镜像时可靠性没法保证。为了保证镜像数据的可靠性存储,只能依靠底层存储系统了。可幸的是Docker Registry原生支持多种分布式存储后端,具体信息可参考官方文档,目前官方支持的存储后端列表如下:
filesystem:本地文件系统,默认使用的存储后端
inmemory: 直接保存在内存,不能持久化
azure: 微软存储系统
gcs:Google云存储
S3: AWS对象存储
Openstack Swift
OSS:阿里对象存储
目前官方尚不支持Ceph RGW,不过可以通过Swift API对接RGW来实现。
注意:Docker Registry同时只能支持一个存储后端,不能同时配置多个,否则出错。
配置方法官方有非常详细的文档,用户也可以通过自己实现存储驱动来支持更多的存储系统。
下面以对接Openstack Swift
为例,对接Swift需要指定的必要参考为:
authurl: 认证URL,通常为keystone地址。
tenant: 租户名
admin:用户名
password:密码
container:使用的Swift容器,镜像文件最终存储在该容器中,Swift的容器概念类似S3的Bucket
配置文件为/etc/docker/registry/config.yml,内容如下:
version: 0.1
log: fields: service: registry
storage: swift: tenant: admin username: admin password: 5c8d15f732104053 authurl: http://10.0.10.216:5000/v2.0 container: docker_registry
http: addr: :5000 headers: X-Content-Type-Options: [nosniff]
health: storagedriver: enabled: true interval: 10s threshold: 3
注意启动registry服务前必须先创建Swift容器。
docker post docker_registry
registry的配置文件默认读取/etc/docker/registry/config.yml
,我们可以在本地管理配置文件,然后挂载到容器中指定的目录中,启动registry服务的脚本为:
#!/bin/bash
NAME=registry
IMAGE=registry:2 docker rm -f $NAME 2>/dev/null docker run -d /
-p 15000:5000 /
--restart=always /
-v `pwd`/data/registry:/var/lib/registry /
-v `pwd`/resitry_config.yml:/etc/docker/registry/config.yml /
--name $NAME $IMAGE
由于5000
端口被keystone占用,因此选用了15000
端口作映射,以上registry_config.yml
为registry本地配置文件,配置内容见以上内容,我们通过volume映射到/etc/docker/registry/目录下。
启动registry容器实例后,接下来验证下是否成功对接,首先tag busybox镜像为我们的仓库地址:
docker tag busybox localhost:15000/busybox:latest
push镜像到我们的仓库中:
docker push localhost:15000/busybox
上传成功后检查swift是否存在刚刚上传的镜像文件:
[root@server-216 docker(keystone_admin)]# swift list docker_registry files/docker/registry/v2/blobs/sha256/13/1359608115b94599e5641638bac5aef1ddfaa79bb96057ebf41ebc8d33acf8a7/data files/docker/registry/v2/blobs/sha256/2b/2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749/data files/docker/registry/v2/blobs/sha256/8d/8ddc19f16526912237dd8af81971d5e4dd0587907234be2b83e249518d5b673f/data files/docker/registry/v2/repositories/busybox/_layers/sha256/2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749/link files/docker/registry/v2/repositories/busybox/_layers/sha256/8ddc19f16526912237dd8af81971d5e4dd0587907234be2b83e249518d5b673f/link files/docker/registry/v2/repositories/busybox/_manifests/revisions/sha256/1359608115b94599e5641638bac5aef1ddfaa79bb96057ebf41ebc8d33acf8a7/link files/docker/registry/v2/repositories/busybox/_manifests/tags/latest/current/link files/docker/registry/v2/repositories/busybox/_manifests/tags/latest/index/sha256/1359608115b94599e5641638bac5aef1ddfaa79bb96057ebf41ebc8d33acf8a7/link segments/2f6/46f636b65722f72656769737472792f76322f7265706f7369746f726965732f62757379626f782f5f75706c6f6164732f39396466333866612d653166312d343432662d393939342d6637346336363034623830322f64617461f2f622a0bf17bef3f2fae2745f7cec6f2d736a2384ea2ad0f56286fa76ff114dda39a3ee5e6b4b0d3255bfef95601890afd80709/0000000000000001
如果存在以上内容,说明成功对接了Swift存储后端。