DSW支持在实例的主容器中使用Docker命令启动和管理二级容器(子容器)。
如果您需要使用可视化操作界面启动子容器,参考子容器管理DockerBoard
使用限制
-
目前二级容器功能仅支持由”灵骏资源组”或”1.0版本的通用资源组”创建的DSW实例。
-
二级容器的Docker Daemon配置(
/etc/docker/daemon.json)不支持在DSW实例内修改,无法自定义data-root、registry-mirrors等配置项。 -
实例重启后,二级容器中的运行数据(包括构建的镜像)会丢失,无论是否启用云盘功能。建议及时保存重要的环境和数据。
-
Docker启动二级容器时,无法使用以下具有权限提升或安全风险的参数:
参数
说明
--privileged
赋予容器近乎宿主机的全部权限
--ipc=host
共享宿主机 IPC 命名空间
--security-opt
可绕过或修改容器安全策略
--cap-add
向容器追加 Linux 内核能力,扩大权限范围
说明如果在使用docker run、docker create创建二级容器时遇到报错
Error response from daemon: authorization denied by plugin authZ: Permission denied,说明使用了受限参数。
创建并配置DSW实例
创建DSW实例时配置如下关键参数,其他参数按需配置:
-
资源类型:选择资源配额
-
资源配额:选择您创建的灵骏资源配额,详细操作参见新建资源组并购买灵骏智算资源。
-
启用多容器隔离 (DinD):打开该开关。
单击确定创建实例,后续您可参考操作二级容器。
操作二级容器
启动二级容器
您可以使用下面的命令启动并进入二级容器:
docker run -it dsw-registry.cn-hangzhou.cr.aliyuncs.com/pai/pytorch:1.8PAI-gpu-py36-cu101-ubuntu18.04 /bin/bash
设备挂载:
-
挂载GPU:可以使用
--gpus=all挂载DSW实例内所有的GPU设备。 -
挂载PPU:与GPU挂载不同,需要通过
--device参数手动将PPU设备挂载到二级容器中:docker run -it --network=host \ --device=/dev/alixpu_ppu0 \ --device=/dev/alixpu \ --device=/dev/alixpu_ctl \ your-ppu-enabled-image说明二级容器的镜像内必须预先集成PPU运行所需的组件,否则无法使用PPU。
数据挂载:
您可以使用Docker Bind Mount,将数据通过数据集挂载或存储路径挂载的方式挂载到DSW实例,再挂载到二级容器中访问(当前不支持Volume Mount和tmpfs Mount)。例如DSW实例在/mnt/data0与/mnt/data1路径下挂载了数据,可使用-v参数或--mount参数将其Bind Mount到二级容器中:
# 在本例中,<dsw内路径>的取值可以是:/mnt/data0,/mnt/data1及其子路径。
# 其他路径暂时无法挂载进二级容器中。
# 使用-v参数
docker run -v <dsw内路径>:<二级容器内路径>[:选项] {image}
# 使用--mount参数
docker run --mount type=bind,source=<dsw内路径>,target=<二级容器内路径>[,readonly] {image}
进入二级容器
您可以使用docker exec命令在运行中的容器内启动新的命令进程。
例如,以交互模式并打开标准输入(-i)和分配伪终端(-t)的方式启动bash shell:
docker exec -it your-container /bin/bash
当前您无法使用例如--privileged等有安全风险的参数进入容器。
您也可以使用docker attach命令接入运行中容器的主进程终端。如果启动容器时打开了标准输入(-i)并分配了伪终端(-t),则可以看到容器内的标准输入/输出(stdin/stdout/stderr)并与其交互:
docker attach {容器id}
安全退出attach模式(不中断容器)的默认快捷键是:Ctrl + p,然后Ctrl + q。这样您将从容器终端"分离"(detach),容器继续运行。
制作镜像
在DSW实例中,支持使用Dockerfile构建镜像:
docker build -t test-build .
由于网络限制,无法直接拉取Docker Hub镜像。建议在使用FROM指定基础镜像时,使用阿里云容器镜像服务(ACR)中的镜像。
构建完成后使用如下命令查看镜像:
root@dsw-330808-8445dd65f4-mhnrt:/mnt/workspace/test# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test-build latest fad7fdb5e81a About a minute ago 15.4GB
镜像拉取
拉取公共镜像,以ACR公共镜像为例:
docker pull dsw-registry.cn-hangzhou.cr.aliyuncs.com/pai/pytorch:1.8PAI-gpu-py36-cu101-ubuntu18.04
如果需要拉取私有仓库镜像,先使用docker login命令登录:
docker login --username={用户名} registry.cn-hangzhou.aliyuncs.com
常见问题
Q:为什么在DSW实例中执行ps -aux命令看不到二级容器相关进程 ?
DSW中主容器和二级容器不共享pid namespace,因此在主容器内无法看到二级容器的进程。
Q:为什么从Docker Hub拉取镜像会失败 ?
由于网络限制,直接拉取Docker Hub官方镜像会失败。遇到如下报错:
root@dsw-381955:/mnt/workspace# docker run --network=host -it ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded.
See 'docker run --help'.
建议改为从阿里云容器镜像服务(ACR)的制品中心拉取镜像。或参考文档跨域拉取海外模型或容器镜像。
Q:遇到如下报错:Error response from daemon: authorization denied by plugin authZ: Permission denied ?
这是因为使用了当前不支持的Docker命令或参数。如有疑问,请提交工单联系技术支持。
Q:遇到如下报错:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running ?
请检查DSW实例内是否存在/var/docker/proxy/docker-proxy.sock文件。如果存在,执行以下命令后重试:
export DOCKER_HOST=unix:///var/docker/proxy/docker-proxy.sock
设置完成后再尝试执行Docker命令。