镜像拉不动后,我用华为云SWR免费额度彻底解决了个人项目的Docker镜像分发
这两年自己写的小项目基本全上了Docker容器化。以前的更新流程很简单也很原始:本地改完代码推到代码仓库,SSH连上华为云服务器,git pull拉代码,然后直接在服务器上跑docker build原地编译,或者从公共镜像仓库里拉预先打好的镜像。
但去年开始,这条路越来越难走:
一是公共Docker源经常连接超时甚至直接解析失败,服务器上拉个基础镜像像在抽奖,动不动卡死在pulling fs layer那一步;
二是我买的华为云轻量服务器只有2核4G,在上面原地跑docker build简直是灾难,尤其是遇到带前端编译或者多阶段构建的项目,内存和CPU瞬间被打满,挂在上面的博客和API直接跟着卡死假死。
最初我想过在服务器上自建一个Harbor镜像仓库,但装上后看了一眼,Harbor全家桶十来个容器跑起来,常驻内存直接吃掉将近2G,对于小主机来说根本不可行。后来翻控制台发现,华为云自带的容器镜像服务(SWR)对个人小规模使用有非常充裕的免费额度。花了一个周末,我用GitHub Actions配合SWR搭了一套自动化构建和镜像分发链路,记录下实操踩坑和几个关键细节。
第一件事:把构建压力移出服务器,推送到SWR。
既然本地和云服务器跑build都难受,最合理的做法就是利用GitHub Actions免费的CI算力。
在代码仓库里配一个简单的workflow,每次往main分支推代码或者打Tag时,由GitHub的云端Runner拉起环境进行docker build。
编译完成后,直接把镜像推送到华为云SWR。SWR的推送地址格式通常是swr.区域.myhuaweicloud.com/你的组织名/镜像名:版本号。
这里有个安全细节:在GitHub Secrets里保存鉴权凭证时,千万不要直接暴露华为云主账号的AK/SK。在华为云IAM里创建一个专门给CI用的子用户,权限只赋予SWR Developer或者针对特定组织的数据上传权限,这样即使CI凭证意外泄露,风险也被严格限制在镜像仓库内。
第二件事:善用内网拉取,彻底摆脱小水管带宽限制。
这是把镜像托管在SWR最爽的一个地方。
我的云服务器买在华北-北京四,因此我在SWR里创建组织时也同样选在华北-北京四。
因为服务器和镜像仓库处于华为云的同一个地域,在服务器上执行docker pull时,流量完全走的是华为云底层的高速内网(VPC内网通道),不仅不消耗服务器本来就极其可怜的1M到3M公网出入带宽,拉取速度更是能直接拉满到几十甚至上百MB/s。
一个体积四五百兆的后端镜像,以前走公网拉取经常要等七八分钟,现在回车敲下去两三秒钟就拉取完毕,容器更新的体验提升了不止一个档次。
第三件事:不要偷懒全用latest标签,配合SWR老化规则清空间。
刚开始为了部署脚本好写,我每次编译镜像都无脑打上latest标签往上推。
这么干跑了两个月就发现了弊端:
首先是一旦新版本上线出问题,本地没有历史镜像记录,根本没办法快速回滚到上一个稳定版本;
其次是频繁推送同名镜像,SWR仓库里会产生大量未打标的悬空镜像(dangling images),悄悄占用存储配额。
后来我把构建规则改成了双Tag模式:每次构建同时打上git commit的前7位哈希值和latest标签。部署脚本默认拉取latest,但排查问题或者回退时可以精准指定某一个历史commit版本。
同时在SWR控制台的镜像版本管理里,配置一条“老化淘汰规则”,设置每个镜像仓库最多只保留最近的5个版本,超出数量的旧版本由系统自动清理。这一步配好后,镜像存储空间始终维持在一个非常小的范围内,完全不需要手动上去删历史镜像。
第四个小坑:Docker登录凭证的过期问题。
在服务器上用docker login登录华为云SWR时,控制台生成的临时登录指令里带有一串很长的加密密码,这个临时密码默认只有24小时有效期。
如果你直接把这条临时命令写进自动化部署脚本,第二天脚本再去pull镜像时就会报鉴权失败(401 Unauthorized)。
正确的长期解决方案是:在华为云控制台生成永久的访问凭证,或者直接使用该专用子用户的AK和SK通过算法生成长期有效的docker login密钥;也可以直接通过华为云提供的CLI工具(hcloud)在拉取前动态获取临时的登录token。我是直接生成了长期访问凭证配置在服务器的/root/.docker/config.json里,一次登录永久有效。
改完这套流程后,我现在的个人开发流变得极其顺畅:
本地只管写代码,写完git push推上仓库就不用管了;
GitHub Actions在后台自动跑测试和镜像打包,构建完自动推到华为云SWR;
连上服务器敲一句更新脚本,走内网几秒钟拉下最新镜像并平滑重启容器,整个过程对服务器本身的计算资源和公网带宽没有任何侵占。
对于个人开发者来说,没有必要什么组件都硬着头皮在自己的小机器上自建。像容器镜像托管这种吃带宽、占存储的基础设施,善用云厂商成熟的托管服务和内网互通红利,能把极其有限的服务器算力全部省下来留给核心业务。
- 点赞
- 收藏
- 关注作者
评论(0)