本篇文章将介绍一个仅有 2MB 身材大小的缓存和加速工具:APT Proxy。
相比老牌儿的 apt cacher ng 而言,除了尺寸更小、内存占用更低(10M以内)、还拥有无需配置,开箱即用等的特点。
写在前面
最近在折腾轻量的 “all in one python” 容器学习环境和一个复杂项目的容器构建,过程中需要不断的 apt-get update
和 apt-get install
,真的是非常浪费时间。
在一年前,我曾分享过如何《使用容器搭建 APT Cacher NG 缓存代理服务》[1],来减少日常开发和 CI 构建过程中的“数据更新、数据下载”所需要的时间。
但是,想要更好的使用 APT Cacher NG,首先需要准备一段冗长的配置文件;其次,如果是首次下载资源,想要享受加速服务,还需要使用命令来调整目标系统环境中的 /etc/apt/sources.list
中的资源域名,真的是有点麻烦。
那么,有没有简单易用的方案呢?
在网上搜索了一圈之后,我发现在八年前,有一个国外的开发者曾计划开发一款名为 apt-proxy
的开源软件,想要用来替换掉 APT Cacher NG(这不是和我想一块去了么)。然而因为种种原因,这位开发者最后弃坑了,而留下来的代码在八年后的今天,也根本编译构建不起来。
但直觉告诉我,这个方式应该是行得通的。
于是,我花了一些时间,对程序进行了一些调整,最终将程序跑了起来。
虽然看起来行数不少,但其实很快的
在经过简单验证之后,我发现原作者的设想和功能理念其实是不错的。只不过真的想用起来,缺少了“一些功能”。于是,我又花了一些时间,为这个软件添加了一些好用的功能:
•同时支持服务 Ubuntu / Debian 系统的数据下载•强化缓存数据规则,避免过于频繁的查询 Indexes 数据,浪费不必要的时间•内置了 Ubuntu / Debian Mirror 列表,根据网络位置自动选择最快的镜像•支持手动指定 Ubuntu / Debian 源地址•拥有一个简单易读的“状态统计页面”
然后,又为它集成了 GitHub 上的 CI 功能,让这个软件可以自动构建支持 i386、x86、x64、ARM64v8、ARM32v6、ARM32v7 多种二进制文件,来在多种硬件上运行。以及自动构建和生成能够跑在各种环境中的 Docker 镜像。
APT Proxy 简洁界面
说了这么多,我们来直接上手看看,如何使用这个“小程序”为我们日常开发 / 软件 CI 构建过程进行加速吧。
使用 APT Proxy 来加速 APT 操作
APT Proxy 的使用方式,一般有两种:直接执行二进制文件,和使用 Docker 来运行。
考虑到我的读者中,Docker “爱好者” 数量众多,就先来聊聊 Docker 中的使用吧。
在 Docker 中使用 APT Proxy
你可以通过下面的命令,先将 apt-proxy 作为后台服务运行在本地。
代码语言:javascript复制docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy
当命令执行完毕之后,我们将会看到类似下面的日志:
代码语言:javascript复制Unable to find image 'soulteary/apt-proxy:latest' locally
latest: Pulling from soulteary/apt-proxy
c2bc5c57ca31: Pull complete
fa7d8f08049a: Pull complete
Digest: sha256:036e1fc4725f98bee2ed8e0c418b44955e134360bf52baaf3f48c3ec6d9d69e3
Status: Downloaded newer image for soulteary/apt-proxy:latest
06d2e2281f21ac505116fdee121aca00aa8a3257803a783f4e253e00c8ac7c94
当服务运行起来之后,我们可以通过打开浏览器,访问 localhost:3142
(或者具体 IP),看到一个简单的统计界面。
首次启动的 APT Proxy 界面
为了方便验证服务效果,我们使用 Docker 再启动一个 Ubuntu 或者 Debian 系统:
代码语言:javascript复制docker run --rm -it ubuntu:22.04
当命令执行完毕之后,我们会进入容器的 Bash 环境中。
在不使用这类缓存代理工具时,我们想安装一个软件(比如 vim
),我们需要执行下面的命令:
apt update && apt install -y vim
# 或者
apt update && apt-get install -y vim
由于操作系统的默认软件源是 http://archive.ubuntu.com/ubuntu/
和 http://security.ubuntu.com/ubuntu/
,加上每次执行命令都需要访问远程网络服务器,所以速度会很慢,偶尔还会遇到网络中断。假设我们想使用 apt-proxy
快速安装 vim
并将 vim
缓存至本地,方便后续其他容器、主机完成快速安全和更新,可以执行下面的命令:
http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true update &&
http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true install vim -y
当然,你也可以根据自己的喜好,或者实际情况使用运行主机的具体 IP 来替换上面命令中的 http://host.docker.internal
,当我们执行完毕命令,会发现程序的下载速度比默认情况下变快了非常多,即使日志中的下载数据地址看起来和默认官方地址完全一样。
Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [109 kB]
Get:4 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [82.3 kB]
Get:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB]
Get:6 http://security.ubuntu.com/ubuntu jammy-security/multiverse amd64 Packages [4653 B]
Get:7 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [188 kB]
Get:8 http://archive.ubuntu.com/ubuntu jammy/multiverse amd64 Packages [266 kB]
...
Unpacking vim (2:8.2.3995-1ubuntu2) ...
Setting up libexpat1:amd64 (2.4.7-1) ...
Setting up media-types (7.0.0) ...
Setting up libsodium23:amd64 (1.0.18-1build2) ...
Setting up libgpm2:amd64 (1.20.7-10build1) ...
Setting up libsqlite3-0:amd64 (3.37.2-2) ...
Setting up xxd (2:8.2.3995-1ubuntu2) ...
Setting up vim-common (2:8.2.3995-1ubuntu2) ...
Setting up libpython3.10-minimal:amd64 (3.10.4-3) ...
...
Processing triggers for libc-bin (2.35-0ubuntu3) ...
这是因为 apt-proxy
在启动的时候,会自动选择最快的 Mirror 站点,并自动的将我们使用的官方软件源进行替换。也就是说,无需像使用 apt-cacher-ng 一样,再去调整和修改 cat /etc/apt/sources.list
文件,就能够获得加速的效果。
在验证完首次下载之后,执行 CTRL D
销毁当前容器,我们再次执行下面的命令,再新建一个干净的容器:
docker run --rm -it ubuntu:22.04
然后再次执行命令,尝试更新软件列表以及进行 vim
安装:
http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true update &&
http_proxy=http://host.docker.internal:3142 apt-get -o pkgProblemResolver=true -o Acquire::http=true install vim -y
你会发现命令执行的速度犹如开挂一般,飞速完成。查看日志,可以发现数据更新的速度最少也在 10MB/s,而连续下载软件包则能够跑到 40MB/s (如果你的文件更大,还可以跑出更高的速度)
代码语言:javascript复制Get:1 http://archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
...
...
Fetched 21.5 MB in 1s (16.3 MB/s)
...
...
Get:15 http://archive.ubuntu.com/ubuntu jammy/main amd64 vim amd64 2:8.2.3995-1ubuntu2 [1724 kB]
Fetched 14.5 MB in 0s (41.6 MB/s)
再次访问浏览器中的统计页面,会看到当前我们已经缓存的文件情况概览。(演示的过程中,使用的是 MacOS 中的 Docker Desktop,所以可用磁盘空间展示的是共享磁盘空间,不够准确,可以忽略。)
缓存了软件的 APT Proxy 的状态
因为我们使用的是容器来运行 APT Proxy,而且并没有选择将数据映射到宿主机,所以清理缓存就变的非常简单,只需要销毁容器,然后再重新创建一个容器即可。
代码语言:javascript复制# 停止容器
docker stop apt-proxy
# 删除容器和缓存数据
docker rm apt-proxy
# 新建一个新的容器
docker run -d --name=apt-proxy -p 3142:3142 soulteary/apt-proxy
当然,如果你在意软件安装速度,也可以将缓存数据映射到宿主机,实现缓存数据的持久化。
代码语言:javascript复制docker run -d --name=apt-proxy -v `pwd`/.aptcache:/.aptcache -p 3142:3142 soulteary/apt-proxy
使用二进制方式使用 APT Proxy
在 GitHub 的项目 Release 页面[2],有包含 7种不同类型的可执行文件。
根据你的使用场景,下载对应的可执行文件的压缩包,然后解压之后,执行:
代码语言:javascript复制./apt-proxy
当程序执行完毕之后,你会得到类似下面的日志:
代码语言:javascript复制2022/06/14 12:49:13 running apt-proxy
2022/06/14 12:49:13 Start benchmarking mirrors
2022/06/14 12:49:13 Finished benchmarking mirrors
2022/06/14 12:49:13 using fastest mirror http://mirrors.tuna.tsinghua.edu.cn/debian/
2022/06/14 12:49:14 Start benchmarking mirrors
2022/06/14 12:49:14 Finished benchmarking mirrors
2022/06/14 12:49:14 using fastest mirror http://mirror.lzu.edu.cn/ubuntu/
2022/06/14 12:49:14 proxy listening on 0.0.0.0:3142
接下来的使用方式,就和上文中提到的一样啦,调整我们要执行的 apt update
或 apt insall
命令即可。
手动指定要使用的软件源
虽然软件内置了不止一个 Ubuntu 和 Debian 的软件源,还会根据网络情况调用官方的软件源接口,来补充合适的软件源。最后,根据测速的方式来自动选择要使用的软件源。
但是,最快的软件源不一定网络出口是最大的,所以你也可以根据你的实际网络状况,来选择更适合你的软件源,假设我们想要把 Ubuntu 和 Debian 使用的软件源指定为 “清华源”,那么可以这样调整命令:
代码语言:javascript复制./apt-proxy --ubuntu=https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ --debian=https://mirrors.tuna.tsinghua.edu.cn/debian/
当命令执行完毕,我们就可以看到日志输出中包含了我们所指定的软件源。
代码语言:javascript复制2022/06/14 12:55:12 running apt-proxy
2022/06/14 12:55:12 using specify debian mirror https://mirrors.tuna.tsinghua.edu.cn/debian/
2022/06/14 12:55:12 using specify ubuntu mirror https://mirrors.tuna.tsinghua.edu.cn/ubuntu/
2022/06/14 12:55:12 proxy listening on 0.0.0.0:3142
上面的参数同样可以用在 Docker 环境中。
其他
APT Proxy 支持的完整的参数,可以通过在命令后添加 -h
来查看。包含了调整缓存目录、调整端口和监听 IP 地址,调整代理模式等。
感兴趣的同学,可以通过 GitHub 项目地址 https://github.com/soulteary/apt-proxy 了解最新的情况,或者自己动手试验来试试看。
最后
这篇文章和 APT Proxy 是最近折腾东西的副产品,希望能够帮助到和我一样“懒惰”的程序员。
如果未来的时间里,GitHub 上的项目和本篇文章收到比较多的鼓励的话,我或许会持续开发和迭代一些有趣、有用的功能。
--EOF
引用链接
[1]
《使用容器搭建 APT Cacher NG 缓存代理服务》: https://soulteary.com/2021/04/12/use-docker-to-build-apt-cacher-ng-caching-proxy-service.html
[2]
项目 Release 页面: https://github.com/soulteary/apt-proxy/releases