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 이미지와 설치의 일반적인 크기가 어느 정도인지, 그리고 공간을 확보하기 위해 무엇을 할 수 있는지 조언을 구합니다.
감사합니다.

<none> 도커 이미지의 의미를 알아보고 싶습니다. (수정: docker images -a에서 <none> 이미지가 보인다면 큰 문제가 아니지만, docker images에서 보인다면 공간 낭비가 된다는 것 같습니다. 런처의 정리 작업이 도움이 될 것이라 희망했지만, 당신에게는 도움이 되지 않은 것 같네요…)

참고로, df를 통해 확인되는 오버레이 파일시스템 사용량은 루트 파일시스템의 사용량과 일치합니다. 데이터가 이중으로 사용되고 있는 부분이 많으므로 이중 계산을 하지 않도록 주의해야 합니다. 당신의 경우 가용 공간은 3.2G이며, 이것이 걱정해야 할 수치입니다. 정리가 필요한 부분이 있을 수 있습니다.

아래에 제 유사한 통계를 보여드리겠습니다. 저는 서로 다른 호스트에 두 개의 포럼을 운영하고 있습니다. 한 호스트는 20G, 다른 호스트는 25G의 공간을 가지고 있습니다. 업데이트 과정에서 시작 전에 5G의 여유 공간이 요구되므로, 15G는 매우 빠듯할 것 같습니다.

# 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

아마도 디스크가 가득 차고 나서 디스코스를 수정하는 방법도 참고할 수 있습니다:

그리고 디스코스를 사용하기 위한 최소 요구 사항?:

그리고 2.6.0 beta 3 업데이트가 디스크 및/또는 메모리 공간 문제로 실패했습니다:

업데이트: 백업을 수행하고 업데이트를 실행한 후, 정리(cleanup) 작업도 함께 수행했습니다.

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

최소 25GB는 있어야 한다고 보는데, @Ed_S는 20GB로 잘 돌아간다고 하더라고요. 제 경험상 25GB도 좀 빠듯한 편이에요.

안녕하세요,
답변 주셔서 감사합니다.

저널을 확인해 보니

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

라는 결과가 나왔습니다.

그리고 공간을 확보하기 위해 이 명령을 실행했습니다.
# journalctl --vacuum-time=10d

이제 1GB가 더 확보되었습니다.
제 순수한 질문은 discourse에 실제로 필요한 용량에 관한 것이었습니다.
실제로 백업은 프로덕션 환경이 아니어서 약 10MB 수준이며, 백업 3개를 합치면 총 30MB 정도입니다.

업데이트 중에 공간이 필요하다는 점은 이해하지만, 실행 중에는 현재 버전을 유지하면서 이전 버전을 삭제할 수 있는 옵션이 있어야 한다고 생각합니다.
오버레이의 모든 diff가 필요한가요, 아니면 용량을 복구하기 위해 모든 콘텐츠를 어떤 방식으로든 병합할 수 있는 방법이 있을까요? 또한 마운트된 볼륨도 보이지 않아서 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        /

링크된 스레드에서는 ./launcher cleanup이 도움이 되지 않았지만 docker system prune --all --volumes --force가 문제를 해결한 상황이 보입니다. 왜 그런지는 알 수 없습니다.

Docker 이미지들이 어떻게 쌓이는지, diff 디렉터리가 왜 그렇게 큰지, 또는 Docker의 디스크 사용량이 Docker가 보고하는 크기보다 훨씬 크게 나타나는 이유를 이해하지 못하고 있습니다.

그러나 디스크 사용량을 최소화하는 데는 노력이 필요하다는 점을 유의할 가치가 있습니다. Docker도 Discourse도 디스크 사용량 최소화를 우선순위로 두지 않습니다. 두 프로젝트 모두 제품 개선과 단순성 유지에 더 중점을 두고 있습니다.

저는 20GB 인스턴스에서 성공적으로 운영 중입니다. 업그레이드를 위해 5GB를 비워두어야 하므로, 실제로는 사용 중인 디스크 공간의 한도가 15GB입니다. 15GB 인스턴스를 사용하는 경우, 사용량을 10GB 이내로 유지해야 합니다. 이는 더 어려울 수 있으며, 불가능할 수도 있습니다. 당연히 최소한의 요구 사항은 있을 것입니다.

모든 Docker와 Discourse를 제거하고 사이트 구성과 데이터베이스만 남긴 채 재설치하라는 조언이 담긴 스레드를 본 것 같습니다. 저는 그걸 가볍게 하지는 않을 것이며, 백업 없이 절대 하지 않을 것입니다. 안타깝게도 지금은 그 스레드를 찾을 수 없습니다.

내 경우 docker volume ls가 비어 있습니다. 이는 사람들이 볼륨을 마운트했는지에 따라 달라집니다.

설치에 대한 좀 더 공식적인 사양이나 예상 크기를 알 수 있으면 좋겠습니다. 어딘가에 관련 정보가 있을 수 있지만 찾지 못했습니다.

오늘날 20GB는 그리 큰 용량이 아니라는 점은 이해합니다. 하지만 백업, 원격 전송, 복제 등을 고려할 때, 처음부터 이 공간을 절약하는 방법을 안다면 피할 수 있는 공간 낭비가 될 수 있습니다.

Docker가 아닌 설치도 가능하지만, 제 지식 범위 내에서 문제가 발생하면 지원되지 않는 것으로 알고 있습니다.

그리고 25GB는 DigitalOcean을 사용하는 일반적인 초보자나 저예산 사용자들이 사용하는 용량입니다. 이것이 실제로는 주요 대상 사용자층입니다.

25GB 미만의 디스크 공간을 관리할 전문 지식은 있지만, 25GB 디스크 공간에 대한 예산은 없는 사람들의 수는 매우 적습니다. 지난 5년간 당신의 요청을 받은 것이 처음인 것 같습니다.

자체 백업을 관리하고 원격으로 백업하면 조금 절약할 수 있습니다. 단일 백업에는 세 가지 사본이 필요합니다. 이전 사본, 새로운 압축되지 않은 사본, 그리고 새로운 압축된 사본입니다. 제가 생각할 수 있는 가장 큰 절약 방법은 이것이지만, 저는 특별한 도커 지식에 대해 주장하지는 않습니다.

또한 임시 서버에서 새로운 이미지를 원격으로 빌드하고 리포지토리에 푸시하는 방식을 고안할 수도 있습니다. 이렇게 하면 로컬에서 추가적인 도커 공간이 필요하지 않습니다. 이것이 아마도 가장 좋은 방법일 것입니다. 하지만 이를 수행하는 잘 문서화된 방법은 없으며, 대부분 지원되지 않습니다(비도커 설치보다는 더 많이 지원되긴 합니다). 만약 저에게 이를 수행하도록 고용한다면, 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를 사용하고 있습니다. 일부 VM은 Contabo에, 나머지는 Azure에 있습니다. 제 입장에서는 제가 유지 관리 중인 환경이 예상대로(크기, 정리 등) 유지 관리되고 구성되어 있는지 확인하는 것이 중요합니다.

journald의 정책을 변경하는 방법에 대한 팁에 감사드립니다. 해당 작업을 수행했습니다(이전에 정리했기 때문에 저장된 공간은 많지 않지만, 이제 별도로 확인할 필요가 없습니다).

저의 디스크 사용량은 질문자님과 거의 비슷합니다.

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

Docker를 삭제하고 다시 구축하는 쪽으로 가닥을 잡고 있지만, Docker에 고정 볼륨이 마운트되어 있지 않아 삭제 단계에서 포럼 데이터를 잃을까 봐 걱정됩니다. 이에 대한 공식적인 절차가 더 나오기를 기다리겠습니다.

확인해 볼 가치가 있습니다. 포럼 데이터는 모두 /var/discourse 아래에 있을 것으로 거의 확신합니다.

또 다른 접근 방식으로는 새 인스턴스를 시작하고 discourse를 새로 설치한 후 결과를 확인해 보는 것이 있습니다. (어떤 경우에도 백업을 테스트해야 합니다!)