呼吸空间:扩展您的 AWS EC2 存储,实现平稳的 Docker 部署

发布: (2025年12月25日 GMT+8 21:05)
6 min read
原文: Dev.to

Source: Dev.to

问题:磁盘空间耗尽

您的 EC2 实例(尤其是使用默认 8 GB 时)很快会被以下内容占满:

  • Docker 镜像 – 每次 docker compose build 都会向镜像缓存中添加层。
  • 容器日志 – 即使是基础日志也可能增长到数 GB。
  • 数据库数据 – PostgreSQL 随着时间会占用更多空间。
  • 应用日志与缓存 – Django 的内部日志或任何缓存都可能累计。

当磁盘使用率达到 90 % 时,系统会变得不稳定。达到 100 % 时,服务器将无法正常工作。

确认问题:扩容前

检查当前磁盘状态。SSH 登录到 EC2 实例并运行:

df -h

示例输出(扩容前)

Filesystem      Size  Used Avail Use% Mounted on
/dev/root       6.8G  4.7G  2.1G  70% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
...

/dev/root 的使用率已达到令人担忧的 70 %,仅剩 2.1 GB。这对任何容器化的应用来说都是一个定时炸弹。

Source:

解决方案:扩展您的 EBS 卷

该过程包括两个主要步骤:

  1. 告诉 AWS 分配更多“硬件”空间(修改 EBS 卷)。
  2. 告诉 Linux 识别并使用这块新空间(扩展分区并调整文件系统大小)。

第 1 部分 – 在 AWS 控制台中增大卷大小

  1. 登录 AWS Management Console
  2. 前往 EC2 → Elastic Block Store → Volumes
  3. 选中附加到正在运行的 EC2 实例的 EBS 卷(通常以实例 ID 或名称标记)。
  4. 点击 Actions → Modify Volume
  5. 在弹出对话框中,将 Size 改为所需的新大小(例如,从 8 GiB 改为 20 GiB)。
  6. 点击 Modify 并确认。

AWS 将开始分配新空间。卷状态会从 modifying 变为 optimizing。在优化期间即可继续后续步骤——无需等到完成。

第 2 部分 – 在 Ubuntu 中扩展文件系统

即使 AWS 已经添加了更多空间,Ubuntu 仍在使用旧的分区大小。我们需要将主分区(/dev/root)扩展以填满新出现的空间。

验证新磁盘大小

lsblk

示例输出(AWS 修改后、系统扩展前)

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
...
nvme0n1     259:0    0   20G  0 disk          

扩展分区并调整文件系统大小

# Install cloud‑init tools if not present
sudo apt-get update && sudo apt-get install -y cloud-guest-utils

# Grow the partition (assumes /dev/nvme0n1p1; adjust if different)
sudo growpart /dev/nvme0n1 1

# Resize the filesystem (ext4)
sudo resize2fs /dev/nvme0n1p1

验证扩展结果

df -h

现在应该可以在 /dev/root 上看到已增加的容量。

摘要

  1. 在 AWS 控制台中调整 EBS 卷的大小
  2. 使用 growpart 扩展分区
  3. 使用 resize2fs 调整文件系统大小
  4. df -h 验证新空间
  5. 实现自动化的 Docker 清理,以防止将来出现磁盘空间紧张的情况。

按照这些步骤操作后,您在 EC2 上的 Django 应用将拥有足够的存储空间来容纳 Docker 构建、日志以及数据库的增长,同时清理例程能够确保环境随时间保持整洁。

Source:

Docker 与系统清理脚本

#!/bin/bash
# clean_docker.sh – Remove unused Docker resources and old journal logs

echo "Pruning Docker system (containers, images, build cache)..."
docker system prune -af

echo "Pruning Docker volumes..."
docker volume prune -f

echo "Cleaning up old system journal logs (older than 7 days)..."
sudo journalctl --vacuum-time=7d

echo "Disk cleanup complete."
df -h

1. 保存脚本

创建文件 ~/clean_docker.sh 并将上面的脚本粘贴进去。在 nano 中,使用以下方式保存并退出:

Ctrl+O  (Enter 确认)
Ctrl+X

2. 赋予脚本可执行权限

chmod +x ~/clean_docker.sh

3. 使用 Cron 定时运行

我们使用 cron 自动执行脚本,例如每周日午夜运行。

crontab -e

如果出现提示,选择 1 使用 nano。在文件最末尾添加以下行:

0 0 * * 0 /home/ubuntu/clean_docker.sh

说明

字段含义
0 0在 0 分钟的 0 小时(午夜)
* *每月的每一天、每个月
0星期的第 0 天(星期日)
/home/ubuntu/clean_docker.sh执行你的清理脚本

保存并退出(Ctrl+OEnterCtrl+X)。

结论

通过遵循这些步骤,您已经:

  • 扩展了 EC2 实例的存储。
  • 实施了稳健的维护策略,自动删除未使用的 Docker 资源和旧的系统日志。

您的 Sioux Web App 现在可以高效运行,不会再受到磁盘空间耗尽的持续威胁,为用户提供更稳定可靠的体验。

Back to Blog

相关文章

阅读更多 »

AWS AMI 跨区域复制和共享

概述:AWS AMI 跨区域复制和共享可以通过 AWS Management Console、CLI 或 SDK 执行。AMI 是区域特定的,因此它们必须是 c...