# Dùng Docker image riêng trên GPU cloud: quy tắc, CUDA và dung lượng image

URL: https://cloudj.net/vi/blog/custom-docker-image-gpu
Published: 2026-11-12 · Updated: 2026-11-12

> Cách dùng Docker image riêng trên GPU cloud: chỉ registry công khai, yêu cầu cấp tài khoản, chọn bản CUDA hợp với driver của host, giảm dung lượng image và image bị chặn.

Ba template có sẵn đủ cho những bước đầu, nhưng sớm muộn các đội cũng muốn môi trường của riêng mình: cố định phiên bản thư viện, một bộ phần mềm phục vụ model, công cụ CI, hay một dự án cũ chỉ build được trong đúng một cấu hình. Dùng Docker image riêng trên GPU cloud của Cloudj cho phép bạn mang môi trường đó lên dưới dạng một image công khai. Bài viết giải thích các quy tắc, cách chọn base image CUDA chạy được với driver của host, vì sao dung lượng image quan trọng hơn bạn nghĩ, và làm gì khi image bị từ chối.

## Quy tắc với custom image trên Cloudj

Console có ba template: Ubuntu 22.04 + CUDA (SSH), PyTorch + JupyterLab, và **Custom image**. Với template cuối:

- **Chỉ image công khai.** Bạn nhập tham chiếu image công khai, ví dụ `pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime`. Registry riêng tư hay image trên máy cục bộ không được hỗ trợ, nên cũng không có chỗ nhập thông tin đăng nhập registry.
- **Cần cấp tài khoản cao hơn.** Custom image đòi hỏi cấp tài khoản cao hơn tài khoản mới. Nếu tùy chọn này chưa mở cho bạn, hãy liên hệ hỗ trợ Cloudj từ console.
- **Một số image bị chặn.** Console từ chối một số image nhất định. Nếu image của bạn bị từ chối, hãy chọn image khác hoặc tự build trên một base phổ biến.
- **Tính tiền và giới hạn như cũ.** Tính theo phút, dung lượng đĩa cố định lúc triển khai, mỗi máy có ngày hết hạn và không có SLA phần cứng.

Đừng để thông tin bí mật trong image công khai. API key, token và dữ liệu riêng phải nằm trong file môi trường hoặc tải về lúc chạy, tuyệt đối không nằm trong layer image mà ai cũng kéo về được. Đây là lỗi hay gặp khi đội nhỏ vội đẩy image lên Docker Hub.

## Chọn base CUDA mà driver của host hỗ trợ

Container mang theo thư viện CUDA runtime riêng, nhưng dùng driver NVIDIA của máy host. Mỗi driver hỗ trợ CUDA runtime tới một phiên bản nhất định. Nếu image cần CUDA mới hơn mức driver hỗ trợ, code GPU sẽ lỗi ngay lúc khởi động dù container vẫn chạy.

Quy tắc thực tế:

- **Đừng chạy theo CUDA mới nhất.** Chọn phiên bản CUDA mà framework của bạn thật sự cần. Một base CUDA 12.x hơi cũ hơn nhưng phổ biến sẽ chạy được trên nhiều host hơn bản phát hành mới nhất.
- **Kiểm tra driver sau khi triển khai.** Chạy `nvidia-smi`; phần đầu hiển thị phiên bản CUDA cao nhất mà driver hỗ trợ. CUDA trong image nên bằng hoặc thấp hơn con số đó.
- **Mỗi host một khác.** Mỗi máy trong danh sách là một máy độc lập, nên driver khác nhau. Triển khai lại ở máy khác thì kiểm tra lại.
- **Ưu tiên image runtime thay vì devel**, trừ khi bạn biên dịch code CUDA trong container.

[Tài liệu tương thích CUDA](https://docs.nvidia.com/deploy/cuda-compatibility/) của NVIDIA giải thích mối quan hệ giữa phiên bản driver và runtime.

## Dung lượng image và thời gian khởi động

Trước khi container khởi động, host phải kéo image của bạn về. Image càng nặng càng lâu khởi động, trong khi instance vẫn đang tính tiền. Mỗi kết quả trong danh sách triển khai hiển thị tốc độ tải của máy theo Mbps, gợi ý khá tốt cho thời gian kéo image.

Cách giữ image gọn nhẹ:

| Cách làm | Vì sao có ích |
|---|---|
| Bắt đầu từ tag `runtime`, không phải `devel` | Image devel kèm trình biên dịch và header có thể bạn không cần |
| Dùng multi-stage build | Công cụ build nằm lại ở stage build |
| Không nhét trọng số model vào image | Tải trọng số vào ổ đĩa của instance lúc khởi động |
| Dọn cache trong cùng một layer | `apt-get clean` và `pip install --no-cache-dir` |
| Cố định phiên bản | Build tái lập được, ít phải build lại bất ngờ |

Trọng số model cần đặc biệt chú ý: một model vài chục GB nằm trong image nghĩa là mỗi lần triển khai lại phải kéo lại từ đầu. Hãy tính riêng dung lượng ổ đĩa cho trọng số, vì không tăng được sau này.

## Ví dụ tối giản

Một image nhỏ với base PyTorch cố định phiên bản và code của bạn:

```dockerfile
FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime
RUN apt-get update && apt-get install -y --no-install-recommends tmux git \
    && apt-get clean && rm -rf /var/lib/apt/lists/*
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY . /app
WORKDIR /app
```

Build và đẩy lên một repository công khai:

```bash
docker build -t yourname/gpu-app:1.0 .
docker run --rm --gpus all yourname/gpu-app:1.0 python -c "import torch; print(torch.cuda.is_available())"
docker push yourname/gpu-app:1.0
```

Chạy thử với `--gpus all` trên máy có GPU NVIDIA sẽ bắt được phần lớn lỗi trước khi bạn trả tiền cho instance trên cloud. Nếu mới làm quen Docker, bài [cài Docker trên VPS](https://cloudj.net/vi/blog/install-docker-vps) là chỗ tốt để tập build image, còn [tài liệu Docker](https://docs.docker.com/build/building/multi-stage/) nói kỹ về multi-stage build. Từ Việt Nam, đẩy image nặng lên Docker Hub có thể mất khá lâu với tốc độ upload mạng gia đình, thêm một lý do để giữ image gọn.

Sau đó, trên [trang triển khai GPU](https://app.cloudj.net/deploy/gpu), chọn máy, chọn template Custom image, nhập `yourname/gpu-app:1.0`, chọn dung lượng ổ đĩa và SSH key, rồi triển khai. Trang instance hiển thị trạng thái và những dòng log cuối của container, là nơi đầu tiên cần xem nếu image không khởi động.

## Khi nào custom image đáng công sức

- **Bộ phần mềm phục vụ model.** Một image vLLM hay phần mềm khác cố định phiên bản giúp khỏi cài lại mỗi lần triển khai; bài [dựng vLLM inference server tại Mỹ](https://cloudj.net/vi/blog/vllm-inference-server-usa) bàn cả cách cài bằng pip lẫn dùng image.
- **CI cho code ML.** Một image cố định giúp các lượt test trên GPU tái lập được; bài [GPU CI runner cho kiểm thử ML](https://cloudj.net/vi/blog/gpu-ci-runner-ml-tests) xây dựng trên ý này.
- **Dự án cũ** cần đúng bộ công cụ đời cũ.

Khi nào không đáng: để khám phá, thử nghiệm, template PyTorch + JupyterLab nhanh hơn. Bài [chạy PyTorch với template Jupyter](https://cloudj.net/vi/blog/run-pytorch-jupyter-template) hướng dẫn cách này.

## Xử lý sự cố

| Hiện tượng | Nguyên nhân có thể | Cách xử lý |
|---|---|---|
| Console từ chối image | Image riêng tư, gõ sai, hoặc image bị chặn | Chuyển sang công khai, kiểm tra tham chiếu, hoặc dùng base khác |
| Chờ rất lâu mới khởi động | Image nặng, host tải chậm | Làm gọn image; chọn host có tốc độ tải cao hơn |
| `CUDA driver version is insufficient` | CUDA trong image mới hơn driver của host | Dùng base CUDA cũ hơn |
| Container thoát ngay | Lệnh của image kết thúc lập tức | Xem log trên trang instance và chạy thử trên máy cục bộ |

## Câu hỏi thường gặp

### Có dùng registry riêng tư được không?

Không. Chỉ hỗ trợ image công khai.

### Vì sao tôi không chọn được Custom image?

Tùy chọn này cần cấp tài khoản cao hơn. Liên hệ hỗ trợ Cloudj từ console.

### Image nên dùng CUDA phiên bản nào?

Phiên bản framework của bạn cần, và không vượt quá mức driver của host hỗ trợ. Kiểm tra bằng `nvidia-smi`.

### Có nên để trọng số model trong image không?

Thường là không. Hãy tải về ổ đĩa của instance, dung lượng đã tính từ lúc triển khai.

## Bước tiếp theo

Build và chạy thử image trên máy của bạn, đẩy lên repository công khai, rồi mở [trang triển khai GPU](https://app.cloudj.net/deploy/gpu) và triển khai bằng template Custom image. Tiền thuê trừ theo phút từ số dư tài khoản nạp bằng chuyển khoản VND. Giá "từ" theo thời gian thực của mọi mẫu có trên [GPU cloud](https://cloudj.net/vi/gpu-cloud).
