Skip to content

在极值算力实例内使用 Docker

极值算力实例可启用 Docker 容器( DinD)功能,允许用户在极值算力实例内(主容器)运行其他容器,从而提供更高的灵活性和隔离性。

特别是在需要 GPU 资源的场景下,用户可以在极值算力实例 DinD 环境中构建镜像,并创建挂载 GPU 的容器,测试容器化应用,并将构建好的镜像推送到租户镜像仓库。

信息

在该场景下,极值算力实例为主容器,您在极值算力实例内部启动的容器与主容器为互相隔离的环境,需要自行挂载 GPU 和文件存储目录。

启用方式

在创建极值算力实例时,找到 Docker 容器开关,设置为开启。

开启后,登录极值算力实例,执行 dockerctl status 可查看 Docker 服务状态。

language-shell
dockerctl status

 docker.service - Docker Application Container Engine
        Active: active (running) since 2024-12-02 04:40:33 Monday; 0 days ago
         Tasks: 116
        Memory: 0.00%
           CPU: 0.00%

信息

Dockerctl 是一个 Docker 服务管理工具,用于管理 Docker 守护进程的生命周期和配置。详见 Dockerctl

创建极值算力实例后,也可在极值算力「容器实例」页面找到目标实例,在「操作」栏点击「改配」,调整开关启用状态。如需查看当前是否已开启 Docker 容器功能,可在「配置信息」列将光标悬浮在详情上,在悬浮窗口的高级配置中查看 docker容器。如需帮助,请参见更改极值算力实例配置

使用场景

已知限制

使用方式与重要说明

  • 在极值算力实例内可以直接使用 Docker 构建镜像、运行容器与使用 Docker Compose(需遵守下文限制)。
  • 网络:默认使用 bridge 网络;使用 -p 暴露端口时,可能与当前环境中的其他服务产生端口冲突,请选择未占用端口;对外可达性受网络与安全策略影响。
  • 存储:镜像与容器数据由当前环境的 Docker 服务统一管理;请勿直接操作底层数据目录。查看占用请用 docker system df,清理请使用 dockerctl prune(顺序:dockerctl stopdockerctl prunedockerctl start)。
  • 资源:内部容器与极值算力实例共享 CPU、内存与 GPU 资源;多个内部容器也会共享这些资源。如需明确配额,请通过“极值算力实例规格/改配”进行控制。
  • 输出:部分环境中 docker run 已经执行完成,但实时输出没有显示在当前终端。验证短命令或镜像运行结果时,建议使用具名容器配合 docker logs 和退出码检查,详见操作容器
  • 高级限制:特权模式、能力变更、设备直通、部分 sysctls 等可能被拒绝,详见权限与 Capabilities

计算资源可用性

如果不需要使用 Docker 容器功能,建议在创建极值算力实例时不要启用 Docker 容器 开关,避免额外开销。

信息

开启「Docker 容器」后,极值算力实例(主容器)与内部容器共享 CPU 和内存资源。

  • 不支持在 docker run 中设置 cgroup 资源限额参数(如 --cpus--cpuset-cpus--memory--memory-swap 等);此类参数通常会在容器创建时被拒绝并报错。

  • 默认情况下不设置 Docker 层面的资源限额,HostConfig.Resources 多数字段会显示为 0 或空(表示未限制);容器会在当前极值算力实例可用配额的范围内,与其他工作负载公平竞争 CPU/内存。可用以下命令确认容器未设置 Docker 层资源限额。

    language-shell
    docker inspect <container> --format '{{json .HostConfig.Resources}}'
  • 显式设置资源参数在本环境可能被拒绝并报错(示例):

    language-shell
    error setting cgroup config for procHooks process: ... cpu.max: no such file or directory
    error setting cgroup config for procHooks process: ... memory.swap.max: no such file or directory

存储资源可用性

  • 极值算力实例的系统盘(rootfs)默认提供 100GB 持久化存储,请及时关注用量。磁盘写满后将导致极值算力实例异常。您可以将系统盘上的路径挂载给内部容器使用。详见启动并挂载主容器本地目录
  • 极值算力实例内部容器与极值算力实例共用系统盘(rootfs)的 100GB 存储配额。
  • 如果极值算力实例已挂载共享高性能存储,建议内部容器使用共享存储作为持久化存储。详见启动并挂载高性能存储

如果实例已挂载云盘,建议内部容器使用云盘目录作为单实例专用的持久化存储。详见启动并挂载云盘

Dockerctl### 网络可用性与端口暴露

  • 内部容器使用宿主机默认 bridge 网络;可使用 -p <hostPort>:<containerPort> 映射到宿主机端口(注意避免与宿主机当前使用的端口冲突)。
  • 内部容器与极值算力实例主容器不是同一个 localhost。要访问容器里的服务:请使用该容器的 IP 地址,或者(在同一 Docker 自定义网络中)直接用容器名/别名访问;必要时可使用 --network host
  • 非主机网络模式下,内部容器内无法使用 host.docker.internal 直接访问主机(极值算力实例);请改用 --network host--add-host $(hostname):$(hostname -i) 等方式,详见「操作容器 · 从容器内访问极值算力实例上的服务」。

可选自检:

language-shell
docker inspect <container> --format '{{ .NetworkSettings.IPAddress }}'

GPU 可用性

在极值算力实例内可以启动 GPU 容器,同时极值算力实例(主容器)内 GPU 资源依然可用。

docker run 命令中,支持使用以下方式为容器挂载 GPU:

  • --gpus=all / --gpus all:挂载全部 GPU 设备。
  • --gpus 2:挂载第 3 个 GPU 设备。
  • --gpus '"device=0,1"':挂载第 1 个、第 2 个 GPU 设备;注意必须用单引号包裹 device 参数。
  • --gpus device=GPU-d2d984f9-2cb1-48f7-fe3b-f76508d37c0e:挂载 UUID 为 GPU-d2d984f9-2cb1-48f7-fe3b-f76508d37c0e 的 GPU 设备。

在极值算力实例内部启动挂载 GPU 的容器时,无需也不支持使用 --runtime 指定为 nvidia。如果 docker run 命令中包含了 --runtime=nvidia,将直接报错,直接移除该参数即可。

信息

如果在极值算力实例内启动多个挂载全部 GPU 的容器,这些容器会共享 GPU 资源。

Docker Compose

支持使用 Docker Compose,但需要自行安装工具。详见 Docker Compose。在本环境中请注意:

  • privilegedcap_add/cap_dropdevicessysctls 等字段可能被平台拒绝或忽略。
  • deploy.resources.limits 可作为意向声明,实际仍以平台配额为准。
  • 存储挂载优先使用平台提供的共享存储等平台已挂载目录;避免指向主容器内部仅局部可见的路径。

权限与 Capabilities

  • 不支持使用 --privileged 参数启动容器;平台在创建时会拒绝该请求,常见错误为:invalid create request: privileged is not supported.

  • 不支持使用 --cap-add/--cap-drop 修改能力集合;常见错误为:invalid create request: linux capabilities setting is not supported.

  • 容器能力固定为约 14 项基础能力(示例):cap_chown, cap_dac_override, cap_fowner, cap_fsetid, cap_kill, cap_setgid, cap_setuid, cap_setpcap, cap_net_bind_service, cap_net_raw, cap_sys_chroot, cap_mknod, cap_audit_write, cap_setfcap;Bounding set 与 Current 相同,无法再提升。

  • 如需验证当前能力,可在容器内执行:

    language-shell
    apt update && apt install -y libcap2-bin # 如未安装
    capsh --print
    # 或
    grep Cap /proc/self/status
  • 如遇到文件权限问题,请提前在极值算力实例内调整目录权限,例如 chmod -R 777 /path/to/directory

  • 部分镜像挂载的目录可能需要提前在极值算力实例内调整所有者权限,例如 chown -R 999:999 /path/to/directory

常见问题

如何添加 proxy 或 mirror 配置?

详见 Dockerctl

为什么 --privileged 或 --cap-add 在这里会报错?

平台为多租户安全强策略,容器创建时会拒绝特权与能力变更请求,错误文案通常为:

language-shell
invalid create request: privileged is not supported.
invalid create request: linux capabilities setting is not supported.

磁盘空间不足怎么办?如何清理 Docker 服务占用的空间?

当极值算力实例提示空间不足或镜像/容器/缓存占用过多时,请按以下方式处理:

请使用 dockerctl prune 执行清理,并按照以下顺序进行:dockerctl stopdockerctl prunedockerctl start。仅查看占用请使用 docker system df。标准 docker system/image/builder prune 在本环境可能被策略禁用或不完全生效,详见「dockerctl prune」。