搭建私有的 Docker Registry 仓库(基于 Nginx 配置 SSL)

| 后端 , Docker

 

内容概览

  • 前言
  • 创建 Docker Registry 用户名和密码
  • 运行 Registry 容器
  • 基于 Nginx 配置 SSL
  • 在客户端登录 Registry
  • 推送、拉取镜像
  • 在浏览器中检查 Registry 中的镜像
  • 总结

 

前言

 

之前在 使用腾讯云容器镜像仓库代替 Docker 官方的 Docker Registry 这篇文章中赞了一波腾讯云的镜像服务,然而它很快就开始进行收费了。啪啪啪地打脸,相当给力!!!😂

客官请看,这就是我的腾讯云镜像服务扣费记录。一小时 0.97 元,对于一个普通开发者来说,不算便宜的。

腾讯云镜像服务扣费记录

好吧,既然这样,那我只能自己搭一个私有的 Registry 来用了。正好,我自己还有多余的服务器可以用来配置私有的 Registry。

希望本文能够对您有所帮助,如有错误也欢迎您指正。话不多说,让我们马上进入到具体的操作环节。

请注意,本文的实现和 Docker 官方推荐的方式不同。因为官方的实现让 Docker 配置并支持 SSL。而我的服务器需要运行 Nginx,所以只能委屈 Docker Registry 绕绕道了。

 

创建 Docker Registry 用户名和密码

 

首先,在当前工作目录创建一个 auth 文件夹。推荐在用户的主目录下进行操作,比如:/root 文件夹就是 root 用户的主目录。

本文使用的工作目录是 /root/docker_files

mkdir auth

这个目录(/root/docker_files/auth)会用来存储 Docker Registry 中的用户名和对应的密码。

然后, 生成用户名和密码到这个目录中:

docker run \
  --name htpasswd \
  --entrypoint htpasswd \
  registry:2.7.0 -Bbn user_name  user_password > auth/htpasswd

请替换上面的示例代码中的 user_name, user_password 为您的用户名和密码!

运行该命令后,/root/docker_files/auth 目录下就会存储刚刚生成的信息。

 

运行 Registry 容器

 

在当前工作目录(/root/docker_files) 中执行以下命令:

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /root/docker_files/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v /root/docker_files/registry:/var/lib/registry \
  registry:2.7.0

然后,让 Ficow 来大致解释一下这堆命令的含义:

  • -d,指定 Registry 容器在后台运行;
  • -p 5000:5000,指定 Registry 容器监听的宿主机中的端口号以及在容器中使用的端口号;
  • --restart=always,可以在容器停止运行时自动重启;永不停歇、任劳任怨 😄 详细的参数可以看这里
  • --name registry ,指定容器的名称,您可以考虑自定义,方便区分识别;
  • -v /root/docker_files/auth:/auth,挂载容器中的 /auth 目录到 /root/docker_files/auth 目录,Registry 容器就可以读取到您刚刚生成的用户名和密码;
  • -e,设置需要配置的相关环境变量;
  • 为什么是 registry:2.7.0请看这里

然后,再运行以下命令检查 Registry 容器是否正常输出了日志:

docker logs registry

 

基于 Nginx 配置 SSL

 

找到 nginx.conf 配置文件所在目录,一般在 /etc/nginx/ 目录下。您也可以运行 Nginx 测试命令来查看配置文件的位置:

nginx -t

一般,我们需要在 Nginx 配置文件所在目录中的 conf.d 目录内增加新的配置。进入到该目录中,创建配置文件,如: docker.your_domain.com.conf。(请替换 your_domain 为您自己的域名)

touch docker.your_domain.com.conf

此时,如果您尚未解析这个域名(docker.your_domain.com),您就需要到您的域名提供商(比如:万网、腾讯云等) 的控制台页面去增加相关的域名解析配置。

然后,打开并编辑内容。比如使用 vim 编辑器:

vim docker.your_domain.com.conf

下面这份配置仅供参考:

server
{
        # your_domain 请替换为您自己的域名
        server_name docker.your_domain.com;

        charset utf-8;

        # 直接让 Nginx 转发请求到 Docker Registry 容器
        location / {
            proxy_pass         http://localhost:5000;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Forwarded-Proto $scheme;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
            client_max_body_size 200M;
        }
}

编辑完成之后,记得保存。Vim 中就输入命令 :wq,其他的编辑器请您自行决定如何进行保存。

保存并退出编辑器之后,运行 Nginx 的配置测试命令:

nginx -t

如果输出内容没有提示错误,那就说明您的配置是有效的。

 

此时,Ficow 建议您使用 certbot 来为该配置添加 免费的SSL 支持。是的,不启用 SSL 也可以正常使用私有 Docker Registry。但是,Ficow 不建议您这样做,因为这样很容易泄露您的 Registry 用户名和密码。

这是 Ubuntu 上安装 certbot 的相关指令:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python3-certbot-nginx 
sudo apt install certbot

使用以下指令,certbot 可以自动配置 Nginx 的 SSL 相关参数,请您根据命令行提示内容进行操作:

certbot --nginx

命令行会提示您输入对应的数字来选择启用 HTTPS 的域名,以及是否强制将 HTTP 重定向到 HTTPS。强烈建议开启这个重定向,这样更安全~ 😄

 

然后,编辑定时任务,定期检查更新 SSL 证书:

crontab -e

Ficow 建议您这样做,当然您可以跳过这一步,以后自己手动执行 certbot renew 命令来更新证书。

在 crontab 中插入本行内容,并保存退出,定时任务即可生效:

# 分  时  某月中的几号  几月  星期几  *代表任何时候 ,分隔多个相同类型的参数
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

 

请注意,如果系统默认打开的编辑器不是vim,可以修改环境变量。在 ~/.profile 中加入以下内容,并保存退出:

vim ~/.profile
export EDITOR="/usr/bin/vim";

加载更新后的 EDITOR 环境变量到当前的命令行中:

source ~/.profile

然后再重新使用 crontab -e 添加定时任务。

这一切配置完毕之后,让 Nginx 软重启以应用最新的配置(您也可以运行 nginx -t 检查一下配置是否存在错误):

nginx -s reload

 

在客户端登录 Registry

 

终于可以在客户端登录这个刚出炉的 Registry 啦!😄

docker login docker.your_domain.com

然后,输入您之前生成的 Registry 用户名和密码。显示 Login Succeed! 即表示登录成功!如果登录失败了,欢迎您给 Ficow 留言。

 

推送、拉取镜像

 

如果您此时需要将之前已经存在的镜像(比如:old_domain.com/ficow_app:latest)推送到这个新的 Registry,您可以先用新的 Registry 来标记这个镜像:

docker tag old_domain.com/ficow_app:latest docker.your_domain.com/ficow_app:latest

标记完成后,检查所有的镜像以确认标记镜像是否成功:

docker images

然后,推送镜像到新的 Registry:

docker push docker.your_domain.com/ficow_app:latest

此时,拉取镜像的命令也相应地发生了变化,请注意区分镜像的名称(建议删除不需要的镜像,免除干扰):

docker pull docker.your_domain.com/ficow_app:latest

 

在浏览器中检查 Registry 中的镜像

 

最后,您可以在浏览器中访问以下网址,输入您的 Registry 用户名和密码即可查看 Registry 中可用的镜像:
https://docker.your_domain.com/v2/_catalog (请替换 your_domain.com 为您自己的域名)

输出的结果会是一个 JSON,比如:

{"repositories":["ficow_app"]}

 

总结

 

我不清楚腾讯云镜像服务的收费价格是不是真的很贵,至少我作为一个普通开发者是不太能接受这个价格的。也许是贫穷限制了我吧 😄

自己搭建的 Registry 虽然在速度方面远不如腾讯镜像服务,而且可能安全性也有待观察,但是这确实是一个选择。

至此,开发者可以无限制地在自己的 Registy 中存储多个镜像,而且成本很低。

 

希望 Ficow 的实践能够给您带来些许启发和帮助,如有错误也希望您来指正,欢迎您给 Ficow 留言分享您的看法~

 

参考内容:
Docker Hub 仓库使用,及搭建 Docker Registry
Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
Restricting access - Docker Docs

 

觉得不错?点个赞呗~

本文链接:搭建私有的 Docker Registry 仓库(基于 Nginx 配置 SSL)

转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog

评论区(期待你的留言)