在开发机内使用 Docker
开发机可启用 Docker 容器( DinD)功能,允许用户在开发机内(主容器)运行其他容器,从而提供更高的灵活性和隔离性。
特别是在需要 GPU 资源的场景下,用户可以在开发机 DinD 环境中构建镜像,并创建挂载 GPU 的容器,测试容器化应用,并将构建好的镜像推送到租户镜像仓库。
注意
在该场景下,开发机为主容器,您在开发机内部启动的容器与主容器为互相隔离的环境,需要自行挂载 GPU 和文件存储目录。
启用方式
在创建开发机时,找到 Docker 容器开关,设置为开启。
开启后,登录开发机,执行 dockerctl status 可查看 Docker 服务状态。
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 save的压缩文件)创建镜像,并推送到租户私有镜像仓库。 - 测试容器化应用。
已知限制
使用方式与重要说明
- 在开发机内可以直接使用 Docker 构建镜像、运行容器与使用 Docker Compose(需遵守下文限制)。
- 网络:默认使用
bridge网络;使用-p暴露端口时,可能与当前环境中的其他服务产生端口冲突,请选择未占用端口;对外可达性受网络与安全策略影响。 - 存储:镜像与容器数据由当前环境的 Docker 服务统一管理;请勿直接操作底层数据目录。查看占用请用
docker system df,清理请使用dockerctl prune(顺序:dockerctl stop→dockerctl prune→dockerctl start)。 - 资源:内部容器与开发机共享 CPU、内存与 GPU 资源;多个内部容器也会共享这些资源。如需明确配额,请通过“开发机规格/改配”进行控制。
- 高级限制:特权模式、能力变更、设备直通、部分 sysctls 等可能被拒绝,详见权限与 Capabilities。
计算资源可用性
如果不需要使用 Docker 容器功能,建议在创建开发机时不要启用 Docker 容器 开关,避免额外开销。
注意
开启「Docker 容器」后,开发机(主容器)与内部容器共享 CPU 和内存资源。
不支持在
docker run中设置 cgroup 资源限额参数(如--cpus、--cpuset-cpus、--memory、--memory-swap等);此类参数通常会在容器创建时被拒绝并报错。默认情况下不设置 Docker 层面的资源限额,
HostConfig.Resources多数字段会显示为0或空(表示未限制);容器会在当前开发机可用配额的范围内,与其他工作负载公平竞争 CPU/内存。可用以下命令确认容器未设置 Docker 层资源限额。shelldocker inspect <container> --format '{{json .HostConfig.Resources}}'显式设置资源参数在本环境可能被拒绝并报错(示例):
shellerror 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 上的路径。开发机 rootfs 默认提供 100GB 持久化存储,请及时关注用量。磁盘写满后将导致开发机异常。详见启动并挂载主容器本地目录
- 如果开发机已挂载共享高性能存储,建议内部容器使用共享存储作为持久化存储。详见启动并挂载高性能存储。
- 如果使用弹性资源创建开发机,且已购买足够大的云盘,建议将云盘上的目录挂载给内部容器,作为持久化存储。详见启动并挂载云盘。
- 开发机内部容器共享主容器的 rootfs 100GB 存储容量。
- 镜像与容器层实际由宿主机 dockerd 管理,不建议直接操作
/var/lib/docker目录;容量查看可用docker system df。清理请使用dockerctl prune(需先dockerctl stop,再dockerctl start),标准docker system prune/docker image prune/docker builder prune在本环境可能被策略禁用或不完全生效,详见 Dockerctl。 - 跨容器共享数据时,优先选择“共享高性能存储/云盘”等平台已挂载的目录或
docker volume。直接把主容器内部路径-v绑定到新容器,实质会在宿主机侧尝试绑定节点路径,可能导致路径不一致或权限错配。
网络可用性与端口暴露
- 内部容器使用宿主机默认
bridge网络;可使用-p <hostPort>:<containerPort>映射到宿主机端口(注意避免与宿主机当前使用的端口冲突)。 - 内部容器与开发机主容器不是同一个
localhost。要访问容器里的服务:请使用该容器的 IP 地址,或者(在同一 Docker 自定义网络中)直接用容器名/别名访问;必要时可使用--network host。 - 非主机网络模式下,内部容器内无法使用
host.docker.internal直接访问主机(开发机);请改用--network host或--add-host $(hostname):$(hostname -i)等方式,详见「操作容器 · 从容器内访问开发机上的服务」。
可选自检:
docker inspect <container> --format '{{ .NetworkSettings.IPAddress }}'GPU 可用性
在开发机内启动容器时,可以使用 --gpus=all 挂载全部 GPU,开发机(主容器)内 GPU 资源依然可用。
如果在开发机内启动多个容器,这些容器会共享 GPU 资源。
Docker Compose
支持使用 Docker Compose,但需要自行安装工具。详见 Docker Compose。在本环境中请注意:
privileged、cap_add/cap_drop、devices、sysctls等字段可能被平台拒绝或忽略。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 相同,无法再提升。如需验证当前能力,可在容器内执行:
shellapt 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 在这里会报错?
平台为多租户安全强策略,容器创建时会拒绝特权与能力变更请求,错误文案通常为:
invalid create request: privileged is not supported.
invalid create request: linux capabilities setting is not supported.磁盘空间不足怎么办?如何清理 Docker 服务占用的空间?
当开发机提示空间不足或镜像/容器/缓存占用过多时,请按以下方式处理:
请使用 dockerctl prune 执行清理,并按照以下顺序进行:dockerctl stop → dockerctl prune → dockerctl start。仅查看占用请使用 docker system df。标准 docker system/image/builder prune 在本环境可能被策略禁用或不完全生效,详见「dockerctl prune」。