服务器在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了