Docker registry ssl认证和访问控制
一:实验环境以及需求
实验环境:两台cnetos7.2版本虚拟机。(资源允许最好准备三台,一台做私有仓库,一台做上传镜像服务器,一台做下载镜像服务器)
虚拟机1:192.168.1.200
虚拟机2:192.168.1.201
服务器防火墙和selinux关闭。hosts根据实际情况做解析,每台都需要解析。
本实验hosts解析为:192168.1.201 hub.com
此文档默认在Registry上操作,client上操作时会红色标记。
二:自建证书CA
要实现ssl认证就需要证书支持,证书最好是服务商提供的证书,比如阿里云,腾讯云等等。这里由于做实验,使用自建证书。
由官方文档得知需要实验ssl认证,只需要.key 和 .crt。#
创建.key和.crt
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/cert/ca.key -x509 -days 365 -out /docker/cert/ca.crt
Country Name (2 letter code) [AU]:CN #国家代码,中国CN State or Province Name (full name) [Some-State]:Sichuan #省份全拼 Locality Name (eg, city) []:Chengdu #城市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:registry #组织名,公司名 Organizational Unit Name (eg, section) []:CA #部门名称 Common Name (e.g. server FQDN or YOUR name) []:hub.com #这里必须填写Docker Registry使用的域名 Email Address []:admin@domain.com #电子邮件
三:ssl认证
1:将ca.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书。然后重启docker#
CentOS 6 / 7中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt
cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
systemctl restart docker
2:使用Docker Registry的Docker机需要将ca.crt拷贝到 /etc/docker/certs.d/[docker_registry_domain]/ca.crt#
mkdir / etc / docker / certs.d / hub.com / #client上执行 scp / docker / cert / ca.crt 192.168 . 1.200 : / etc / docker / certs.d / hub.com / #registry 上执行。cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt #client上执行 |
3:Registry端和client端重启docker。#
systemctl restart docker |
四:启动Registry
1:启动#
docker run - d - p 5000 : 5000 - - restart = always - - name registry \ - v / registry: / var / lib / registry \ - v `pwd` / cert / : / certs \ - e REGISTRY_HTTP_TLS_CERTIFICATE = / certs / ca.crt \ - e REGISTRY_HTTP_TLS_KEY = / certs / ca.key \ - e REGISTRY_STORAGE_DELETE_ENABLED = true \ registry |
解释:将宿主机的cert/目录映射到容器中的/certs目录中。指定registry启动使用/certs中的证书。`pwd` :当前目录,也可以使用绝对路径:/docker/cert/
2:浏览器验证#
没使用证书的时候时走的http,使用证书后走的是https。
3:client端上传镜像验证(client端)。#
docker tag mariadb hub.com: 5000 / db: 2.0 docker push hub.com: 5000 / db: 2.0 |
五:访问限制
通过basic authentication 实现简单的访问限制。#
1:创建用户名和密码文件#
1 2 3 | cd / docker mkdir auth docker run - - entrypoint htpasswd registry: 2 - Bbn testuser testpassword > auth / htpasswd |
注:红色部分需改为你的用户名和密码
2:使用密码文件启动registry#
docker run - d - p 5000 : 5000 - - restart = always - - name registry \ - v / registry: / var / lib / registry \ - v `pwd` / auth: / auth \ - e "REGISTRY_AUTH=htpasswd" \ - e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ - e REGISTRY_AUTH_HTPASSWD_PATH = / auth / htpasswd \ - v `pwd` / cert: / certs \ - e REGISTRY_HTTP_TLS_CERTIFICATE = / certs / ca.crt \ - e REGISTRY_HTTP_TLS_KEY = / certs / ca.key \ - e REGISTRY_STORAGE_DELETE_ENABLED = true \ registry: 2 |
注:如果你registry正在运行,需要关闭。由于加了参数--restart=always,当你关闭registry容器时,会自动重启registry容器,所以只有使用 docker rm -f registry 强制删除registry容器。
3:浏览器验证#
使用你刚刚创建的用户和密码就可以登录了。
4:client验证(client端)#
docker tag mariadb hub.com: 5000 / db: 3.0 docker push hub.com: 5000 / db: 3.0 |
由于没有登录刚刚的账户,所以没有权限上传。
通过用户登录
docker login hub.com: 5000 docker push hub.com: 5000 / db3. 0 |
六:总结
1:用参数`pwd`时一定要注意启动时的目录是否对应。
2:删除registry'容器时记得删除挂载卷,不然上传的镜像还存在。docker stop registry && docker rm -v registry
3:访问失败时查看容器日志:docker logs registry -f 加上-f 实时查看。
作者:鲜小橙
出处:https://www.cnblogs.com/big-cousin/p/10142352.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具