我的 homelab(4): apt 和 docker 加速

apt 缓存

apt-proxy

这个比较简单,先是看了这位大佬的 apt-proxy。试了一下速度提升很明显,但是好像,如果我用的是我自己的镜像源,不是官方源,就会报错了。然后第三方的软件源也不行,所以还是放弃了。

AptCacherNg

参考 文档 搭建,比想象中的简单。

1
2
  echo 'Acquire::http::No-Cache true;' > /etc/apt/apt.conf.d/no-cache
  echo "Acquire::http::Proxy \"http://10.1.1.1:3142\"; " | sudo tee /etc/apt/apt.conf.d/01proxy

加上这两行就相当于 apt 都会走缓存了。

并且这个好智能的,如果检测到同一个源的不同镜像站,只会保存一份文件。比如说我两台机器同时用官方源和清华源去更新,这个缓存能检测到这两个其实同一份镜像,就只会保存一份文件,非常 nice。

同时他对第三方的软件源也有作用,还支持定期删除旧的软件包,我已经给我的所有机器都配置上了。apt 瞬间下载完还是挺爽的。🥰

Harbor

别看官网上面文档很多,其实安装很简单。

参考的 这一篇博客,讲的很详细。

安装 docker

好像用 ubuntu 的版本不行,要最新的社区版

这里我用我自己根据官方文档和镜像源改的 docker-ce 安装脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 如果你过去安装过 docker,先删掉:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do apt-get remove $pkg; done
# 首先安装依赖:
apt-get update -y
apt-get install ca-certificates curl gnupg -y
# 信任 Docker 的 GPG 公钥并添加仓库:
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu[/gpg](https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg) | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
# 最后安装
apt-get update -y
apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

下载离线包

由于众所周知的原因,我们使用离线安装,不要跟网络过不去。

https://github.com/goharbor/harbor/releases

在官方的 release 页面下载,我这里的最新版是 harbor-offline-installer-v2.11.0.tgz

然后解压进入就行了

1
2
3
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz
ctar -xvf ./harbor-offline-installer-v2.11.0.tgz
cd ./harbor

修改配置文件

由于我只在局域网内使用,https 也弄不了证书,所以就干脆只用 80 端口了。

把上面的 hostname 修改为机器的 ip,然后把下面 https 的内容给注释掉。配置文件很长,后面有设置管理后台的密码的位置,记得改掉。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 10.1.1.1

# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80

# # https related config
# https:
#   # https port for harbor, default is 443
#   port: 443
#   # The path of cert and key files for nginx
#   certificate: /your/certificate/path
#   private_key: /your/private/key/path
#   # enable strong ssl ciphers (default: false)
#   # strong_ssl_ciphers: false

开始安装

确认以上都配置好之后,就可以开始安装了。

1
./install

脚本会自动释放镜像并进行配置,几分钟就安装好了。

配置镜像加速

这个很简单,就在 ui 上面操作一下就可以了。

参考 官方文档

Docker 配置镜像

这方面才是大头,真的恶心。

目标

我这边是有很多台机器,不同的机器上面都有拉取镜像的需求。我希望做一个镜像的缓存,尽量做到所有镜像只对公网拉取一次。

并且,对于客户端最好是透明的,就是使用的时候,使用原来的命令就享受到缓存的效果,不需要手动给命令添加什么配置。(修改配置文件是允许的,因为我可以在初始化的时候自动配置好)

docker 使用镜像

首先参考的是 这一篇文章,讲了给 docker 配置镜像的方法,很详细,很棒。

但是很可惜,他的镜像只支持 dockerhub,要是其他的仓库的话,还是要访问源站。

如果说是镜像的问题,倒不如说是 docker 故意埋下的坑。这个 /etc/docker/daemon.json中的registry-mirrors 选项。只对 dockerhub 有用!只对 dockerhub 有用!只对 dockerhub 有用!

不用怀疑,今天是 2024 年 6 月 19 号,官方文档 里面自己写着的。

It’s currently not possible to mirror another private registry. Only the central Hub can be mirrored.

我**

containerd 使用镜像

没关系,搞电脑要心平气和。

docker 基于 containerd,如果 docker 不支持,我们看看能不能直接搞 containerd。

containerd 配置镜像,参考的是这 一篇博文,这个博主讲的很详细,我也配置成功了。

但是,后来仔细看才了解,这个配置的 /etc/containerd/certs.d/docker.io/hosts.toml,是 cri 的配置,是 k8s 用的那一套接口。其中ctr 是 containerd 自己的 cli,非常的底层的,不会遵循上面的配置。

要成功使用上面的配置,要用 crictl

然后呢,docker 是基于 containerd 的,但是它并不是用的 cri 的接口,所以,上面的配置,对 docker没用!没用!没用!

解决方案

没关系,搞电脑要心平气和。

不就是个缓存加速嘛,我先看看需要啥镜像,接着给 tag 加个前缀,从 mirror 上面拉下来,然后再把 tag 改回去,把这些步骤重复个十几遍。又不是不能用,抱怨这么多干嘛。

总结

写点感想。

因为 docker 主导的容器世界里,image 的名字和地址是同一个概念。image 的名字即描述了要到哪里去拉取镜像,拉取镜像的这个地址也就是这个镜像的名字。

如果我们要让指定 docker 到别处去拉取镜像,走缓存,那么我们就要改变 image 的名字,但是改变了 image 的名字,就不再是原来的那个镜像的(名字不同,但镜像的 layer 可以复用),所以之前的命令、脚本就用不了了。这就是我一定要对客户端透明的原因。

并且,docker 的容器世界是没有签名这一个东西的(或者说基本没有)。apt/yum 可以依靠 gpg 来保证不管包是从哪里下载下来的,都可以验证包有没有被篡改。所以可以放心大胆的使用 http 进行下载,反正我下载之后会校验的,你改了我这里就报错了,就知道你改了,甚至还不需要 https 加一层 tls 浪费性能。既然用了 http,虽然其他人知道你在下什么了,但是也可以是拦截了你的请求然后给你丢一份本地下载好了的,这样你就不用请求远程的服务器了,达到了本地缓存的效果。

反观 docker,仓库传啥我接收啥,仓库给我什么就是什么,镜像的安全性完全依赖仓库的可信度和 https 进行保证。这个时候,如果你用了一个镜像仓库,那么这个镜像仓库完全有能力对你进行投毒。因为你又不知道你想要下载的镜像长成什么样子,仓库给你你一个有毒的镜像,你就乐呵呵的去用去了,谁会一个个去比对镜像的哈希啊。

并且,你全都是 https 了,我还不好做本地缓存了。我要你走缓存的话还必须要改配置文件,从外界是改不了的。

怎么说呢,双刃剑吧,都有好有坏。不像 apt/yum 一样有官方去发包,docker 代表的容器注定是没有集中的发行管理的(指有 CA 定期更新)。反正这软件就这样,我就一普通用户,也很难改变,就这样吧,有的用就不错了。

Licensed under CC BY-NC-SA 4.0