openEuler系统迁移 Docker 数据目录到 /home,解决Docker 临时文件占用大问题

根据错误信息 write /var/lib/docker/tmp/...: no space left on device,问题的根源是 根分区(/)的磁盘空间不足 ,而非 /home 分区的问题。以下是详细解释和解决方案:


问题原因分析

  1. Docker 临时文件占用根分区空间

    • docker save 命令在导出镜像时,会先将镜像数据暂存到 /var/lib/docker/tmp 目录(属于根分区 /)。
    • 即使你的目标路径 /home 有 2TB 空间,但临时文件的写入路径 /var/lib/docker/tmp 所在的根分区空间不足,导出操作仍会失败。
  2. 根分区空间不足

    • 根据之前的 df -h 输出:

      bash 复制代码
      /dev/mapper/openeuler-root   69G   60G  5.8G   92% / 

      根分区只剩 5.8G 空间,远小于需要导出的镜像大小(21.3GB),导致临时文件无法写入。


解决方案

方法:迁移 Docker 数据目录到 /home

如果根分区空间无法释放足够空间,必须将 Docker 数据目录迁移到 /home 分区 ,这样 docker save 的临时文件也会在 /home 下生成。

步骤如下
  1. 停止 Docker 服务

    bash 复制代码
    sudo systemctl stop docker
  2. 创建新数据目录(如 /home/docker

    bash 复制代码
    sudo mkdir -p /home/docker
    sudo chown -R root:root /home/docker
  3. 迁移现有数据

    bash 复制代码
    # 将旧数据复制到新目录(可能需要时间)
    sudo rsync -avz /var/lib/docker/ /home/docker/
  4. 配置 Docker 使用新目录

    bash 复制代码
    # 创建 Docker 守护进程配置文件
    sudo mkdir -p /etc/systemd/system/docker.service.d/
    sudo tee /etc/systemd/system/docker.service.d/devicemapper.conf <<EOF
    [Service]
    ExecStart=
    ExecStart=/usr/bin/dockerd --graph=/home/docker
    EOF
  5. 重启 Docker 服务

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl start docker
    sudo systemctl enable docker

注意:启动docker出现了个错误

解决方法:

bash 复制代码
sudo vim /etc/systemd/system/docker.service.d/devicemapper.conf
bash 复制代码
修改前的错误配置:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --graph=/home/docker
bash 复制代码
修改后的正确配置:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --data-root=/home/docker

重启

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart docker

确认 Docker 数据目录已正确指向 /home/docker:

bash 复制代码
sudo docker info | grep "Docker Root Dir"

输出应为:Docker Root Dir: /home/docker

  1. 删除旧数据(可选)

    bash 复制代码
    sudo rm -rf /var/lib/docker

注意事项

  1. 临时文件空间需求

    • docker save 需要额外的临时空间,因此即使 /home 有 2TB,根分区仍需至少 镜像大小的 1.5 倍 空间(如果未迁移数据目录)。
  2. 迁移后的路径权限

    • 确保 /home/docker 的权限正确:

      bash 复制代码
      sudo chown -R root:root /home/docker
      sudo chmod 755 /home/docker
  3. 日志文件清理

    • 如果容器日志占用空间,可以清理日志:

      bash 复制代码
      # 清理所有容器日志
      sudo find /var/lib/docker/containers/ -name "*.log" -exec truncate -s 0 {} \;

验证操作成功

  1. 检查根分区空间

    bash 复制代码
    df -h /
    # 确保根分区使用率 < 90%
  2. 我重新尝试导出

    bash 复制代码
    docker save -o /home/mis-tei-6.0.0-300I-Duo-aarch64.tar swr.cn-south-1.myhuaweicloud.com/ascendhub/mis-tei:6.0.0-300I-Duo-aarch64

成功


总结

  • 根本原因/var/lib/docker/tmp 所在的根分区空间不足。
  • 解决方案 :清理根分区或迁移 Docker 数据目录到 /home
  • 长期建议:定期清理 Docker 资源,并监控磁盘使用情况。

如果问题仍未解决,请提供更多以下信息:

  • docker system df 输出(查看镜像占用情况)。
  • df -h /var/lib/docker(确认数据目录空间)。
  • Docker 版本:docker --version
相关推荐
木雷坞2 小时前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
萧行之4 小时前
Docker部署Loki+Grafana+Vector实现全服务器日志监控(含N8N/SSH/Fail2ban监控)
服务器·docker·grafana
人工智能培训5 小时前
工程科研中的AI应用:结构力学分析技巧
人工智能·深度学习·机器学习·docker·容器
计算机安禾5 小时前
【Linux从入门到精通】第35篇:容器化技术预备——Docker安装与基本概念
linux·运维·docker
子木HAPPY阳VIP5 小时前
信创UOS,Docker 完整操作部署(Dockerfile部署方式)&排错整合
linux·运维·redis·nginx·docker·容器·tomcat
AOwhisky6 小时前
Kubernetes调度与服务暴露:从“定时任务”到“服务发现”的完全指南
linux·运维·云原生·容器·kubernetes·服务发现
Cyber4K6 小时前
【Kubernetes专项】温故而知新,重温技术原理(6)
云原生·容器·kubernetes
AI服务老曹7 小时前
架构实战:基于 GB28181 与 RTSP 的异构设备统一接入方案,深度解析 Docker 化 AI 视频管理平台
人工智能·docker·架构
叶总没有会7 小时前
Docker:项目部署
运维·docker·容器
爱学习 爱分享7 小时前
docker 本地装瀚高 4.5 数据库
数据库·docker·容器