侧边栏壁纸
  • 累计撰写 13 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

搭建私有 Docker 镜像仓库 【Registry】

最近在NAS上折腾Docker 以前各种应用是用虚拟机部署的,在玩Docker后感觉这个更好。便开始了榨干NAS计划

最开始为了访问仓库是参考的这个项目:

GitHub - cmliu/CF-Workers-docker.io: 这个项目是一个基于 Cloudflare Workers 的 Docker 镜像代理工具。它能够中转对 Docker 官方镜像仓库的请求,解决一些访问限制和加速访问的问题。

部署好后的确解决了镜像拉取问题,但是速度感人还不稳定,时不时拉取失败。所以想本地部署个仓库把常用的好玩的镜像都拉到私有的仓库,以后要部署直接从私有仓库拉取那不起飞。

常见的Docker私有仓库有:Harbor、Portus、Docker Registry 下面使用官方的Docker Registry搭建试试

1. 下载registry镜像

[root@iZf8zd6gjqmdx9d7mygs00Z ~]# docker pull registry

2. 创建registry容器

#其中本地端口和本地挂载目录根据自己实际修改
[root@iZf8zd6gjqmdx9d7mygs00Z ~]# docker run -d -p 5522:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry

3. 推送镜像至仓库

#查看本地下载的镜像
root@Mario:~#  docker images
REPOSITORY                TAG        IMAGE ID       CREATED         SIZE
cloudflare/cloudflared    latest     1cf4e794afa4   7 days ago      59.6MB
privoce/vocechat-server   latest     37412d70853b   8 days ago      62.5MB
halohub/halo              2.20.15    c0787117a504   12 days ago     445MB
xhofe/alist               latest     cebc24353a2b   5 weeks ago     180MB
phpmyadmin                5.2.2      72f5bcc2915b   6 weeks ago     570MB
baiduapp                  1.0        c252cd2d44fb   7 weeks ago     660MB
btpanel/baota             latest     919b4bf29592   8 weeks ago     1.69GB
ubuntu                    25.04      aaaffc146c5b   2 months ago    82.1MB
mysql                     8.0.35     77f16659c129   14 months ago   591MB
#给镜像打上私有仓库标签
root@Mario:~#  docker tag mysql:5.7.9 10.16.1.3:5522/mysql:5.7.9
#尝试推送到私有仓库
root@Mario:~#  docker push 10.16.1.3:5522/mysql:5.7.9
The push refers to repository [10.16.1.3:5522/mysql]
Get "https://10.16.1.3:5522/v2/": http: server gave HTTP response to HTTPS client

这里推送会失败报错:http: server gave HTTP response to HTTPS client

因为刚才部署的仓库是http协议不被Docker信任

网上的解决办法:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
# 需要将 10.16.1.3:5522 替换为你自己的 ip
"insecure-registries":["http://10.16.1.3:5522"]
# 重启docker
systemctl restart docker

由于正式部署是通过NAS docker管理软件,也通过SSH改了 daemon.json 但是有没用。

既然Docker要求https协议那就把仓库部署成https的不就行了,从根源解决

这里参考官方文档: https://distribution.github.io/distribution/about/deploying/

还要准备SSL证书,那就用 openssl 生成一个私有证书

#创建一个目录存放证书
root@Mario:/volume2/Temp#  mkdir -p cert
#在刚才创建的目录生成证书
root@Mario:/volume2/Temp# openssl req -newkey rsa:4096 -nodes -sha256 -keyout cert/ssl.key -x509 -days 365 -out cert/ssl.crt
#除了倒数第二项需要填写域名外,其它都随便填即可
Country Name (2 letter code) [TW]:
State or Province Name (full name) [Taiwan]:
Locality Name (eg, city) [Taipei]:
Organization Name (eg, company) [Synology Inc.]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address [product@synology.com]:
# -d                                   后台静默运行容器
# --restart                            设置容器重启策略
# -name                                容器名称
# -v                                   设置挂载宿主目录到容器目录
# -e REGISTRY_HTTP_ADDR                设置仓库主机地址和端口
# -e REGISTRY_HTTP_TLS_CERTIFICATE     证书路径
# -e REGISTRY_HTTP_TLS_KEY             私钥路径
# -p                                   映射端口到宿主机  
docker run -d \
 --name registry \
 -v "$(pwd)"/cert:/cert \
 -v /opt/data/registry:/var/lib/registry \
 -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
 -e REGISTRY_HTTP_TLS_CERTIFICATE=/data/cert/ssl.crt \
 -e REGISTRY_HTTP_TLS_KEY=/data/cert/ssl.key \
 -p 443:443\
 --restart=always \
 registry

到这里以为就可以了结果又报错了

root@Mario:~# docker push 10.16.1.3:6633/mysql:5.7.9
The push refers to repository [10.16.1.3:6633/mysql]
Get "https://10.16.1.3:6633/v2/": tls: failed to verify certificate: x509: cannot validate certificate for 10.16.1.3 because it doesn't contain any IP SANs

私有证书还是不认啊.................................................. 没办法还要把生成的私有证书添加信任

4. 查看仓库镜像

在浏览器访问

http://10.16.1.3:6633:5000/v2/_catalog

http://10.16.1.3:6633:5000/v2/nginx/tags/list

终端访问

wget -O- -q --user=oldboy --password=123456 http://x.x.x.x:5000/v2/_catalog
curl -XGET  http://x.x.x.x:5000/v2/_catalog

5. compose部署

最终在群晖通过 compose 配置部署

version: '3.3'
services:
    zfile:
        image: registry
        container_name: registry
        restart: always
        ports:
            - '6633:6633'
        volumes:
            - '/volume2/Dockers/registry/reg:/var/lib/registry'
            - '/volume2/Dockers/registry/cert:/cert'
        environment:
           REGISTRY_HTTP_ADDR: 0.0.0.0:6633
           REGISTRY_HTTP_TLS_CERTIFICATE: '/cert/harbor.crt'
           REGISTRY_HTTP_TLS_KEY: '/cert/harbor.key'        
        networks:
         - mario-default
networks:
  mario-default:
    external: true  

0

评论区