基于证书访问的Docker Registry的搭建

楔子

我们一般测试开发的时候,都习惯于直接从公共镜像仓库hub.docker.com拉取所需镜像,但是实际生产环境中可能涉及自建镜像和网络等各方面的原因,这个时候或许预先搭建自己的镜像仓库可能会更方便些,如下就来讲讲基于证书访问的docker registry的搭建流程。

创建自签名证书

首先,不管是Registry客户端还是服务器端都默认已经安装docker、openssl等工具。另外这儿Registry Server和客户端是一台主机且IP是10.0.2.15,域名vienfu.dockerhub.com,因此要做域名的解析配置:

echo "10.0.2.15 vienfu.dockerhub.com" >> /etc/hosts

然后开始创建自签名证书:

mkdir -p /root/certs.d
cd /root/certs.d
openssl req -newkey rsa:2048 -nodes -sha256 -keyout ./domain.key -x509 -days 365 -out ./domain.crt  # 根据提示依次填入所需信心,注意Common Name处要填入之前被解析的域名vienfu.dockerhub.com

# 客户端证书拷贝
mkdir -p /etc/docker/certd.d/vienfu.dockerhub.com:5000
cp /root/certs.d/domain.crt /etc/docker/certd.d/vienfu.dockerhub.com:5000/ca.crt

# 如果后续欲通过curl证书访问registry接口,还需要做如下操作:
cat /root/certs.d/domain.crt >> /etc/ssl/certs/ca-certificates.crt

以上所有操作完成后,重启dockersystemctl restart docker

创建Registry容器

首先,可以预先拉取registry镜像:

docker pull registry:2

如果考虑到持久化和镜像的删除问题,可以预先做如下操作:

mkdir -p /root/docker_image_mgr/registry

cat << EOF >> /root/docker_image_mgr/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true  # 其中delete.enabled是为镜像删除设置的字段
  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
EOF

启动registry容器:

docker run -d -p 5000:5000 --name my-registry -v /root/docker_image_mgr/registry:/var/lib/registry -v /root/docker_image_mgr/config.yml:/etc/docker/config.yml -v /root/certs.d:/root -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/domain.crt -e REGISTRY_HTTP_TLS_KEY=/root/domain.key registry:2

# 启动之后,docker ps看一下启动状态
root@kolla:~# docker ps
CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                               NAMES
ed96182fa77d        registry:2                                "/entrypoint.sh /etc/"   15 hours ago        Up 15 hours         0.0.0.0:5000->5000/tcp              my-registry

如此Registry Server启动完成,下面不妨测试一下可否向该Registry Server上传镜像。

docker tag hello-world vienfu.dockerhub.com:5000/hello-world:test
docker push vienfu.dockerhub.com:5000/hello-world:test

简单通过curl命令来查看镜像是否上传:

root@kolla:~#curl -X GET https://vienfu.dockerhub.com:5000/v2/_catalog
{"repositories":["hello-world"]}

如此我们看到镜像也的确上传成功了。

仓库加鉴权

出于安全考虑,一般在认证之后还需要做一个鉴权来控制用户的访问权限,这儿仅介绍最基本的鉴权方式:用户名和密码访问模式。

首先创建一个用户及访问的密码,这儿假设用户名和密码分别是vienfu、Fch19880810

mkdir -p /root/auth
docker run --entrypoint htpasswd registry:2 -Bbn vienfu Fch19880810 > /root/auth/htpasswd

然后把之前起的容器停掉并且删除:

docker stop my-registry
docker rm my-registry

最后启动一个带鉴权的registry容器:

docker run -d -p 5000:5000 --name my-registry \
-v /root/auth:/auth \
-v /root/docker_image_mgr/registry:/var/lib/registry \
-v /root/docker_image_mgr/config.yml:/etc/docker/registry/config.yml \
-v /root/certs.d:/root \
-e "REGISTRY_AUTH=htpasswd" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/root/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/root/domain.key \
registry:2

那也不妨测试一下,实际上我们不难发现,这个时候如果我们直接docker push来上传镜像会失败,这是因为设置了鉴权访问的参数需要先做如下操作:

docker login vienfu.dockerhub.com:5000 # 根据提示输入之前设置的用户名和密码

如此我们再通过docker push上传镜像就ok啦,最后也通过curl命令来查看一下吧:

root@kolla:~# curl -u vienfu:Fch19880810 -X GET https://vienfu.dockerhub.com:5000/v2/_catalog
{"repositories":["hello-world"]}

好啦,自此私有镜像仓库的搭建工作算是完成了。

结语

以上完整讲述了私有镜像仓库的搭建流程,但实际生产环境中可能会涉及高可用、异地数据同步及一致性等问题,这些问题都需要我们去一一解决(这儿暂不做这方面的展开);另外,企业级应用还可以考虑使用Harbor,它会提供一整套的解决方案包括用户管理、操作界面、镜像签名、漏扫、高可用等一系列功能,刚兴趣的同学可参照我的另两篇博客:基于NFS后端存储搭建Harbor基于CEPH后端存储搭建Harbor

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容