目录

内网镜像站

背景

在企业内部的日常构建中,我们需要频繁地拉取外网资源(系统工具,lib库,编译好的二进制文件等),其中也有部分需要访问 GitHub,Google,Docker Hub 等的需求。因此,有必要在内网维护一些常用的“热”资源,加速下载,节省流量,减少构建时间。也有部分没有公网访问的构建环境,只允许部分机器通过其他代理访问。

方案

目前,各大厂商和高校提供了一些镜像源服务,我们可以使用开源社区的Nexus工具,将大厂的开源镜像站设置为上游,同步和更新上游镜像来解决问题。

  1. 网易云:https://mirrors.163.com/
  2. 阿里云:https://mirrors.aliyun.com/
  3. 腾讯云:https://mirrors.cloud.tencent.com/
  4. 中科大:https://mirrors.ustc.edu.cn/
  5. 清华源:https://mirrors.tuna.tsinghua.edu.cn

搭建nexus服务

为了方便测试,这里通过docker-compose本地启动一个nexus服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# docker-compose.yaml
version: "3"

services:
  nexus:
    image: sonatype/nexus3:latest
    container_name: nexus
    volumes:
      - "/data/nexus-data:/nexus-data"
    ports:
      - "80:8081" # used by web
      - "81:8082" # used by docker
    restart: always

当然,也可以作为一个POD部署在K8S集群中,通过ingress和service来访问服务和做高可用。对于这些缓存的内容,建议对接MinIO提供的S3存储,速度上会有优势。而且,这些内容丢了也没有关系,重新缓存就行了。如果服务异常了,可以直接删除挂载目录,重启POD快速恢复服务。

配置nexus仓库

首先,根据具体情况来设置清理策略,防止占满磁盘。我这边设置了一个月不常用的内容就会不清理掉,每天凌晨一点执行。

其次,设置需要缓存的仓库并绑定对应的清理策略。一般需要镜像的内容有:编程语言相关的包,操作系统相关的工具和容器镜像。如果使用它作为容器镜像的缓存,则需要打开匿名拉取,同时将(setting -> security -> Realms -> Docker Bearer Token)激活。具体配置可以参考这篇文章 ,这里就不过多介绍。

最后,比如Golang相关的包,有的是直接引用内部的是有仓库。这时需要使用nexus的route功能,配合其他工具来解决这类问题。

使用

加速容器镜像拉取

修改docker的config文件:/etc/docker/daemon.json

1
2
3
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/"]
}

加速系统工具安装

这里以apt的修改为例:

1
sudo sed -i 's@//.*archive.ubuntu.com@//${DOMAIN_OR_IP}@g' /etc/apt/sources.list

实践

通过观察可以发现,虽然各大厂商的镜像域名不一致,但是后端的内容都大同小异。比如:alpine,ubuntu,centos等。这样就可以通过nexus里的一个raw group来组合,达到较少配置的目的。另外,alpine仓库配置的时候比较特殊,需要关闭storage里的 Strict Content Type Validation. 否则的化会一直提示要执行apk update来更新仓库。其他编程语言相关的包,也能在大厂的网站上找到,选择对应的format类型同构group类的仓库添加两个以上的proxy类型的仓库,来提升可用性。