Discourse 镜像和安装大小。清理 /var/lib/docker/overlay2?

您好,我按照 discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub 上的指南,在一台全新的专用机器上安装了 Discourse。

该服务器有 15GB 的磁盘空间。即使当前安装尚未投入生产环境(用户少于 10 人,无附件,仅创建和删除过少量帖子),安装占用的空间似乎仍然较大。

#df -kh
Filesystem                         Size  Used Avail Use% Mounted on
udev                               950M     0  950M   0% /dev
tmpfs                              199M  1.3M  198M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   15G   11G  3.2G  78% /
tmpfs                              994M     0  994M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
tmpfs                              994M     0  994M   0% /sys/fs/cgroup
/dev/sda2                          976M  203M  707M  23% /boot
/dev/loop0                          56M   56M     0 100% /snap/core18/2066
/dev/loop1                          56M   56M     0 100% /snap/core18/2074
/dev/loop2                          33M   33M     0 100% /snap/snapd/12398
/dev/loop3                          33M   33M     0 100% /snap/snapd/12159
/dev/loop4                          68M   68M     0 100% /snap/lxd/20326
overlay                             15G   11G  3.2G  78% /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/merged
/dev/loop6                          71M   71M     0 100% /snap/lxd/21029
tmpfs                              199M     0  199M   0% /run/user/1000
# du -csh /var/lib/docker/overlay2
580M    51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****
2.3G    ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****
76M     d1b8d94d2ecfa140794c61e2a81ad4a09eba1646d764018cf5afd433b51*****
4.5G    ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****
40K     ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****-init
24K     l
7.4G    total
# du -shc /var/lib/docker/overlay2/*/diff
580M    /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff
2.3G    /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff
76M     /var/lib/docker/overlay2/d1b8d94d2ecfa140794c61e2a81ad4a09eba1646d764018cf5afd433b51*****/diff
996M    /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff
20K     /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****-init/diff
3.9G    total
# docker images -a
REPOSITORY            TAG       IMAGE ID       CREATED        SIZE
local_discourse/app   latest    b29b7073fea2   2 months ago   2.69GB
<none>                <none>    30e4746e631e   3 months ago   2.23GB
docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          1         1         2.689GB   0B (0%)
Containers      1         1         950.4MB   0B (0%)
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

我尝试了以下操作,但并未奏效:

# /var/discourse/launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

我担心一旦投入生产环境,安装所占用的空间会持续增长,从而导致系统故障。能否请您建议 Docker 镜像和安装的正常大小是多少?以及我可以采取哪些措施来释放一些空间?

谢谢

1 个赞

我很想知道 <none> Docker 镜像的含义。(编辑:看起来,如果 <none> 镜像出现在 docker images -a 中,那并不太重要;但如果它出现在 docker images 中,那就是空间浪费。我希望启动器清理会有所帮助,但它似乎没能帮到您……)

请注意,df 看到的 overlay 文件系统使用量与根文件系统的使用量一致:有大量数据在重复使用,您需要小心不要重复计算。在您的情况下,可用空间为 3.2G,这才是需要关注的数字。可能确实需要进行一些清理工作。

下面我将展示我的类似统计信息。我有两个论坛,分别位于不同的主机上。一台主机有 20G 空间,另一台有 25G。我认为 15G 可能会非常紧张,尤其是在更新过程要求开始前至少有 5G 可用空间的情况下。

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   19G  5.1G  79% /

# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
discourse/base        2.0.20210415-1332   30e4746e631e        3 months ago        2.23GB
<none>                <none>              1e6bf44c2762        5 months ago        2.46GB
discourse/base        2.0.20201221-2020   c0704d4ce2b4        7 months ago        2.11GB


# du -shc /var/lib/docker/overlay2/*/diff
2.2G	/var/lib/docker/overlay2/05fa0e4df2...
76M 	/var/lib/docker/overlay2/58b000b1f5c...
20K 	/var/lib/docker/overlay2/6271023fc7a...
1.1G	/var/lib/docker/overlay2/6271023fc7...
2.3G	/var/lib/docker/overlay2/91d6adf7ad...
481M	/var/lib/docker/overlay2/b6b06a7cee...
592M	/var/lib/docker/overlay2/d81e44d563...
76M 	/var/lib/docker/overlay2/fb98649680b...
6.8G	total


# du -shc /var/lib/docker/overlay2/*
2.2G	/var/lib/docker/overlay2/05fa0e4df2...
76M 	/var/lib/docker/overlay2/58b000b1f5c...
4.7G	/var/lib/docker/overlay2/6271023fc7...
40K 	/var/lib/docker/overlay2/6271023fc7a...
2.3G	/var/lib/docker/overlay2/91d6adf7ad...
481M	/var/lib/docker/overlay2/b6b06a7cee...
592M	/var/lib/docker/overlay2/d81e44d563...
76M 	/var/lib/docker/overlay2/fb98649680b...
36K 	/var/lib/docker/overlay2/l
11G	total


# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              4                   1                   5.155GB             4.689GB (90%)
Containers          1                   1                   1.059GB             0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

另请参阅 磁盘已满后修复 Discourse

以及 使用 Discourse 的最低要求?

还有 2.6.0 beta 3 更新因磁盘和/或内存空间不足而失败

1 个赞

更新:在我进行备份并运行更新后,我也执行了清理操作。

我相当确定,使用管理 Docker 镜像的工具比直接操作 /var/lib/docker/overlay2 更优。而自动清理又比这些工具更优。(但正如链接帖子中提到的,磁盘空间还会被其他方式占用:备份、交换文件、日志文件、上传内容、导入数据、日志文件等等)

以下是我看到的“之后”状态(对应上文发布的“之前”状态)——请注意,起始可用磁盘空间较低,可能是因为备份占用了空间:

# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   19G  5.1G  79% /
# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
discourse/base        2.0.20210415-1332   30e4746e631e        3 months ago        2.23GB
<none>                <none>              1e6bf44c2762        5 months ago        2.46GB
discourse/base        2.0.20201221-2020   c0704d4ce2b4        7 months ago        2.11GB
# /var/discourse/launcher cleanup
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: discourse/base:2.0.20201221-2020
untagged: discourse/base@sha256:e18*
deleted: sha256:1e6*
deleted: sha256:a22*
deleted: sha256:c07*
deleted: sha256:9b7*
deleted: sha256:87c*
untagged: discourse/base:2.0.20210415-1332
untagged: discourse/base@sha256:b3b*

Total reclaimed space: 2.456GB
# docker images -a
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
<none>                <none>              30e4746e631e        3 months ago        2.23GB
# docker images 
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
local_discourse/app   latest              8da0107aba03        2 months ago        2.7GB
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   17G  7.8G  68% /
# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   1                   2.699GB             0B (0%)
Containers          1                   1                   1.13GB              0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B
# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        25G   17G  7.8G  68% /
# du -shc /var/lib/docker/overlay2/*
4.9G	/var/lib/docker/overlay2/627*
40K 	/var/lib/docker/overlay2/627*-init
2.3G	/var/lib/docker/overlay2/91d*
592M	/var/lib/docker/overlay2/d81*
76M 	/var/lib/docker/overlay2/fb9*
24K 	/var/lib/docker/overlay2/l
7.8G	total
# du -shc /var/lib/docker/overlay2/*/diff
20K 	/var/lib/docker/overlay2/627*-init/diff
1.2G	/var/lib/docker/overlay2/627*/diff
2.3G	/var/lib/docker/overlay2/91d*/diff
592M	/var/lib/docker/overlay2/d81*/diff
76M 	/var/lib/docker/overlay2/fb9*/diff
4.2G	total

1 个赞

我说你至少需要 25GB,但 @Ed_S 表示 20GB 也能运行。不过根据我的经验,即使是 25GB 也略显紧张。

1 个赞

大家好,
谢谢你们的回复。

我使用以下命令检查了日志空间:

# journalctl --disk-usage
Archived and active journals take up 1.5G in the file system.

然后运行了以下命令来释放空间:
# journalctl --vacuum-time=10d

现在我有 1GB 的额外空间了。
我真正想问的是 Discourse 实际需要的空间大小。
实际上,我的备份(因为不在生产环境中)大约为 10MB,总共 3 个备份(30MB)。

我理解更新过程中需要空间,但在正常运行期间,我希望能保存当前版本,并有机会删除旧版本。
我们是否需要 overlay 中的所有差异数据?或者能否以某种方式合并所有内容以回收空间?我也没看到任何挂载的卷,所以我想 Discourse 应该把所有数据都保存在那里。

@Ed_S 这是我运行命令的结果:

~# du -kx / | sort -n | tail -33
431172  /usr/bin
482000  /var/lib/snapd
499660  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby/2.7.0/gems
533056  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var/www/discourse
533060  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var/www
556800  /usr/lib/firmware
570876  /usr/lib/modules
574032  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff/var
593840  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****/diff
593856  /var/lib/docker/overlay2/51d029d96e73b67e449f0b0570be47b6292da46c8c69b9f0dc6df35db85*****
626400  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby/2.7.0
626404  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle/ruby
626408  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor/bundle
634964  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse/vendor
845496  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/usr/lib
863600  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www/discourse
863612  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var/www
936876  /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/var
1004276 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var/www/discourse
1004284 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var/www
1032452 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff/var
1091584 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****/diff
1091604 /var/lib/docker/overlay2/ef92e2dc7a656c20eccbbdd40e660c76631ef48b6989f9ded3889a929eb*****
1426272 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff/usr
1579980 /usr/lib
2398720 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****/diff
2398736 /var/lib/docker/overlay2/ae38f397c79178185e26b87a9e2c6c890b0db9d3456de6d34ae3c3b96db*****
2607528 /usr
4161292 /var/lib/docker/overlay2
4171308 /var/lib/docker
4816636 /var/lib
5509688 /var
10220684        /
1 个赞

在相关线程中,我们看到了这样一种情况:./launcher cleanup 未能解决问题,但 docker system prune --all --volumes --force 却成功了。我不清楚其中的原因。

我也不太理解 Docker 镜像的堆叠方式、为何 diff 目录如此之大,以及为何 Docker 报告的磁盘使用量远大于其自身显示的容量。

不过值得注意的是,最小化磁盘占用需要付出努力:Docker 和 Discourse 都没有将最小化磁盘占用作为优先事项。这两个项目更倾向于专注于改进产品并保持简洁。

我目前在一台 20GB 的实例上成功运行。考虑到需要预留 5GB 空间用于升级,实际可用磁盘空间上限为 15GB。而在您的情况下,使用 15GB 实例时,您需要将已用空间控制在 10GB 以内。我们可以预期这会更加困难,甚至可能无法实现。肯定存在某个最低限度。

我记得曾看到过一个帖子,建议卸载所有 Docker 和 Discourse,仅保留站点配置和数据库,然后重新安装。我不会轻易采取这种做法,更不用说在没有备份的情况下操作了!可惜我目前找不到那个帖子。

我的 docker volume ls 输出为空,这取决于用户是否挂载了卷。

如果能提供更官方的规范或预期的安装大小就好了,也许有相关信息但我没找到。我理解在当今世界 20GB 不算多,但涉及到备份、远程传输、复制等场景时,这就成了空间浪费。如果我们从一开始就知道如何节省这些空间,或许就能避免这种情况。

非 Docker 安装是可行的,但据我所知,如果出现任何问题,这种方式并不受支持。

而 25GB 正是典型的新手和预算有限的 DigitalOcean 用户所获得的配置。这确实是目标受众。

既具备管理小于 25GB 磁盘空间的专业能力,又没有预算购买 25GB 磁盘空间的人群非常少。我认为你是过去五年里第一个提出此类请求的人。

你可以通过自行管理备份并将备份远程存储来节省一些空间。单次备份需要保留三份副本:旧副本、新的未压缩副本以及新的压缩副本。这是我能想到的最有效的节省空间的方法,但我并不声称自己拥有大量的 Docker 专业知识。

你也可以设法在临时服务器上远程构建新镜像,然后将其推送到仓库。这样你就不需要在本地占用额外的 Docker 空间。这可能是你最好的选择,但目前没有完善的文档说明具体操作方法,而且该方案大多不受支持(不过相比非 Docker 安装,支持度还是要高一些)。如果你聘请我来做这件事,费用将相当于 10GB 磁盘空间多年费用的总和。我曾考虑过提供一项服务,由我来构建这些镜像(本质上是一个支持度更好的 Bitnami),但尚未着手实施,因为我认为目前的市场规模还不足以证明开发时间的投入是值得的。

我很有兴趣知道您的 15G 服务器费用是多少,以及供应商是谁。我的 25G 机器每月在 Digital Ocean 上花费 6 美元,而我的 20G 机器在 Hetzner 上仅需 3 美元。

如果您不打算从系统日志中调试任何行为,那么对日志进行清理时可以非常彻底。

# journalctl --rotate
# journalctl --vacuum-time=1s

不过,我采取的做法是修改策略:

/etc/systemd/journald.conf:
[Journal]
SystemMaxUse=50M

那台 20G 机器(上面运行着一个非常小型的低活跃度论坛)的磁盘使用情况如下:

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G  9.9G  8.1G  56% /

操作系统:

15M /bin
16M /sbin
43M /boot/
135M /var/cache/
223M /var/log
435M /lib
464M /var/lib/apt
1.1G /usr
2.1G /swapfile
4.3G total

Discourse:

# du -hs /var/discourse/ /var/lib/docker/
1.5G /var/discourse/
7.5G /var/lib/docker/

编辑:啊哈,但这样会重复计算,请看:

# du -hxs /var/discourse/ /var/lib/docker/
1.5G /var/discourse/
4.1G /var/lib/docker/

论坛本身(包含在上述路径中):

201M	/var/discourse/shared/standalone/uploads
315M	/var/discourse/shared/standalone/postgres_data
930M	/var/discourse/shared/standalone/backups

我运行的是 Ubuntu 18.04,而您似乎运行的是类似 20.04 的版本,后者可能体积更大。

我使用不同的 VPS,在 Contabo 上有一些虚拟机,在 Azure 上也有其他的。对我来说,关键是要确认我所维护的系统是否按预期进行维护和配置(包括大小、清理等)。

感谢关于修改 journald 策略的提示,我已经照做了(我之前已经清理过,所以只节省了一点空间,但至少现在我不需要再手动检查了)。

你的磁盘使用量和我差不多:

# du -hxs /var/discourse/ /var/lib/docker/
181M    /var/discourse/
4.0G    /var/lib/docker/

我本来打算删除 Docker 并重新构建,但由于没有为 Docker 挂载固定的卷,我担心在删除阶段会丢失论坛数据。我会等待更官方的操作流程。

是的,值得寻求确认。我非常确定所有论坛数据都在 /var/discourse 下。

另一个你可能采用的方法是启动一个新实例并全新安装 Discourse,看看效果如何。(无论如何,都应该测试你的备份!)

1 个赞