最近在使用Docker部署Nextjs的项目时发现,在推送和拉取镜像时特别慢,镜像我是放在官方仓库的,而官方仓库在国外,访问速度会很慢. 本来想尝试下使用国内的镜像(阿里云、网易云等).回头一想,家里既然有台7*24小时运作的NAS,何不自建一个镜像仓库呢。于是尝试使用docker/registry 来搭建私有镜像仓库,成功后,再次尝试推拉镜像,速度提升的不是一点儿半点儿,开发效率大大提高. 接下来给大家按步骤分享下搭建docker私有镜像仓库的过程.
使用Docker部署registry
只要能使用Docker的系统都可以部署,我这里使用群晖7.2系统的Container Manager(原docker)来部署.
第一步 创建数据文件夹
我们需要在docker文件夹下为registry应用创建存放数据的文件夹,当然这个文件夹可以放在任何地方,可以任意命名,只要到映射到容器里即可.
为了规范,最好像我这样创建和命名:
-- /docker
---- /auth
---- /registry
auth 文件夹将来会存放授权文件. registry 文件夹下存放docker镜像文件.
第二步 下载镜像
在注册表中搜索【registry】,选择星最多的下载即可.
第三步 创建容器并启动
- 端口
registry 的端口为5000,我们将其映射到外部的端口上,我这里映射到 9000
- 文件映射
第一步创建的数据文件夹分别按照下面的关系映射到容器内部:
/volume1/docker/docker-registry/registry:/var/lib/registry
/volume1/docker/docker-registry/auth:/auth
- 环境变量
为了能够实现授权认证才能访问镜像仓库,所以需要配置一下环境变量,设置认证方式、认证目录
REGISTRY_AUTH=htpasswd
REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
配置授权登陆
上面我们已经设置了授权相关的环境变量,其中配置了认证方式为:htpasswd
htpasswd 是一个用于 Apache HTTP 服务器的工具,用于管理基本认证(Basic Authentication)的用户凭据文件。基本认证是一种简单的身份验证方式,要求用户提供用户名和密码以访问受保护的资源,通常在访问网站或网页时使用.
htpasswd 工具用于创建、管理和更新包含用户名和密码散列值的用户凭据文件,这些散列值存储了用户的密码,以便服务器可以验证用户的身份。用户凭据文件通常存储在服务器上,以确保只有经过授权的用户可以访问受保护的资源。
所以简单来说,我们需要使用 htpasswd 工具创建一个用户凭证,并且上传到 registry 的认证目录下(即/docker/docker-registry/auth/)
Mac上可以直接运行这条命令来生成用户凭证: 双箭头指向的是输出路径.
htpasswd -Bbn {username} {password} >> ./htpasswd
生成好后,把用户凭证上传到NAS,完成.
配置https外网访问
由于docker在login、pull、push的时候,默认都必须是https,所以我们需要配置通过https来访问私有镜像仓库.
在进行该部分的配置前,先确保你的NAS已经配置了通过群晖DDNS来实现外网访问,如果没有,可以先看下这里:群晖NAS外网访问的配置
要实现通过https最终访问到NAS的docker里的registry, 需要用到反向代理,群晖提供了非常方便使用的反向代理功能:
如下图所示,控制面板->登陆门户->高级->反向代理服务器->新增:
【来源】选择HTTPS, 自定义一个没有被用过的端口号, 这里我选择9001,
【目的地】选择http, 指向docker里的registry应用, 因为我们刚刚把registry应用的端口映射到了9000,所以这里选择9000端口号.
【启用HSTS】可以选上,选上后,对于http请求会自动转发到https.
最后,再配置下路由器的端口映射,把外网的端口映射到NAS的 9001 就可以了, 我外网端口也配置的是9001
配置完成后,我们使用自己的域名+外网端口号,访问试一下,
https://{你的域名}:9001/v2/_catalog
顺利的话,会弹出输入用户名和密码的弹框,我们输入上面生成用户凭证时使用的用户名和密码,即可登陆成功,这个时候页面上应该会返回一个镜像名列表的json文本, 这说明配置完成了.
Docker连接私有仓库
在你需要的地方,比如本地电脑、你的服务器等环境下怎么连接到我们搭建的私有镜像仓库呢,其实很简单, 直接使用 docker login命令登陆就行:
docker login {你的域名}:9001
登陆成功后,会在 ~/.docker/config.json 文件里存放你的私有镜像仓库的认证密钥. 后面使用 docker pull, docker push 等命令时都会读取该密钥进行连接.
打包、推送、拉取的命令示例如下.
docker build -t {你的域名}:9001/{你的镜像名}:0.0.1 .
docker push {你的域名}:9001/{你的镜像名}:0.0.1
docker pull {你的域名}:9001/{你的镜像名}:0.0.1
到这里,docker镜像库的搭建配置就完全OK了,我们也发现了,最后一步,认证密钥存放在~/.docker/config.json中其实是不安全的,对于这个问题,我后面再整理下分享给大家用一种更安全的方式去替代.