docker build -t oc9-ray:2.54.1 .
也可以通过构建参数指定 Ray 和 Torch 版本:
docker build \
--build-arg RAY_VERSION=2.54.1 \
--build-arg TORCH_VERSION=2.11.0 \
--build-arg TORCHVISION_VERSION=0.26.0 \
--build-arg TORCHAUDIO_VERSION=2.11.0 \
-t oc9-ray:2.54.1 .
单机模式会在当前容器内启动一个 Ray Head 节点,适合本地开发、单机测试、单机 GPU 任务。
docker run -d \
--gpus all \
--shm-size=8g \
--name oc9-ray-single \
-e RAY_NODE_TYPE=single \
-p 6379:6379 \
-p 8265:8265 \
-p 10001:10001 \
-p 8000:8000 \
oc9-ray:2.54.1
查看 Ray Dashboard:
http://宿主机IP:8265
进入容器:
docker exec -it oc9-ray-single bash
查看 Ray 集群状态:
ray status
Ray 多机集群由一个 Head 节点和多个 Worker 节点组成。
推荐使用 --network=host,避免 Docker bridge 网络导致 Ray 节点之间无法互相访问。
假设机器 IP 如下:
| 角色 | IP |
|---|---|
| Head 节点 | 192.168.1.10 |
| Worker 节点 1 | 192.168.1.11 |
| Worker 节点 2 | 192.168.1.12 |
在 192.168.1.10 上执行:
docker run -d \
--gpus all \
--network=host \
--shm-size=8g \
--name oc9-ray-head \
-e RAY_NODE_TYPE=head \
-e RAY_NODE_IP_ADDRESS=192.168.1.10 \
-e RAY_NUM_GPUS=1 \
oc9-ray:2.54.1
查看 Head 节点日志:
docker logs -f oc9-ray-head
查看 Dashboard:
http://192.168.1.10:8265
在 192.168.1.11 上执行:
docker run -d \
--gpus all \
--network=host \
--shm-size=8g \
--name oc9-ray-worker-1 \
-e RAY_NODE_TYPE=worker \
-e RAY_HEAD_ADDRESS=192.168.1.10:6379 \
-e RAY_NODE_IP_ADDRESS=192.168.1.11 \
-e RAY_NUM_GPUS=1 \
oc9-ray:2.54.1
在 192.168.1.12 上执行:
docker run -d \
--gpus all \
--network=host \
--shm-size=8g \
--name oc9-ray-worker-2 \
-e RAY_NODE_TYPE=worker \
-e RAY_HEAD_ADDRESS=192.168.1.10:6379 \
-e RAY_NODE_IP_ADDRESS=192.168.1.12 \
-e RAY_NUM_GPUS=1 \
oc9-ray:2.54.1
查看 Worker 节点日志:
docker logs -f oc9-ray-worker-1
docker logs -f oc9-ray-worker-2
docker run --rm \
--gpus all \
--shm-size=8g \
-e RAY_NODE_TYPE=test \
oc9-ray:2.54.1 \
python3 test_ray.py --full --require-gpu
docker exec -it oc9-ray-head bash
python3 /home/test_ray.py --address auto --full --require-gpu
python3 test_ray.py --address ray://192.168.1.10:10001 --full --require-gpu
| 端口 | 说明 |
|---|---|
| 6379 | Ray Head / GCS 端口 |
| 8265 | Ray Dashboard 端口 |
| 10001 | Ray Client 端口 |
| 8000 | Ray Serve HTTP 端口 |
| 8076 | Ray Node Manager 端口 |
| 8077 | Ray Object Manager 端口 |
| 8078 | Ray Runtime Env Agent 端口 |
| 8079 | Ray Dashboard Agent gRPC 端口 |
| 8080 | Ray Dashboard Agent HTTP 端口 |
| 8081 | Ray Metrics Export 端口 |
| 10002-10100 | Ray Worker 进程端口范围 |
| 环境变量 | 默认值 | 示例 | 说明 |
|---|---|---|---|
RAY_NODE_TYPE | single | head / worker / single / test | 容器启动模式。head 表示 Head 节点,worker 表示 Worker 节点,single 表示单机模式,test 表示执行测试脚本 |
RAY_HEAD_ADDRESS | 空 | 192.168.1.10:6379 | Worker 节点连接 Head 节点的地址。RAY_NODE_TYPE=worker 时必填 |
RAY_NODE_IP_ADDRESS | 自动获取 | 192.168.1.11 | 当前节点对其他 Ray 节点可访问的 IP。多机部署时建议显式指定 |
RAY_HEAD_PORT | 6379 | 6379 | Ray Head / GCS 监听端口 |
RAY_DASHBOARD_HOST | 0.0.0.0 | 0.0.0.0 | Ray Dashboard 监听地址。容器中建议设置为 0.0.0.0 |
RAY_DASHBOARD_PORT | 8265 | 8265 | Ray Dashboard 端口 |
RAY_CLIENT_SERVER_PORT | 10001 | 10001 | Ray Client 连接端口 |
RAY_SERVE_HTTP_PORT | 8000 | 8000 | Ray Serve HTTP 服务端口 |
RAY_NODE_MANAGER_PORT | 8076 | 8076 | Ray Node Manager 固定端口 |
RAY_OBJECT_MANAGER_PORT | 8077 | 8077 | Ray Object Manager 固定端口 |
RAY_RUNTIME_ENV_AGENT_PORT | 8078 | 8078 | Ray Runtime Env Agent 固定端口 |
RAY_DASHBOARD_AGENT_GRPC_PORT | 8079 | 8079 | Ray Dashboard Agent gRPC 端口 |
RAY_DASHBOARD_AGENT_LISTEN_PORT | 8080 | 8080 | Ray Dashboard Agent HTTP 端口 |
RAY_METRICS_EXPORT_PORT | 8081 | 8081 | Ray Metrics 指标暴露端口 |
RAY_MIN_WORKER_PORT | 10002 | 10002 | Ray Worker 进程端口范围下限 |
RAY_MAX_WORKER_PORT | 10100 | 10100 | Ray Worker 进程端口范围上限 |
RAY_NUM_CPUS | 自动检测 | 20 | 手动指定当前节点可用 CPU 数量 |
RAY_NUM_GPUS | 自动检测 | 1 | 手动指定当前节点可用 GPU 数量 |
RAY_OBJECT_STORE_MEMORY | 自动计算 | 8589934592 | Ray Object Store 内存大小,单位为 bytes |
RAY_RESOURCES | 空 | '{"worker": 1}' | 自定义 Ray 资源标签 |
RAY_TEMP_DIR | /tmp/ray | /tmp/ray | Ray 临时文件目录 |
RAY_DISABLE_USAGE_STATS | 1 | 1 | 禁用 Ray 使用统计上报 |
NVIDIA_VISIBLE_DEVICES | all | all / 0 / 0,1 | 指定容器可见 GPU |
NVIDIA_DRIVER_CAPABILITIES | compute,utility | compute,utility | NVIDIA 容器运行能力,GPU 计算通常需要 compute,nvidia-smi 需要 utility |
进入 Head 容器:
docker exec -it oc9-ray-head bash
执行:
python3 - <<'PY'
import socket
import ray
ray.init(address="auto")
@ray.remote
def task(i):
return {
"task": i,
"host": socket.gethostname(),
"node_id": ray.get_runtime_context().get_node_id(),
}
refs = [task.remote(i) for i in range(50)]
results = ray.get(refs)
for item in results[:20]:
print(item)
print("cluster_resources:", ray.cluster_resources())
PY
如果 Worker 节点加入成功,cluster_resources 中会显示多台节点的 CPU / GPU 资源。
docker run --rm \
--gpus all \
--shm-size=8g \
oc9-ray:2.55.1 \
bash -c "nvidia-smi && python3 -c 'import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))'"
预期输出中应包含:
True
NVIDIA ...
进入容器后执行:
python3 - <<'PY'
import ray
import torch
print("Ray:", ray.__version__)
print("Torch:", torch.__version__)
print("Torch CUDA:", torch.version.cuda)
print("CUDA available:", torch.cuda.is_available())
if torch.cuda.is_available():
print("GPU:", torch.cuda.get_device_name(0))
PY
/dev/shm 只有 64MB,Ray Object Store 会受到影响,建议启动容器时增加:--shm-size=8g
--network=host
Head 和 Worker 节点的 Ray 版本、Python 版本、CUDA 版本、PyTorch 版本应保持一致。
Worker 节点必须能访问 Head 节点的 6379 端口。
多机 Docker bridge 网络模式下,Ray 可能识别到容器内网 IP,导致其他机器无法访问,因此生产部署建议显式设置:
-e RAY_NODE_IP_ADDRESS=当前宿主机IP
生产环境建议固定 Ray 内部端口和 Worker 端口范围,便于配置防火墙、安全组和网络策略。
使用 GPU 时,宿主机必须安装 NVIDIA Driver 和 NVIDIA Container Toolkit。
如果 Ray Dashboard 无法访问,请确认启动参数中包含:
-e RAY_DASHBOARD_HOST=0.0.0.0
RAY_HEAD_ADDRESS 是否正确6379--network=hostRAY_NODE_IP_ADDRESS 是否设置为宿主机可访问 IP查看 Ray 状态:
ray status
查看 Ray 任务:
ray list tasks
查看 Ray 节点:
ray list nodes
停止 Ray:
ray stop --force
查看容器日志:
docker logs -f oc9-ray-head
docker logs -f oc9-ray-worker-1
删除容器:
docker rm -f oc9-ray-head oc9-ray-worker-1 oc9-ray-worker-2
Content type
Image
Digest
sha256:a747ae293…
Size
12 GB
Last updated
4 months ago
docker pull ocpub/oc9-ray:2.54.1