在使用 VPS 或公有云虚拟机搭建服务时,Docker 和 Docker Compose 是常用的部署工具。然而,如果不注意清理,Docker 留下的持久化卷(Volume)会迅速占用大量的磁盘空间,尤其是数据库或日志相关的卷。本文将详细指导您如何安全、彻底地清理 Docker Compose 创建和遗留的持久化卷。
准备工作
您需要一个使用 Docker Compose 部署的项目。我们以一个简单的 PostgreSQL 数据库服务为例,它定义了一个名为 postgres_data 的卷来存储数据。
示例 **docker-compose.yml 文件:**
version: '3.8'
services:
db:
image: postgres:14
container_name: my_db_container
restart: always
volumes:
# 绑定到下面的具名卷
- postgres_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: mysecretpassword
volumes:
postgres_data:
# 设置卷的驱动和配置,这里使用默认设置
首先,运行服务并创建数据卷:
docker-compose up -d
运行后,您可以通过以下命令查看已创建的卷(假设项目目录名为 myproject):
docker volume ls | grep myproject
# 可能会看到类似:myproject_postgres_data
步骤一:使用 down -v 清理当前项目的卷(推荐)
清理 Docker Compose 部署的项目时,最安全且推荐的方式是使用 docker-compose down 命令,并添加 -v 或 –volumes 参数。
这个命令的作用是:停止并移除容器、移除网络,同时移除 Compose 文件中明确定义的具名卷(Named Volumes)。
注意: 只有在 docker-compose.yml 文件中显式声明的卷才会被这个命令移除。这通常是你想要移除的数据卷。
执行清理命令
进入您的项目目录,执行:
docker-compose down -v
输出示例:
Stopping my_db_container ... done
Removing my_db_container ... done
Removing network myproject_default
Removing volume myproject_postgres_data
通过再次检查卷列表,您会发现 myproject_postgres_data 卷已经被删除,磁盘空间得到释放。
步骤二:清理悬空卷(Dangling Volumes)
有时,由于操作失误或容器崩溃,系统可能会残留一些悬空卷(Dangling Volumes)。悬空卷是指那些不再被任何容器引用的匿名卷(Anonymous Volumes)。虽然 docker-compose down -v 已经处理了具名卷,但清理悬空卷对于维护磁盘空间至关重要。
查找悬空卷
您可以使用过滤器找到这些未被使用的卷:
docker volume ls -f dangling=true
批量清理悬空卷
使用 docker volume prune 命令可以一键清理所有悬空卷。此操作是安全的,因为它只删除没有容器引用的卷。
docker volume prune
系统会提示您确认操作:
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 1.5GB
如果您想跳过确认步骤,直接清理(适合脚本自动化):
docker volume prune -f
步骤三:手动移除特定具名卷
如果您不使用 docker-compose down -v,而是手动停止容器,那么卷会保留下来。如果您想移除一个特定的具名卷(例如,您的项目名为 myproject,卷名为 postgres_data),您需要先确定其全名,然后使用 docker volume rm。
- 确定卷的全名:
docker volume ls | grep postgres_data # 假设全名为 myproject_postgres_data - 移除卷:
docker volume rm myproject_postgres_data
重要提示: 在执行 docker volume rm 之前,请确保没有任何容器正在使用这个卷,否则命令会失败。
汤不热吧