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参数,将/mnt/data0、/mnt/data1路径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命令。