呼吸空间:扩展您的 AWS EC2 存储,实现平稳的 Docker 部署
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 卷
该过程包括两个主要步骤:
- 告诉 AWS 分配更多“硬件”空间(修改 EBS 卷)。
- 告诉 Linux 识别并使用这块新空间(扩展分区并调整文件系统大小)。
第 1 部分 – 在 AWS 控制台中增大卷大小
- 登录 AWS Management Console。
- 前往 EC2 → Elastic Block Store → Volumes。
- 选中附加到正在运行的 EC2 实例的 EBS 卷(通常以实例 ID 或名称标记)。
- 点击 Actions → Modify Volume。
- 在弹出对话框中,将 Size 改为所需的新大小(例如,从 8 GiB 改为 20 GiB)。
- 点击 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 上看到已增加的容量。
摘要
- 在 AWS 控制台中调整 EBS 卷的大小。
- 使用
growpart扩展分区。 - 使用
resize2fs调整文件系统大小。 - 用
df -h验证新空间。 - 实现自动化的 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+O、Enter、Ctrl+X)。
结论
通过遵循这些步骤,您已经:
- 扩展了 EC2 实例的存储。
- 实施了稳健的维护策略,自动删除未使用的 Docker 资源和旧的系统日志。
您的 Sioux Web App 现在可以高效运行,不会再受到磁盘空间耗尽的持续威胁,为用户提供更稳定可靠的体验。