之前在 使用腾讯云容器镜像仓库代替 Docker 官方的 Docker Registry 这篇文章中赞了一波腾讯云的镜像服务,然而它很快就开始进行收费了。啪啪啪地打脸,相当给力!!!😂
客官请看,这就是我的腾讯云镜像服务扣费记录。一小时 0.97 元,对于一个普通开发者来说,不算便宜的。
好吧,既然这样,那我只能自己搭一个私有的 Registry 来用了。正好,我自己还有多余的服务器可以用来配置私有的 Registry。
希望本文能够对您有所帮助,如有错误也欢迎您指正。话不多说,让我们马上进入到具体的操作环节。
请注意,本文的实现和 Docker 官方推荐的方式不同。因为官方的实现让 Docker 配置并支持 SSL。而我的服务器需要运行 Nginx,所以只能委屈 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
目录下就会存储刚刚生成的信息。
在当前工作目录(/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.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 啦!😄
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 中可用的镜像:
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