玩客云本身只有8G空间,有了docker之后不够用了。需要把docker转移到别的地方。

盒子类emmc空间较小,
在类似环境部署 Docker 时,建议:

  • 提前将 Docker 和 containerd 的数据目录都指向大容量分区
  • 监控根分区使用率,避免达到 90%
  • 定期清理日志和缓存

docker迁移

docker info | grep "Docker Root Dir"
默认在/var/lib/docker
systemctl stop docker
mv /var/lib/docker /data/docker
ln -sf /data/docker /var/lib/docker
现在使用修改配置文件的方法
nano /etc/docker/daemon.json

1
2
3
4
5
6
7
8
9
10
11
{
"data-root": "/data/docker",
"registry-mirrors": [
"https://docker.1ms.run"
],
"proxies": {
"http-proxy": "http://proxy.example.com:8080",
"https-proxy": "http://proxy.example.com:8080",
"no-proxy": "localhost,127.0.0.1"
}
}

设置data-root指向新目录。
rsync -avxP /var/lib/docker /data/docker
重启docker
systemctl start docker

containerd迁移

containerd 数据目录要随 Docker 数据目录一起迁移到数据盘。
使用软链接将 /var/lib/containerd 重定向到 /data/containerd。
方法同上。

rsync -avxP /var/lib/containerd/ /data/containerd/
修改 containerd 的配置文件 config.toml
nano /etc/containerd/config.toml
在文件中找到 root = “/var/lib/containerd” 这一行,将路径改为新存储路径下的一个专门目录(注意:不要直接指向 data-root 的路径)

1
2
3
version = 2
# 修改为新路径,例如 /data/containerd
root = "/data/containerd"

systemctl restart containerd

新问题

因为新目录在新磁盘上,需要在docker和containerd启动前挂载。

  1. 优化 fstab(减少 TF 卡写入)
    fstab里挂载命令改成:
    UUID="b6a8837a-83fc-443c-8815-db2c4f85feec" /disk1 ext4 defaults,noatime,nofail,x-systemd.device-timeout=30s 0 0
1
2
3
sed -i 's|/disk1 ext4 defaults 0 0|/disk1 ext4 defaults,noatime,nofail,x-systemd.device-timeout=30s 0 0|' /etc/fstab
systemctl daemon-reload
mount -o remount /disk1
  1. 配置 systemd 依赖(防止重启抢跑)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    mkdir -p /etc/systemd/system/containerd.service.d
    tee /etc/systemd/system/containerd.service.d/override.conf > /dev/null << 'EOF'
    [Unit]
    After=disk1.mount
    Requires=disk1.mount
    EOF

    mkdir -p /etc/systemd/system/docker.service.d
    tee /etc/systemd/system/docker.service.d/override.conf > /dev/null << 'EOF'
    [Unit]
    After=disk1.mount
    Requires=disk1.mount
    EOF

    systemctl daemon-reload
  2. 验证
1
2
systemctl show docker.service | grep -E "Requires|After" | grep disk1
systemctl show containerd.service | grep -E "Requires|After" | grep disk1

现在架构就非常完美了:系统跑在 eMMC 上,Docker 数据跑在 TF 卡上,既保护了 eMMC 寿命,又用大容量 TF 卡装下了 Docker 数据。重启后也不会抢跑。😊