# docker-move-data-root

## Hướng dẫn chuyển Docker `data-root` sang `/mnt/e02/uenv/var/lib/docker`

### 1. Dừng Docker

Trước khi di chuyển dữ liệu cần dừng Docker để tránh lỗi filesystem.

```
sudo systemctl stop docker
```

Kiểm tra đã dừng:

```
sudo systemctl status docker
```

***

### 2. Tạo thư mục data-root mới

```
sudo mkdir -p /mnt/e02/uenv/var/lib/docker
```

***

### 3. Copy toàn bộ dữ liệu Docker hiện tại

Sử dụng `rsync` để giữ nguyên permission, link và metadata.

```
sudo rsync -aP /var/lib/docker/ /mnt/e02/uenv/var/lib/docker/
```

Giải thích:

* `-a` giữ nguyên quyền
* `-P` hiển thị progress
* dấu `/` cuối thư mục rất quan trọng

***

### 4. Cấu hình Docker dùng data-root mới

Mở file cấu hình:

```
sudo nano /etc/docker/daemon.json
```

Thêm hoặc chỉnh thành:

```
{
  "data-root": "/mnt/e02/uenv/var/lib/docker"
}
```

Nếu file đã có cấu hình khác, chỉ cần thêm `"data-root"` vào trong `{}`.

***

### 5. Khởi động lại Docker

```
sudo systemctl daemon-reexec
sudo systemctl start docker
```

***

### 6. Kiểm tra Docker đã dùng data-root mới

```
docker info | grep "Docker Root Dir"
```

Kết quả mong muốn:

```
Docker Root Dir: /mnt/e02/uenv/var/lib/docker
```

***

### 7. Kiểm tra container

```
docker ps -a
```

Nếu container và image vẫn còn đầy đủ thì việc chuyển thành công.

***

### 8. (Tùy chọn) Xóa dữ liệu cũ

Sau khi chạy ổn định, bạn có thể xóa thư mục cũ để giải phóng dung lượng.

```
sudo rm -rf /var/lib/docker
```

***

### Kết quả sau khi chuyển

Docker sẽ ghi dữ liệu vào:

```
/mnt/e02/uenv/var/lib/docker/
```

Các thư mục bên trong gồm:

```
overlay2
containers
image
volumes
network
buildkit
```

Các mount overlay kiểu bạn thấy trước đó:

```
/var/lib/docker/rootfs/overlayfs/...
```

sẽ chuyển thành:

```
/mnt/e02/uenv/var/lib/docker/rootfs/overlayfs/...
```

***

💡 **Khuyến nghị thêm cho server chạy Docker nhiều container**

Ổ `/mnt/e02` của bạn còn \~297GB nên rất phù hợp. Tuy nhiên nên kiểm tra filesystem:

```
df -Th /mnt/e02
```

Docker **tốt nhất chạy trên ext4 hoặc xfs**.

### Scripts `01_docker_move_data_root.sh`

{% code title="01\_docker\_move\_data\_root.sh" overflow="wrap" lineNumbers="true" %}

```bash
#!/bin/bash

# Thư mục Docker cũ và mới
OLD_DOCKER="/var/lib/docker"
NEW_DOCKER="/mnt/e02/uenv/var/lib/docker"

echo "⚠️ Dừng tất cả container Docker..."
sudo docker stop $(sudo docker ps -q) 2>/dev/null

echo "📁 Tạo thư mục Docker mới nếu chưa có..."
sudo mkdir -p "$NEW_DOCKER"

echo "🔄 Sao chép dữ liệu Docker cũ sang thư mục mới..."
sudo rsync -aP "$OLD_DOCKER/" "$NEW_DOCKER/"

echo "📝 Cập nhật /etc/docker/daemon.json..."
# Nếu file daemon.json chưa có, tạo mới
if [ ! -f /etc/docker/daemon.json ]; then
    sudo bash -c "echo '{\"data-root\": \"$NEW_DOCKER\"}' > /etc/docker/daemon.json"
else
    # Nếu đã có nội dung, sửa hoặc thêm data-root
    sudo jq --arg newroot "$NEW_DOCKER" '. + { "data-root": $newroot }' /etc/docker/daemon.json | sudo tee /etc/docker/daemon.json > /dev/null
fi

echo "🔁 Khởi động lại Docker..."
sudo systemctl daemon-reload
sudo systemctl restart docker

echo "✅ Hoàn tất!"
echo "Docker root mới là:"
docker info | grep "Docker Root Dir"

```

{% endcode %}
