树莓派自建私有化Docker仓库, 并配置公网访问用户认证


title: 树莓派自建私有化Docker仓库, 并配置公网访问用户认证

前几天用3台树莓派折腾k8s集群,并顺利对公网提供了服务,教程地址 《树莓派4B家庭服务器搭建指南》第十四期:使用树莓派4B搭建k8s集群 https://www.v2fy.com/p/2022-01-05-k8s-pi-1641393748000/, 要玩转k8s的容器化管理,首先要有一个好用Docker仓库存储镜像,虽然Docker官方https://hub.docker.com/仓库很稳定,但无法免费存储私有化镜像。

镜像

本篇文章主要涉及Docker镜像如何上传到官方仓库(hub.docker.com),以及如何使用树莓派自建私有化Docker仓库并添加密码认证,开放到公网。

如何上传Docker镜像到官方仓库

第一步:到https://hub.docker.com/ 注册用户,我的用户名为zhaoolee, 后面会用到

第二步:写点测试代码打个包,代码可以用我写好的,https://github.com/zhaoolee/pi-k8s-test

第三步:通过命令行build(打包)镜像,进入代码目录,输入以下命令, 在Dockerfile同级目录下构建镜像,在以下命令中,zhaoolee为用户名,pi-k8s-test为镜像名,镜像版本号为002, 每次更新镜像,修改版本号即可,版本号一般为数字递增,方便后期区分。

sudo docker build  -t zhaoolee/pi-k8s-test:002 . --no-cache

注意: 这里的zhaoolee/pi-k8s-test:002 严格来讲应该是 docker.io/zhaoolee/pi-k8s-test:002 由于docker.io是默认的官方镜像下载地址,所以可以省略。

Docker打包镜像的过程,往往需要联网下载依赖包,为了保证打包的流畅性,负责打包镜像的计算机,最好可以支持科学上网,zhaoolee在树莓派集群的上层路由器,完成了科学上网,树莓派们成为极好的打包Docker镜像的计算机。

第四步:在命令行,完成https://hub.docker.com/ 的用户登录认证

docker login

输入用户名 密码

第五步: push镜像

sudo docker push zhaoolee/pi-k8s-test:002

push成功

如何从远程获取镜像?

sudo docker pull zhaoolee/pi-k8s-test:002

如果我们需要搭建自己的镜像仓库,docker官方也提供了可靠的方法~

使用Docker官方镜像,在树莓派搭建私人镜像仓库

原版镜像地址:https://hub.docker.com/_/registry

当前树莓派固定ip为192.168.50.10,私人镜像仓库服务将运行在5000端口, 由于docker默认使用更安全的https协议,为了树莓派docker可以顺利往192.168.50.10:5000推送镜像,我们需要在/etc/docker/daemon.json 文件中写入insecure-registries 相关配置信息,也就是允许使用地址为192.168.50.10:5000 的私有仓库

{
  "insecure-registries" : [ "192.168.50.10:5000" ]
}

然后重启docker相关服务, 使insecure-registries生效

sudo systemctl daemon-reload
sudo systemctl restart docker

我们在内网其它计算机往192.168.50.10:5000 推送服务,也需要在docker客户端进行insecure-registries相关配置,并重启docker使其生效,由于insecure-registries是个数组,我们可以添加多个无https认证的私有仓库。

  • 创建存储镜像的文件夹
sudo mkdir -p /opt/dr/registry
sudo touch /opt/dr/docker-compose.yml
sudo chmod 777 -R  /opt/dr/

在文件/opt/dr/docker-compose.yml中填入以下内容

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_ADDR: 0.0.0.0:5000
  volumes:
    - /opt/dr/registry:/var/lib/registry

启动服务

cd /opt/dr
sudo docker-compose up -d
  • 将zhaoolee/pi-k8s-test:002 从官方仓库拉下来,转存到到树莓派私有仓库
sudo docker pull zhaoolee/pi-k8s-test:002
sudo docker tag zhaoolee/pi-k8s-test:002  192.168.50.10:5000/zhaoolee/pi-k8s-test:002
sudo docker push  192.168.50.10:5000/zhaoolee/pi-k8s-test:002

往私有仓库推送的关键步骤是打好tag, 也就是在用户名zhaoolee前面追加本地私有仓库的ip和端口,如果我们在树莓派打包镜像,完全可以在build阶段直接打好tag ,省时省力。

推送

将树莓派Docker私有仓库服务对公网开放

我们在服务端申请registry.v2fy.com 的 https证书,并通过frp将指向docker.v2fy.com的请求,全部转发到树莓派的5000端口

向公网开放就要考虑用户登录认证的问题, 为了不影响树莓派已有的docker仓库服务 , 我们将用户认证放到公网服务器的Nginx端完成,将用户认证信息存储到公网服务器的/opt/dr/auth/htpasswd

在公网服务器运行

htpasswd  /opt/dr/auth/htpasswd zhaoolee

输入密码

用户名和密码被顺利存储到/opt/dr/auth/htpasswd
用户名和密码

重复运行相同的用户名可以重置密码

重置密码

运行 htpasswd /opt/dr/auth/htpasswd 用户名 可创建更多用户,如果需要移除用户,只需删除用户名对应的行即可!

然后在公网服务器添加Nginx配置文件,为了方便区分,我的配置文件位置和名称为/etc/nginx/conf.d/registry.v2fy.com.conf, 内容为

upstream registry_v2fy_com { server 127.0.0.1:5000; }

server {
    server_name      registry.v2fy.com;
    listen       80;
    listen       [::]:80;
    rewrite ^(.*)$ https://$host$1 permanent;
}


server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  registry.v2fy.com;

    location / {
        auth_basic  "Please Input username/password";
        auth_basic_user_file     /opt/dr/auth/htpasswd;
        proxy_pass http://registry_v2fy_com;
        proxy_set_header Host $host:443;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    ssl_certificate "/etc/nginx/ssl/registry.v2fy.com/fullchain.cer";
    ssl_certificate_key "/etc/nginx/ssl/registry.v2fy.com/registry.v2fy.com.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Load configuration files for the default server block.
    include /etc/nginx/default.d/*.conf;

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

以上配置比较特别的两行配置信息为authbasic(认证提示语句) 和 authbasicuserfile (认证用户名密码存储的位置)

auth_basic  "Please Input username/password";
auth_basic_user_file     /opt/dr/auth/htpasswd;
  • 拉取镜像测试
# 登录
sudo docker login registry.v2fy.com
# 登出
sudo docker logout registry.v2fy.com

拉取镜像测试

小结

经过我们对树莓派的折腾,我们终于拥有了自己的docker私有仓库,支持通过https公网访问,并可以进行用户权限管理。

Docker仓库与K8s结合,让普通人用几块树莓派,就能形成自己的开发发布工作流,高效且稳定,开源技术的不断进步,让热爱互联网的人们,用越来越低的成本,向全世界发布自己的创意,并提供稳定的服务。

本文章属于《树莓派不吃灰》系列的一部分,本系列更多文章,请前往github.com/zhaoolee/pi

往期推荐:树莓派家用服务器搭建指南(zhaoolee原创)

014 《树莓派4B家庭服务器搭建指南》第十四期:2022年最新版树莓派4B搭建k8s集群, 安装可视化Kuboard网页管理面板

013 《树莓派4B家庭服务器搭建指南》第十三期:在树莓派安装lazydocker命令行图形化界面快速管理Docker服务及镜像

012 《树莓派4B家庭服务器搭建指南》第十二期:降低BBS运营成本,将面向未来的BBS论坛程序Discourse部署到树莓派(私人BBS论坛一年运营成本300块!)

011 《树莓派4B家庭服务器搭建指南》第十一期:个人博客最佳解决方案,在树莓派搭建WordPress网站,并开放到公网

010 《树莓派4B家庭服务器搭建指南》第十期:在树莓派建Wiki, 部署TiddlyWiki完成读写权限分离,开放到公网,实现笔记自由

009 《树莓派4B家庭服务器搭建指南》第九期:用树莓派低成本给热心老哥搭个窝,在树莓派建立BBS论坛flarum并映射到公网全攻略

008 《树莓派4B家庭服务器搭建指南》第八期:比某度某果同步盘更快,树莓派部署免费P2P文件同步服务程序syncthing全攻略

007 《树莓派4B家庭服务器搭建指南》第七期:使用树莓派解锁网易云灰色音乐,并通过公网域名分享给小伙伴

006 《树莓派4B家庭服务器搭建指南》第六期:树莓派抓取微博博主RSS并提供公网访问,将RSSHub私有化部署到树莓派

005 《树莓派4B家庭服务器搭建指南》第五期: 用树莓派搭建私人每日自动签到平台

004 《树莓派4B家庭服务器搭建指南》第四期: 用树莓派搭建公网个人下载平台aria2-pro,推荐6个优质种子资源站

003 《树莓派4B家庭服务器搭建指南》第三期:树莓派自建互联网云盘,跨设备打通全平台,安卓和iOS如何在非445端口使用samba服务

002 《树莓派4B家庭服务器搭建指南》第二期:网盘界的未来科技,新增smb服务并完成内网穿透,实现所有设备共享文件

001 《树莓派4B家庭服务器搭建指南》第一期:刷Ubuntu Server 20.04,绑定公网域名,对公网提供http服务,SSH登录服务

本文永久更新地址(欢迎来读留言,写评论):

https://www.v2fy.com/p/2022-01-08-docker-registry-1641648899000