服务器磁盘报警,一查是 docker 镜像堆了上百 GB,构建了一半的、被新版本顶掉的旧镜像全赖在盘上。镜像管理平时不起眼,爆盘的时候才知道疼。
先把现状摸清楚
docker images
docker system df
第一条列出本机全部镜像,第二条能看镜像、容器、卷各占了多少空间。顺手记下哪个镜像在跑哪个服务,清理时心里有数。TAG 显示 none 的是悬空镜像,一般是被新版本顶掉的旧层,删掉不影响运行中的容器。
清理和删除
docker rmi 镜像名:tag
docker image prune
docker system prune
prune 系列是懒人清理:docker image prune 清悬空镜像,加 -a 连没被容器引用的镜像一起清。镜像删不掉,多半是有容器在引用,先 docker ps -a 看有没有停止状态的容器占着,清掉容器再删镜像就顺了。动手前确认重要镜像在仓库有备份,本地删了还能拉回来,不然就是真丢了。
拉取慢就配加速器
国内拉 Docker Hub 的镜像,超时是家常便饭。一般做法是在 daemon.json 里配镜像加速地址,改完 systemctl restart docker 生效。加速地址换得比较勤,用哪家就查哪家的当前说明,别照抄老帖子里的地址。
构建镜像的两个好习惯
Dockerfile 里把不常变的步骤放前面,比如先 COPY 依赖清单再装依赖,这样改代码重新构建能吃到缓存,快很多。另外给镜像打明确的版本 tag,别全押在 latest 上,回滚的时候你才知道哪个版本对应哪次上线。服务类项目用多阶段构建,把编译工具留在中间层,最终镜像能小一半以上。
别把敏感信息烧进镜像
密码、密钥这类东西不要用 ENV 写进 Dockerfile,镜像一旦推上仓库,谁拉到谁看见,历史层里都留着,删也删不干净。正确做法是运行时注入环境变量,或者挂载配置文件,镜像里只留代码和运行环境。