Docker 镜像存储在宿主机的什么位置?
Linux 上 Docker 镜像默认存 /var/lib/docker(overlay2 分层目录),用 docker info 查 Docker Root Dir 确认;Mac/Windows 的 Docker Desktop 存在虚拟机磁盘文件里。本文给出各平台位置与迁移方法。
快速查询:运行 docker info,输出里的 Docker Root Dir 就是镜像与容器的存储根目录(Linux 默认 /var/lib/docker),Storage Driver(通常是 overlay2)决定分层组织方式。Mac/Windows 的 Docker Desktop 因为跑在虚拟机里,数据在 VM 磁盘文件中(Mac:~/Library/Containers/com.docker.docker/Data/,Windows:C:\ProgramData\DockerDesktop 及 WSL2 的 vhdx)。
各平台默认位置
| 平台 | 位置 |
|---|---|
| Ubuntu/Debian/Fedora/CentOS | /var/lib/docker/ |
| macOS(Docker Desktop) | ~/Library/Containers/com.docker.docker/Data/vms/0/(VM 磁盘) |
| Windows(Docker Desktop) | C:\ProgramData\DockerDesktop(WSL2 后端在发行版 vhdx 内) |
Linux 目录结构速览
/var/lib/docker/
├── overlay2/ # 镜像层与容器层(大头)
├── volumes/ # 命名卷数据
├── containers/ # 容器配置与日志(json.log)
├── image/ # 镜像元数据
└── buildkit/ # 构建缓存
提醒:这个目录归 Docker 守护进程管理,结构随版本变化——看可以,du 分析可以,别手动改/删里面任何文件,容易把守护进程搞坏。清理走 docker system prune。
查占用与清理
docker system df # 各类数据占用汇总
du -sh /var/lib/docker/* # 目录级占用(需 sudo)
docker system prune -a # 官方清理姿势
迁移到大磁盘
/var/lib/docker 撑爆系统盘是常见事故,迁到数据盘:
// /etc/docker/daemon.json
{ "data-root": "/data/docker" }
sudo systemctl stop docker
sudo rsync -aHAXS /var/lib/docker/ /data/docker/
sudo systemctl start docker
docker info | grep "Docker Root Dir" # 验证
观测云对照
Docker 存储目录重点监控。 /var/lib/docker 的磁盘水位、inode 用量由 DataKit 采集,监控器设阈值告警;容器日志无限增长这个最常见的撑爆原因,用日志轮转配置(log-opt)根治。
常见问题(FAQ)
Q:能直接把 /var/lib/docker 拷到另一台机器迁镜像吗?
A:不建议。跨机迁镜像用 docker save/load(见本系列《不用镜像仓库在主机间复制 Docker 镜像》),data-root 目录直拷易出一致性问题。
Q:overlay2 里的 diff 目录就是镜像内容吗?
A:是分层的各层内容,需要联合视图才是完整文件系统;手动翻这个目录意义不大,用 docker image inspect / export 更合适。
Q:Mac 上 VM 磁盘文件几十 G 正常吗?
A:Desktop 的虚拟磁盘只增不减(内部清了外部不缩),可在 Desktop 设置里 Reduce disk image size 或重置。