服务器在HK,但是去拉取腾讯广州Docker镜像仓的时候总是失败,还是企业版,大无语了。
没办法,被逼无奈,干脆在HK建一个镜像仓建在,然后推送到那里,这样就方便了。
本意是用Harbor,但是Harbor实在太沉重了,而且Harbor的最大问题是过期镜像清理,如果过期镜像出错了,那是清理不掉的,除非重新打一份上传覆盖掉错误的镜像,然后再删除才可以,但问题是如果有700、800个错的镜像,是真没有那个劲去清理了。
那这次就想建个轻量级的,连WEB界面都不要,只要docker login后能push和pull即可
这样的话zot是个不错的选择:
下载zot
1wget https://github.com/project-zot/zot/releases/download/v2.1.10/zot-linux-amd64
准备配置文件
1cat >/usr/local/bin/config.json << EOF
2{
3 "distSpecVersion": "1.0.0-dev",
4 "http": {
5 "address": "127.0.0.1",
6 "port": "5000",
7 "compat": ["docker2s2"],
8 "auth": {
9 "htpasswd": {
10 "path": "/usr/local/bin/htpasswd"
11 }
12 }
13 },
14 "storage": {
15 "rootDirectory": "/data/registry"
16 }
17}
18EOF
注意上面compat,如果不配置,就会出现push的时候出现manifest invalid错误,这是因为docker和oci的标准不同,zot是遵循oci标准的
准备htpasswd,必须用bcrypt的方式,zot不支持其它的!
1-B Force bcrypt hashing of the password (very secure)
2htpasswd -B -c /usr/local/bin/htpasswd user01
准备zot.service
1cat > /etc/systemd/system/zot.service << EOF
2[Unit]
3After=network.target nss-lookup.target
4
5[Service]
6User=root
7ExecStart=/usr/local/bin/zot-linux-amd64 serve /usr/local/bin/config.json
8Restart=on-failure
9RestartSec=10s
10LimitNOFILE=infinity
11
12[Install]
13WantedBy=multi-user.target
14EOF
那大家注意到了,zot只监听到了127.0.0.1:5000,所以前面还需要用caddy代理一下
准备caddy的配置文件
1cat > /usr/local/bin/Caddyfile << EOF
2registry.rendoumi.com {
3 reverse_proxy 127.0.0.1:5000 {
4 header_up X-Real-IP {remote_host}
5 transport http {
6 dial_timeout 15s
7 response_header_timeout 300s
8 }
9 }
10}
11EOF
准备caddy的systemd文件
1cat > /etc/systemd/system/caddy.service
2[Unit]
3After=network.target
4Wants=network.target
5
6[Service]
7WorkingDirectory=/usr/local/bin/
8Type=simple
9User=root
10ExecStart=/usr/local/bin/caddy run --config /usr/local/bin/Caddyfile
11Restart=on-failure
12RestartSec=1s
13
14[Install]
15WantedBy=multi-user.target
分别启动服务就好了
1systemctl daemon-reload
2
3systemctl start zot
4systemctl start caddy
因为完全没有web界面,只能用curl进行测试了
1curl -u user01:password http://localhost:5000/v2/_catalog -vvvv
成功后用docker login后,docker push、docker pull 进行验证就OK了