一种内外网Docker镜像同步的Harbor复制架构,适用于本地高性能编译+生产环境拿来主义
内容提要
本文介绍了一种内外网Docker镜像同步的Harbor复制架构,旨在解决本地高性能编译与生产环境资源紧张的问题。通过统一编译环境,利用Harbor的复制功能,将开发环境构建的镜像自动推送到生产环境。核心策略是使用假域名(如harbor.example.com)配合HOSTS解析,实现内外网访问同一域名但路由不同,确保生产环境内网直连,开发环境通过公网同步。最终实现编译任务从生产环境剥离,提升效率。
延伸解读
域名统一,内外网分流
文章的核心思路是使用一个假域名(如harbor.example.com),通过修改各环境的HOSTS文件,让内外网访问同一域名时解析到不同IP。这样既满足了Harbor单一规范入口的要求,又实现了内外网流量的分流。生产环境内网直连,开发环境通过公网同步,避免了因Harbor底层逻辑限制而导致的地址混乱问题。
容器内HOSTS配置要点
除了宿主机,容器内也需要正确配置HOSTS。例如,使用Portainer时,需在启动命令中添加--add-host参数;对于Harbor自身,需修改其docker-compose.yml,为registry、core、jobservice等服务添加extra_hosts配置。否则,容器内访问Harbor时可能因域名解析错误而失败。
复制规则与安全考量
通过Harbor的复制管理,设置Push模式规则,匹配特定tag(如prod)自动触发镜像同步。同时,生产环境需通过反向代理和防火墙白名单限制访问,仅允许内网IP或公司出口IP访问,确保安全性。这样既实现了镜像自动同步,又避免了暴露不必要的端口。
Q&A
为什么生产环境不适合直接进行代码编译?
因为生产环境的服务器配置珍贵,编译任务会占用大量CPU和内存,可能导致业务服务出现问题。
Harbor复制架构中,使用假域名(如harbor.example.com)的目的是什么?
目的是让内外网访问同一个域名但路由到不同的Harbor实例,因为Harbor只支持一个规范入口(hostname),使用IP直连会导致问题。通过HOSTS解析,生产环境内网指向内网Harbor,开发环境指向公网Harbor,实现镜像同步。
如何配置生产环境的HOSTS文件来使用假域名?
在生产环境的/etc/hosts文件中添加一行:88.88.88.88 harbor.example.com,其中88.88.88.88是生产环境Harbor的公网IP。
在Docker容器内如何配置HOSTS以访问Harbor?
在启动容器时使用--add-host参数,例如:--add-host harbor.example.com:192.168.0.111(内网IP)或88.88.88.88(公网IP)。对于Harbor自身的容器,需要修改docker-compose.yml,在registry、core、jobservice服务下添加extra_hosts配置。
Harbor复制架构中,复制模式选择Push有什么好处?
Push模式由开发环境的Harbor主动推送镜像到生产环境的Harbor,这样生产环境无需主动拉取,只需接收,简化了网络配置,且便于自动化触发复制。
如何设置Harbor复制规则以实现自动同步?
在开发环境的Harbor中,进入【系统管理】-【仓库管理】添加生产环境的Harbor仓库(如http://harbor.example.com),然后在【复制管理】中新建复制规则,匹配包含prod的tag,选择Push模式,目标仓库选择刚添加的仓库即可。
该架构如何实现编译任务从生产环境剥离?
开发环境使用高性能编译机进行编译,构建的镜像推送到开发环境的Harbor,通过复制规则自动同步到生产环境的Harbor,生产环境只需从内网Harbor拉取镜像,无需进行编译,从而将高消耗的编译任务从生产环境剥离。