
Docker用久了两大顽疾:拉镜像慢得像挂了,以及/var/lib/docker目录悄悄吃掉几十G直到磁盘写满、整站报错。这两件事都有标准解法,十分钟配完。
先说拉取慢。Docker Hub在国内直连基本不可用,需要配镜像加速器。各家云厂商都提供免费加速地址,阿里云的控制台里有一串专属地址,填到daemon.json里。
# /etc/docker/daemon.json
{
"registry-mirrors": [
"https://你的加速地址.mirror.aliyuncs.com",
"https://docker.m.daocloud.io"
]
}
# 重载配置
systemctl daemon-reload
systemctl restart docker
# 验证加速器已生效
docker info | grep -A3 Mirrors
镜像源会失效是常态,配两三个备着,拉取时Docker会自动切换。要是加速地址也全挂了,还有个土办法:在能访问的机器上docker pull再docker save导出,scp传过来docker load导入,应急够用。
再说磁盘。Docker吃空间的大头是三层东西:悬空镜像(dangling,构建中间产物)、停掉的容器、构建缓存。docker system df先看各占多少,心里有数再动手。
docker system df # 空间总览
docker image prune -f # 清悬空镜像
docker container prune -f # 清停掉的容器
docker builder prune -f # 清构建缓存
docker system prune -f # 三合一,一条搞定
# 慎用:docker system prune -a --volumes
# 带-a清所有未使用镜像,带--volumes连卷一起删,数据库卷会没
清理命令里最危险的就是--volumes参数,它删的是没被容器引用的数据卷,而你的MySQL数据要是容器停着没引用,一样会被当垃圾清掉。动这个参数前,先docker volume ls过一遍,确认没有存数据的卷。
长效方案是把清理写进cron,每周日凌晨自动跑prune,再配个磁盘占用告警(之前写过的Uptime Kuma或者云监控都行),85%就报警。别等磁盘写满网站500了才想起来Docker还会吃空间。
数据来源:Docker官方文档
A5创业网 版权所有