Установите Docker Engine
Установите Docker Engine из собственного репозитория Docker, как описано в документации Docker:
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker run --rm hello-world
Чтобы запускать docker без sudo, добавьте своего пользователя в группу docker (sudo usermod -aG docker $USER, затем войдите в систему снова). Членство в этой группе равносильно root-доступу на сервере, поэтому давайте его только тем, у кого уже есть sudo.
Установка NVIDIA Container Toolkit
Этот инструмент позволяет контейнерам использовать драйвер NVIDIA хоста. Сначала установите драйвер на хосте (Драйверы NVIDIA и CUDA); тогда контейнерам не нужен собственный драйвер.
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
| sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
| sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
| sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker # добавляет runtime nvidia в /etc/docker/daemon.json
sudo systemctl restart docker
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
Выберите GPU для каждого контейнера:
docker run --rm --gpus all ubuntu nvidia-smi -L
docker run --rm --gpus '"device=0,1"' ubuntu nvidia-smi -L # только GPU 0 и 1
Этот инструмент монтирует библиотеки драйвера хоста внутрь контейнера, поэтому версия CUDA внутри образа должна поддерживаться драйвером хоста (версия CUDA, которую показывает nvidia-smi). Подробности установки: руководство по NVIDIA Container Toolkit.
Образы NVIDIA NGC
Каталог NGC от NVIDIA публикует образы для PyTorch, Triton Inference Server, TensorRT-LLM и других инструментов, с тегами по релизам (YY.MM). Публичные образы скачиваются без аккаунта.
docker pull nvcr.io/nvidia/pytorch:<yy.mm>-py3
docker run --rm -it --gpus all --ipc=host \
--ulimit memlock=-1 --ulimit stack=67108864 \
-v /data:/workspace/data \
nvcr.io/nvidia/pytorch:<yy.mm>-py3
Флаг --ipc=host и два флага --ulimit — то, что NVIDIA рекомендует для своих контейнеров с фреймворками: загрузчики данных PyTorch используют разделяемую память, а значение по умолчанию в Docker — всего 64 МБ. Каждый релиз собирается под конкретную версию CUDA; перед выбором тега сверьте её со своим драйвером по таблице совместимости фреймворков. Для закрытого контента выполните docker login nvcr.io, указав в качестве имени пользователя $oauthtoken и API-ключ NGC в качестве пароля.
Контейнеры ROCm на MI355X
Контейнерам ROCm не нужен дополнительный runtime: достаточно передать устройства AMD. Сначала установите драйвер ядра на хосте (ROCm на MI355X).
docker run -it --rm \
--device=/dev/kfd --device=/dev/dri \
--group-add video --ipc=host \
--cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
-v /data:/data \
rocm/pytorch:latest
Чтобы ограничить контейнер отдельными GPU, вместо /dev/dri передавайте конкретные render-узлы (--device=/dev/dri/renderD128 и так далее). Container Toolkit от AMD делает это сопоставление за вас: установите пакет amd-container-toolkit из репозитория AMD, выполните sudo amd-ctk runtime configure, перезапустите Docker, а затем выбирайте GPU по индексу:
docker run --rm --runtime=amd -e AMD_VISIBLE_DEVICES=0,1 rocm/dev-ubuntu-24.04 amd-smi list
На MI355X используйте образы, собранные для ROCm 7.0 или новее.
GPU в Docker Compose
Compose резервирует GPU NVIDIA через deploy.resources. Этот файл запускает vLLM на всех GPU, с кэшем модели на NVMe и API, опубликованным только на localhost:
# compose.yaml
services:
vllm:
image: vllm/vllm-openai:latest
command: ["--model", "Qwen/Qwen3-4B", "--max-model-len", "8192"]
environment:
- VLLM_API_KEY=${VLLM_API_KEY}
- HF_TOKEN=${HF_TOKEN}
volumes:
- /data/hf:/root/.cache/huggingface
ports:
- "127.0.0.1:8000:8000"
ipc: host
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all # или: device_ids: ["0", "1"]
capabilities: [gpu]
export VLLM_API_KEY=$(openssl rand -hex 32)
docker compose up -d
docker compose logs -f vllm
count и device_ids взаимно исключают друг друга, а capabilities обязателен (поддержка GPU в Compose). На MI355X вместо этого указывайте устройства:
services:
rocm:
image: rocm/pytorch:latest
command: sleep infinity
devices:
- /dev/kfd
- /dev/dri
group_add:
- video
ipc: host
cap_add:
- SYS_PTRACE
security_opt:
- seccomp=unconfined
volumes:
- /data:/dataХраните данные и образы на локальном NVMe
Контейнеры одноразовые; ваши данные не должны храниться внутри них. Монтируйте каталоги с NVMe-диска для данных (см. Хранилище и данные) и держите там же кэши моделей:
docker run --rm -it --gpus all \
-v /data/datasets:/datasets:ro \
-v /data/checkpoints:/checkpoints \
-v /data/hf:/root/.cache/huggingface \
nvcr.io/nvidia/pytorch:<yy.mm>-py3
Образы и именованные тома хранятся в каталоге данных Docker, по умолчанию это /var/lib/docker. Если системный диск маленький, перенесите его на диск для данных:
sudo systemctl stop docker docker.socket
sudo mkdir -p /data/docker
sudo rsync -aHAX /var/lib/docker/ /data/docker/
sudo nano /etc/docker/daemon.json # добавьте "data-root" и сохраните запись "runtimes"
sudo systemctl start docker
docker info --format '{{ .DockerRootDir }}'
{
"data-root": "/data/docker",
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
Проверяйте место с помощью docker system df и очищайте с помощью docker image prune. Всё на сервере, включая тома Docker, стирается при завершении срока без продления: храните копию важных данных где-то ещё.
Порты, пользователи и файрвол
- Docker публикует порты через собственные правила файрвола, раньше, чем трафик увидит ufw (заметки Docker о файрволе). Контейнер, запущенный с
-p 8000:8000, доступен из интернета, даже если ufw блокирует порт 8000. Публикуйте порт на loopback-адресе,-p 127.0.0.1:8000:8000, а к сервису обращайтесь через SSH-туннель или обратный прокси (см. Инференс-сервер). - Группа
dockerравносильна root: кто может запускать контейнеры, может смонтировать файловую систему хоста. - Закрепляйте теги образов за конкретной версией, а не за
latest, чтобы пересборка не меняла ваш стек без предупреждения.
Нужна помощь с этим руководством?
Расскажите нам о своём GPU, командах, которые вы выполнили, и результате, который получили, через форму обратной связи.
