Docker

需求:将具有复杂依赖的程序在任意环境(服务器)上运行

  • 由于服务器无法联网,且装cuda及相关驱动、工具包等对环境改动较大,容易影响到物理机本身,在Docker中运行相关程序是更好的选择。
  • Nvidia提供了不同CUDA版本的基础镜像

安装Docker

从Docker官方网站获取操作系统的安装程序,并按照说明进行安装

编写Dockerfile

1
touch Dockerfile #创建Dockerfile

Dockerfile是用来构建Docker镜像的指令文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 使用CUDA 12.3.1 开发环境的 Ubuntu 20.04 镜像作为基础镜像
FROM nvidia/cuda:12.3.1-devel-ubuntu20.04

# 设置工作目录
WORKDIR /app

# 复制CUDA程序源代码到容器中的/app目录
COPY . /app

# 安装编译工具和其他依赖项
RUN apt-get update && \
apt-get install -y \
build-essential \
g++-10 \
<其他依赖项>

# 授予run.sh执行权限
RUN chmod +x run.sh

# 运行CUDA程序的命令
CMD ["./run.sh"]

  1. devel版本的基础镜像包含了cudatoolkit等驱动及编译调试工具;runtime版本则用于直接执行编译好的cu文件
  2. 镜像中最好安装vim等方便编辑的基础工具

也可以使用 docker pull 命令从 Docker Hub 上拉取 nvidia/cuda:12.3.1-devel-ubuntu20.04 这个标签的镜像.这里不需要手动选择架构来拉取容器镜像。Docker会自动识别并拉取与您的主机架构匹配的镜像

1
docker pull nvidia/cuda:12.3.1-devel-ubuntu20.04

构建镜像

1
docker build -t your_image_name .

测试镜像

1
docker run --gpus all -v /path/to/your/input/files:/input your_image_name

镜像传输至服务器并运行

1
2
docker run --gpus all your_image_name
docker run --gpus all your_image_name /bin/bash

若服务器无法联网:

1
2
3
4
5
6
7
8
9
# 在本地保存镜像为一个tar文件
docker save -o your_image.tar your_image_name

# 将该tar文件复制到服务器上
scp your_image.tar user@server_ip:/path/to/destination

# 在服务器上加载镜像
ssh user@server_ip
docker load -i /path/to/destination/your_image.tar

常见指令

1
2
3
4
5
6
7
docker ps -a 列出所有容器
docker images 列出所有镜像
docker rm container_id 删除容器
docker rm -f container_id_or_name 强制删除容器
docker rmi image_id 删除镜像
docker commit container_id new_image_name 基于已修改的容器创建新镜像
docker cp /local/path/to/your/file_or_directory container_id:/app/ 本地文件挂载到容器中