服务器在HK,但是去拉取腾讯广州Docker镜像仓的时候总是失败,还是企业版,大无语了。

没办法,被逼无奈,干脆在HK建一个镜像仓,然后推送到那里,这样就方便了。

刚开始的想法是用Harbor,但是Harbor实在太沉重了,而且Harbor的最大问题是过期镜像清理,如果过期镜像出错了,那是清理不掉的,除非重新打包上传覆盖掉错误的镜像,然后再删除才可以,但问题是如果有700、800个错的镜像,那是真没有那个劲去清理了。

那这次就想建个轻量级的,干脆连WEB界面都不要,只要docker login后能push和pull即可!

这样的话zot是个不错的选择,zot是兼容oci标准的,某些地方跟docker是不兼容的:

下载zot

wget https://github.com/project-zot/zot/releases/download/v2.1.10/zot-linux-amd64

准备配置文件

cat >/usr/local/bin/config.json << EOF
{
  "distSpecVersion": "1.0.0-dev",
  "http": {
    "address": "127.0.0.1",
    "port": "5000",
    "compat": ["docker2s2"],
    "auth": {
      "htpasswd": {
        "path": "/usr/local/bin/htpasswd"
      }
    }
  },
  "storage": {
    "rootDirectory": "/data/registry"
  }
}
EOF

注意上面compat,如果不配置,就会出现push的时候出现manifest invalid错误,这是因为docker和oci的标准不同,zot是遵循oci标准的

准备htpasswd,必须用bcrypt的方式,zot不支持其它的!

-B  Force bcrypt hashing of the password (very secure)
htpasswd -B -c /usr/local/bin/htpasswd user01

准备zot.service

cat > /etc/systemd/system/zot.service << EOF 
[Unit]
After=network.target nss-lookup.target

[Service]
User=root
ExecStart=/usr/local/bin/zot-linux-amd64 serve /usr/local/bin/config.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target
EOF

那大家注意到了,zot只监听到了127.0.0.1:5000,所以前面还需要用caddy代理一下

准备caddy的配置文件

cat > /usr/local/bin/Caddyfile << EOF 
registry.rendoumi.com {
    reverse_proxy 127.0.0.1:5000 {
        header_up X-Real-IP {remote_host}
        transport http {
            dial_timeout 15s
            response_header_timeout 300s
        }
    }
}
EOF

准备caddy的systemd文件

cat > /etc/systemd/system/caddy.service << EOF
[Unit]
After=network.target
Wants=network.target

[Service]
WorkingDirectory=/usr/local/bin/
Type=simple
User=root
ExecStart=/usr/local/bin/caddy run --config /usr/local/bin/Caddyfile
Restart=on-failure
RestartSec=1s

[Install]
WantedBy=multi-user.target
EOF

分别启动服务就好了

systemctl daemon-reload

systemctl start zot
systemctl start caddy

因为完全没有web界面,只能用curl进行测试了

curl -u user01:password http://localhost:5000/v2/_catalog -vvvv

成功后用docker login后,docker push、docker pull 进行验证就OK了