AWS(EC2, T2 미디어)에서 여러 Docker 컨테이너를 실행하고 있는데 지속적으로 디스크 공간이 부족합니다. 이는 기본 파일 시스템과 관련이 있습니다. 저는 Ubuntu에서 Docker를 실행하고 있는데 잘 작동합니다(AUFS). 기본 AWS Linux 버전은 RHEL을 기반으로 하며 장치 매퍼를 사용해야 합니다. 이것은 훨씬 더 복잡해 보이지만 사용 방법에 대한 적절한 설명서가 없다는 사실에 놀랐습니다(또는 찾을 수 없음).
EC2에서 Ubuntu 이미지를 사용할 수 있지만 EC2에서 Docker를 큰 문제 없이 실행할 수 있어야 한다고 생각하시나요? 아니면 디스크 공간이 부족해지는 것을 방지하기 위해 특별한 조치를 취해야 합니까?
저는 NGINX와 NodeJS 이미지만 사용합니다.
답변1
기본적으로 docker는 데이터를 /var/lib/docker
.
또한 기본적으로 EC2 인스턴스를 생성할 때 루트 볼륨은 일반적으로 작습니다(약 4GB). 루트 파티션은 도커 이미지가 저장된 곳일 가능성이 높으며 루트 파티션이 너무 작습니다.
따라서 루트 파티션을 늘리십시오. 또는 새 EBS 볼륨을 연결하고 적절한 곳에 마운트한 /var/lib/docker
다음 Docker에게 해당 새 EBS 볼륨을 사용하여 이미지를 저장하도록 지시합니다.
docker가 이미지를 저장하는 디렉터리를 기본 디렉터리 대신 변경하려면 /var/lib/docker
docker 데몬을 시작할 때 -g 옵션을 사용하세요.
바라보다:도커 이미지 설치 디렉터리를 변경하는 방법기본 Docker 작업 경로를 변경하는 방법에 대한 자세한 내용입니다.
답변2
Amazon Linux 버전은 장치 매퍼를 Docker 스토리지 드라이버로 사용합니다. 장치 매퍼는 계층적 쓰기 시 복사 블록 장치를 컨테이너에 사용합니다. 데이터가 기록되지 않을 때는 디스크 공간을 거의 사용하지 않습니다. 파일 시스템의 페이지가 기록되면 장치 매퍼에서 데이터를 할당하고 디스크 공간을 사용하기 시작합니다.
장치 매퍼의 기본 디스크 크기는 10GB이므로 6개의 이미지를 실행할 때 모든 페이지를 쓰면 60GB가 필요할 수 있습니다. 모든 페이지를 쓰는 것은 불가능하지만, 기본 EC2 인스턴스에는 8GB만 있어서 부족합니다.
파일이 기록되면 여러 블록에 기록됩니다. 블록이 아직 작성되지 않은 경우 장치 풀에서 할당됩니다. 파일이 삭제되면 해당 블록은 파일 시스템에서 사용되지 않은 것으로 표시되지만 풀은 이를 알지 못합니다. 경우에만퍼스트림실행 후 파일 시스템은 장치 관리자에서 페이지를 해제합니다.
NGINX는 /tmp/cache에 캐시를 유지하고 여기에 지속적으로 씁니다. 파일 시스템이 계속해서 다른 블록을 사용하는 경우 10GB가 모두 장치 관리자에 매핑될 때까지 계속해서 블록을 할당합니다. 이 문제에 대한 몇 가지 해결 방법이 있습니다.
- 모든 블록을 수용할 수 있을 만큼 큰 장치 매퍼 장치를 사용하십시오.
- 이미지가 10GB에 도달하지 않도록 더 작은 기본 크기(dm.basesize 검색)를 사용하세요.
- AUFS 저장소를 사용하는 배포판으로 전환하세요.
당신은 또한 실행할 수 있습니다퍼스트림해제된 블록이 풀로 반환되는지 정기적으로 확인하세요. 최대 로드 중에는 자주 실행되지 않고 풀에 여전히 디스크 공간이 부족할 수 있으므로 까다로울 수 있습니다.