导航

群晖NAS搭建Docker私有镜像库

docker_registry

最近在使用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中其实是不安全的,对于这个问题,我后面再整理下分享给大家用一种更安全的方式去替代.