By accessing the website and accepting the Cookie Policy, you agree to use the cookies provided by the Site in accordance with to analyze traffic, remember your preferences, and optimize your experience.
OK
emengweb 's Blog
Figma YES!
Toggle navigation
emengweb 's Blog
主页
Debian
CAT玉米
VI设计
NAS
OctoberCMS
UIKit3
宝塔面板
Python
SVG相关
PVE
Figma
VPS独服务记录
K8S
About Me
归档
标签
PVE中LXC虚拟机的 Docker 更换为 fuse-overlayfs,大幅降低空间占用
2024-03-28 14:28:36
75
0
0
emengweb
# 起因 由于 LXC 容器无法使用 `overlay2` 存储层,为了保持与 Docker 的兼容性,默认存储层一直采用 `vfs`。vfs 存储层的劣势很明显,目前的 lxc 虽然只部署 7 个 Docker 项目,但 `/var/lib/docker` 目录空间占用高达 70GB,因此迫切需要为 vfs 存储层寻找替代品,查阅众多资料后发现 `fuse-overlayfs` 可以解决这个问题,但lxc有些系统无法通过apt直接安装 fuse-overlayfs,因此就有了这篇文章,详细记录了 lxc 切换 vfs 存储层驱动为 `fuse-overlayfs` 的详细过程。 # Docker 存储层 ## Docker容器分层 Docker 容器采用分层结构,其层级如同洋葱般逐一累加([layers](https://docs.docker.com/storage/storagedriver/)、RUN、COPY、ADD)。这意味着 Dockerfile 中的每个命令将在容器内创建一个新层。每一层仅存储相较于上一层新增的修改内容,从而实现容器间的层级共享,降低存储空间占用和下载时间。然而,需要注意的是,这些层是可以访问的,因此不可通过增加额外层级来保护敏感信息。 在典型的系统环境中,Docker 使用联合文件系统(基于 [MergerFS](https://github.com/trapexit/mergerfs))透明地合并了所需的层级。Docker 将此称为 overlay2(默认[存储驱动程序](https://docs.docker.com/storage/storagedriver/select-storage-driver/))。这样就创建了一个由所有层级共同组成的单个文件系统,而无需复制文件。容器看到的是一个完整的文件系统,但它实质是由多个文件系统组合而成。 ## LXC中的容器分层 **在 LXC 中运行 Docker 时,默认的 overlay2 存储驱动程序不可用**,因为 LXC 无法挂载这些高级的 overlay 文件系统(它们是内核构建的)。相反,LXC 使用 vfs,虽然较简单,但也**存在一些重大问题**。vfs 不会像 overlay2 那样仅更改写入磁盘,而是对现有的整个文件系统进行深度复制,以便在上一层基础上创建下一层。这意味着**容器会消耗更多的空间**,因为许多基础操作系统文件将在每个层中重复出现,从而**显著增加磁盘使用率**。因此,多个容器也无法共享相同的底层。**强制使用 overlay2 也不会改善这种情况:** ```bash ERRO[2021-09-30T09:24:56.914420548Z] failed to mount overlay: invalid argument storage-driver=overlay2 ERRO[2021-09-30T09:24:56.914439880Z] [graphdriver] prior storage driver overlay2 failed: driver not supported failed to start daemon: error initializing graphdriver: driver not supported ``` # LXC 启用 FUSE 并将 Docker 存储层更换为 fuse-overlayfs 不过,有一个解决方案,即 FUSE。存在一个用户空间实现overlayfs,称为fuse-overlayfs。更有用的是,docker 本身就支持它。切换到它很简单: ## 一、确保fuse在容器上启用 在 LXC 配置文件(在 `/etc/pve/lxc` 目录下)中设置 `features: fuse=1,keyctl=1,mknod=1,nesting=1` ,或在 Proxmox 中选中“`fuse、nesting`”选项。修改后,重启容器。 ## 二、安装 fuse-overlayfs: ~~使用管理器安装~~ `~~apt install fuse-overlayfs~~` ~~。~~ 在 LXC 环境中,某些系统无法直接安装 fuse-overlayfs 模块。为了解决此问题,您可以安装 [fusion-overlayfs](https://github.com/containers/fuse-overlayfs/releases) 的开源静态版本。 请执行以下步骤: 1. 下载最新版本的 fusion-overlayfs。 2. 将下载的版本移动到 `/usr/local/bin` 目录。 3. 重命名文件为 `/usr/local/bin/fuse-overlayfs`。 ```bash # 下载 x86_64 位系统版本的程序文件 sudo curl -L -o /usr/local/bin/fuse-overlayfs https://github.com/containers/fuse-overlayfs/releases/download/v1.13/fuse-overlayfs-x86_64 # 更改权限 sudo chmod 755 /usr/local/bin/fuse-overlayfs ``` ## 三、将 Docker 的存储层驱动更换为 fuse-overlayfs 修改 `/etc/docker/daemon.json` 设置 `storage-driver` 为 `fuse-overlayfs`: ```bash {"storage-driver": "fuse-overlayfs"} ``` ## 四、转移 Docker 数据并重启服务 ```bash # 关闭docker服务 sudo service docker stop # 转移旧的docker数据目录 mv /var/lib/docker /var/lib/docker-o # 启动docker服务 sudo service docker start # 查看信息 docker info # 此时的存储层驱动应该已经更换为 Storage Driver: fuse-overlayfs ``` ## 五、重新部署 Docker 应用 逐个重新部署之前的 Docker 应用后,Docker 所占用的空间将大幅减少。新的存储层 (fuse-overlayfs) 与虚拟文件系统 (VFS) 相比,空间占用显著缩小。对于我而言,之前占据 70GB 的空间现在仅使用不到 10GB,并且 IO 读写频率也已降低,LXC也可以快乐的部署 docker 应用了! # 引用资料 https://theorangeone.net/posts/docker-lxc-storage/ https://c-goes.github.io/posts/proxmox-lxc-docker-fuse-overlayfs/
上一篇:
k3s集群对只有IPv6的节点,单独指定获取镜像image pull代理
下一篇:
解决方案:k3s集群etcd包含无效节点,导致etcd故障新节点无法加入的问题
0
赞
75 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航