Docker 快速配置深度学习环境 + 基础命令 + 常见报错
快速配置深度学习环境
基础命令
常见报错
Docker 快速配置深度学习环境
版本说明:
- base 版本基于
pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel,默认python版本为 3.11.10,可以通过conda install python==版本号直接修改版本。- dl 版本在 base 基础上,额外安装了深度学习框架和常用工具,具体查看安装清单。
如果已经配置好了Docker,只需两行命令即可完成深度学习环境的搭建。命令在 Ubuntu 18.04/20.04/22.04 下可以顺利执行,其余系统可通过文内链接跳转安装。
镜像介绍
所有版本都预装了 sudo、pip、conda、wget、curl 和 vim 等常用工具,且已经配置好 pip 和 conda 的国内镜像源。同时,集成了 zsh 和一些实用的命令行插件(命令自动补全、语法高亮、以及目录跳转工具 z)。此外,已预装 jupyter notebook 和 jupyter lab,设置了其中的默认终端为 zsh,方便进行深度学习开发,并优化了容器内的中文显示,避免出现乱码问题。其中还预配置了 Hugging Face 的国内镜像地址。
链接:
- quickstart,位于 Docker Hub,对应于下方的 pull 命令。
- 百度云盘,直接下载对应的版本,跳过科学版的命令进行配置。
安装清单
base
**基础环境**:- python 3.11.10
- torch 2.5.1 + cuda 11.8 + cudnn 9
Apt 安装:
wget、curl:命令行下载工具vim、nano:文本编辑器git:版本控制工具git-lfs:Git LFS(大文件存储)zip、unzip:文件压缩和解压工具htop:系统监控工具tmux、screen:会话管理工具build-essential:编译工具(如gcc、g++)iputils-ping、iproute2、net-tools:网络工具(提供ping、ip、ifconfig、netstat等命令)ssh:远程连接工具rsync:文件同步工具tree:显示文件和目录树lsof:查看当前系统打开的文件aria2:多线程下载工具libssl-dev:OpenSSL 开发库
pip 安装:
jupyter notebook、jupyter lab:交互式开发环境virtualenv:Python 虚拟环境管理工具,可以直接用 condatensorboard:深度学习训练可视化工具ipywidgets:Jupyter 小部件库,用以正确显示进度条
插件:
zsh-autosuggestions:命令自动补全zsh-syntax-highlighting:语法高亮z:快速跳转目录
dl
dl(Deep Learning)版本在 base 基础上,额外安装了深度学习可能用到的基础工具和库:
Apt 安装:
ffmpeg:音视频处理工具libgl1-mesa-glx:图形库依赖(解决一些深度学习框架图形相关问题)
pip 安装:
- 数据科学库:
numpy、scipy:数值计算和科学计算pandas:数据分析matplotlib、seaborn:数据可视化scikit-learn:机器学习工具
- 深度学习框架:
tensorflow、tensorflow-addons:另一种流行的深度学习框架tf-keras:Keras 接口的 TensorFlow 实现
- NLP 相关库:
transformers、datasets:Hugging Face 提供的 NLP 工具nltk、spacy:自然语言处理工具
如果需要额外的库,可以通过以下命令手动安装:
1pip install --timeout 120 <替换成库名>这里 --timeout 120 设置了 120 秒的超时时间,确保在网络不佳的情况下仍然有足够的时间进行安装。如果不进行设置,在国内的环境下可能会遇到安装包因下载超时而失败的情况。
快速配置环境(两行命令)
1. 获取镜像(三选一)
假设已经安装并配置好了 Docker,那么只需两行命令即可完成深度学习的环境配置,以 dl 镜像为例,拉取:
国内镜像版
1sudo docker pull dockerpull.org/hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel🪜科学上网版(直连)
1sudo docker pull hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-develNote如果镜像有更新版本,可通过
docker pull拉取最新镜像。
本地(网盘下载)
通过百度云盘下载文件(阿里云盘不支持分享大的压缩文件)。
同名文件内容相同,
.tar.gz为压缩版本,下载后通过以下命令解压:Terminal window 1gzip -d dl.tar.gz
假设 dl.tar 被下载到了 ~/Downloads 中,那么切换至对应目录:
1cd ~/Downloads然后加载镜像:
1sudo docker load -i dl.tar2. 运行容器
1sudo docker run --gpus all -it --name ai hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel /bin/zsh如果需要使用 Jupyter,可以使用以下命令:
1sudo docker run --gpus all -it --name ai -p 8888:8888 hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel /bin/zshTip常用操作提前看:
- 启动容器:
docker start <容器名>- 运行容器:
docker exec -it <容器名> /bin/zsh
- 容器内退出:
Ctrl + D或exit。- 停止容器:
docker stop <容器名>- 删除容器:
docker rm <容器名>
安装 Docker Engine
对于图形界面来说,可以跳过下面的命令直接安装 Desktop 版本(其中会提供 Docker Engine),这是最简单的方法。根据系统访问:
以下是命令行的安装命令,在 Ubuntu 上运行,其余系统参考官方文档。
卸载旧版本
在安装 Docker Engine 之前,需要卸载所有有冲突的包,运行以下命令:
1for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; doneapt-get 可能会报告没有安装这些包,忽略即可。
注意,卸载 Docker 的时候,存储在 /var/lib/docker/ 中的镜像、容器、卷和网络不会被自动删除。如果你想从头开始全新安装,请阅读 Uninstall Docker Engine 部分。
使用 apt 仓库安装
首次安装 Docker Engine 之前,需要设置 Docker 的 apt 仓库。
-
设置 Docker 的
apt仓库Terminal window 1# 添加 Docker 的官方 GPG 密钥:2sudo apt-get update3sudo apt-get install ca-certificates curl4sudo install -m 0755 -d /etc/apt/keyrings5sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc6sudo chmod a+r /etc/apt/keyrings/docker.asc78# 将仓库添加到 Apt 源:9echo \10"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \11$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \12sudo tee /etc/apt/sources.list.d/docker.list > /dev/null13sudo apt-get updateNote如果你使用的是 Ubuntu 的衍生发行版,例如 Linux Mint,可能需要使用
UBUNTU_CODENAME而不是VERSION_CODENAME。如果
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc执行失败,可以尝试以下命令:Terminal window 1sudo wget -qO- https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc -
安装 Docker 包
Terminal window 1sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -
通过运行
hello-world镜像来验证安装是否成功Terminal window 1sudo docker run hello-world
GPU 驱动安装
如果需要使用 GPU 的话,先安装适用于你的系统的 NVIDIA GPU 驱动程序,访问任一链接进行:
安装 NVIDIA Container Toolkit
为了在 Docker 容器中使用 GPU,需要安装 NVIDIA Container Toolkit。 注意,我们现在不再需要安装 nvidia-docker,官方在 2023.10.20 指出其已被 NVIDIA Container Toolkit 所取代,过去的配置命令可能已不再适用。
以下命令使用 Apt 完成,Yum 等其他命令访问参考链接:Installing the NVIDIA Container Toolkit。
-
设置仓库和 GPG 密钥
设置 NVIDIA 的软件源仓库和 GPG 密钥,确保我们可以从官方源安装 NVIDIA Container Toolkit。
Terminal window 1curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \2&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \3sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \4sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list。 -
安装 NVIDIA Container Toolkit
Terminal window 1sudo apt-get update2sudo apt-get install -y nvidia-container-toolkit -
配置 Docker
使用
nvidia-ctk工具将 NVIDIA 容器运行时配置为 Docker 的默认运行时。Terminal window 1sudo nvidia-ctk runtime configure --runtime=docker -
重启 Docker
Terminal window 1sudo systemctl restart docker
拉取并运行深度学习 Docker 镜像
现在可以拉取深度学习(dl)镜像,命令和之前一致。
-
拉取镜像
Terminal window 1sudo docker pull hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel -
运行镜像
Terminal window 1sudo docker run --gpus all -it hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel -
检查 GPU
在容器内运行:
Terminal window 1nvidia-smi如果正确显示代表成功。不过对于实际使用来说,还需要了解基础命令和报错的解决方法。
Docker 基础命令
镜像管理
无需每次使用
sudo的设置方法 默认情况下,非 root 用户执行 Docker 命令需要在前面加上sudo。如果不想这样,可以将当前用户添加到docker用户组中:Terminal window 1sudo groupadd docker # 如果提示 group 已存在,可忽略2sudo usermod -aG docker $USER3newgrp docker
查看本地镜像
1docker images列出本地所有的 Docker 镜像,包括仓库名、标签、镜像 ID、创建时间和大小。
拉取镜像
1docker pull <image_name>:<tag>例如:
1docker pull hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-develNote
docker pull可以从远程仓库更新镜像,如果镜像已存在,则只会拉取更新部分(层),不严谨地类比为git pull进行理解。
删除镜像
1docker rmi <image_id_or_name>在删除镜像前,请确保没有容器正在使用它。
创建容器
基础用法
1docker run --gpus all -it [--rm] <image_name>:<tag>--gpus all:允许容器使用主机的所有 GPU 资源(如有)。-it:交互式终端。这是两个参数的组合,-i表示“交互式”(interactive),-t表示为容器分配一个伪终端(pseudo-TTY)。--rm:在容器退出后自动删除容器,避免试验产生无用容器。
以当前使用的深度学习镜像为例:
1docker run --gpus all -it hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-develTip使用
docker run --help可以查看更多参数的用法。
挂载
如果需要在容器内访问主机的文件,可以使用 -v 参数。
-
挂载卷(Volume)
Terminal window 1docker run --gpus all -it -v my_volume:/container/path hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-develmy_volume:Docker 卷的名称。/container/path:容器中的路径。
挂载卷可让数据在容器删除后仍保留。
-
挂载主机目录到容器中
使用绝对路径挂载主机目录到容器中:
Terminal window 1docker run --gpus all -it -v /host/path:/container/path hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel/host/path:主机上的路径。/container/path:容器中的路径。
以当前项目为例,假设已经在主机的 ~/Downloads 文件夹克隆了项目并做了一些修改,那么所需要同步的目录为 ~/Downloads/AI-Guide-and-Demos-zh_CN,想同步到容器的同名文件夹中,对应命令:
1docker run --gpus all -it -v ~/Downloads/AI-Guide-and-Demos-zh_CN:/workspace/AI-Guide-and-Demos-zh_CN hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel容器中的 /workspace/AI-Guide-and-Demos-zh_CN 会与主机上的 ~/Downloads/AI-Guide-and-Demos-zh_CN 目录同步,所有更改都会反映到主机的目录中。
在容器中启动 Jupyter Lab
如果需要在容器内启动 Jupyter Lab,并通过主机的浏览器进行访问,可以使用 -p 参数映射端口。Jupyter Lab 默认使用 8888 端口,使用以下命令:
1docker run --gpus all -it -p 8888:8888 -v ~/Downloads/AI-Guide-and-Demos-zh_CN:/workspace/AI-Guide-and-Demos-zh_CN hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel-p 8888:8888将容器内的 8888 端口映射到主机的 8888 端口。
然后在容器内运行:
1jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root现在可以在主机浏览器中访问 http://localhost:8888。
如果需要映射多个端口,比如 7860,那么命令对应如下:
1docker run --gpus all -it --name ai -p 8888:8888 -p 7860:7860 ...(后续一致)7860端口在这里对应于 Gradio。
你可以根据实际情况重新指定端口号。
停止容器
在容器终端内停止
- 使用
Ctrl+D或输入exit:退出并停止容器(适用于通过docker run启动的情况)。 - 使用
Ctrl+P然后Ctrl+Q:仅退出容器的终端(detach),让容器继续在后台运行。
Note以上的“停止”行为适用于通过
docker run启动的容器。如果容器是通过docker start启动的,Ctrl+D或exit只会退出终端,而不会停止容器。通过docker ps可以察觉到这一点。
从主机停止
如果你想从主机停止正在运行的容器,可以使用:
1docker stop <container_id_or_name>替换 <container_id_or_name> 为容器的 ID 或名称。
重新连接到已存在的容器
在使用一段时间后,你可能会发现每次使用 docker run 去“运行”容器时,之前所做的改变都没有“保存”。
这是因为每次运行 docker run 创建了新的容器。
要找回在容器中的更改,需要重新连接到之前创建的容器,参考以下步骤:
-
查看正在运行的容器:
Terminal window 1docker ps如果容器已停止,可查看所有容器:
Terminal window 1docker ps -a -
启动已停止的容器:
Terminal window 1docker start <container_id_or_name> -
连接到正在运行的容器:
Terminal window 1docker exec -it <container_id_or_name> /bin/bash或者使用
Terminal window 1docker attach <container_id_or_name>区别在于
exec启动一个新进程的终端,attach附着到容器主进程终端(PID 1)。
Note在之前的命令中,我们使用了
/bin/zsh,这是因为该容器中已安装了 zsh。而在大多数容器中,默认的行为通常是/bin/bash或/bin/sh。
命名容器
有没有什么方法可以指定名称呢?每次通过 docker ps -a 复制 id 太不优雅了。
使用 --name 参数
在创建容器时,可以使用 --name 参数为容器指定一个名称。例如:
1docker run --gpus all -it --name ai hoperj/quickstart:dl-torch2.5.1-cuda11.8-cudnn9-devel容器被命名为 ai,以后可通过该名称管理容器,不需要记住容器的 ID。
运行 docker ps -a
使用容器名称的命令示例
-
启动容器:
Terminal window 1docker start ai -
停止容器:
Terminal window 1docker stop ai -
重新连接到容器:
Terminal window 1docker exec -it ai /bin/zsh
复制文件
从主机复制文件到容器
1docker cp /host/path <container_id_or_name>:/container/path从容器复制文件到主机
1docker cp <container_id_or_name>:/container/path /host/path删除容器
删除指定容器
如果想删除一个容器,可以使用 docker rm 命令:
1docker rm <container_id_or_name>删除前需先 stop 容器。
删除所有已退出的容器
1docker container prune这将删除所有已停止的容器(请谨慎使用,因为删除后无法恢复,适用于刚安装 Docker “不小心”创建了一堆容器的情况)。
查看和调试容器状态
查看容器日志
1docker logs <container_id_or_name>可加 -f 参数实时跟随日志输出。
查看容器详细信息
1docker inspect <container_id_or_name>输出容器的 JSON 配置信息(环境变量、卷挂载、网络信息等)。
查看容器资源使用情况
1docker stats显示所有容器的 CPU、内存、网络和存储 I/O 实时数据。
导出与加载镜像
有时候我们可能需要在没有网络环境、或者在不同机器之间迁移镜像,这时可以通过 docker save 和 docker load 来完成镜像的导出与导入。
使用 docker commit 提交容器为镜像
1docker commit <container_id_or_name> <new_image_name>:<tag><container_id_or_name>:容器的 ID 或名称。<new_image_name>:为生成的新镜像指定名称。<tag>(可选):为镜像指定标签,默认是latest。
假设容器名为 ai,我们在其中安装了一些软件并做了环境修改,现在希望将其保存为新镜像 ai2:latest:
1docker commit ai ai2:latest执行成功后,使用 docker images 查看:
1docker images此时,ai2:latest 就是基于容器 ai 保存的新镜像,其中包含了所有最近的修改。
导出镜像
使用 docker save 将指定镜像及其历史层打包成 .tar 文件:
1docker save <image_name>:<tag> -o <output_file.tar>例如,将刚才创建的 ai2:latest 镜像导出为 quickstart_ai_image.tar:
1docker save ai2:latest -o quickstart_ai_image.tar现在我们拥有了一个 quickstart_ai_image.tar 文件,可以将其迁移到其他机器上。
加载镜像
在另一台机器上,使用 docker load 来加载 .tar 文件中的镜像:
1docker load -i <input_file.tar>例如:
1docker load -i quickstart_ai_image.tar加载完成后可以使用 docker images 查看该镜像已成功导入。
区别于 export/import:
docker save与docker load针对镜像操作,并保留镜像的元数据(包括标签和镜像分层信息)。docker export与docker import针对容器操作,而非镜像本身(此时不需要 commit),将运行后的容器文件系统导出为单一文件系统快照,并不会保留完整的镜像层结构(如果只需要将容器环境打包并在另一端恢复为镜像,可以考虑这一对命令)。
压缩镜像文件
为了减少传输的文件大小,可以对导出的 .tar 文件进行压缩:
1gzip quickstart_ai_image.tar生成 quickstart_ai_image.tar.gz 后,在目标机器上解压:
1gzip -d quickstart_ai_image.tar.gz2docker load -i quickstart_ai_image.tar通过这种方式,可显著减少镜像备份文件的大小(接近 1/2)。
Docker 常见报错
介绍在新环境中使用 Docker 时,可能会遇到的报错。
报错 1:权限被拒绝(Permission Denied)
当运行命令:
1docker ps可能会遇到以下报错:
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json”: dial unix /var/run/docker.sock: connect: permission denied
解决方法:
方法 1:使用 sudo
在 Docker 命令前加上 sudo:
1sudo docker ps方法 2:将用户添加到 docker 用户组
-
创建
docker用户组Terminal window 1sudo groupadd docker -
将当前用户添加到
docker组Terminal window 1sudo usermod -aG docker $USER -
重新加载用户组设置
Terminal window 1newgrp docker -
验证
运行 Docker 命令,如果不提示权限错误(permission denied),说明配置成功。
Terminal window 1docker ps
报错 2:无法连接到 Docker 仓库(Timeout Exceeded)
Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
原因: 由于国内网络限制,无法直接连接到 Docker Hub。
解决方法:
方法一:配置镜像
临时使用:
直接在原 <image_name>:<tag> 前增加网址,比如:
1docker pull dockerpull.org/<image_name>:<tag>快速测试可用性:
1docker pull dockerpull.org/hello-world永久使用:
运行以下命令配置文件,如果有一天突然拉(pull)不动了,说明链接挂了需要更新。
1# 创建目录2sudo mkdir -p /etc/docker3
4# 写入配置文件5sudo tee /etc/docker/daemon.json > /dev/null <<-'EOF'6{7 "registry-mirrors": [8 "https://docker.unsee.tech",9 "https://dockerpull.org",10 "https://docker.1panel.live",11 "https://dockerhub.icu"12 ]13}14EOF15
16# 重启 Docker 服务17sudo systemctl daemon-reload18sudo systemctl restart docker方法二:设置 HTTP/HTTPS 代理
这一项提供给🪜科学上网的同学进行配置。对于本项目来说,所有文件都会提供网盘链接和对应的国内镜像命令。
-
创建并编辑 Docker 的系统服务配置文件
Terminal window 1sudo mkdir -p /etc/systemd/system/docker.service.d2sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf -
添加代理配置
在
http-proxy.conf文件中添加以下内容(将http://localhost:7890/替换为你自己的代理地址):1[Service]2Environment="HTTP_PROXY=http://localhost:7890/"3Environment="HTTPS_PROXY=http://localhost:7890/"使用
ESC+:wq回车保存配置。如果不熟悉
vim的操作,也可以使用直接运行(将http://localhost:7890/替换为你自己的代理地址):Terminal window 1sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null <<EOF2[Service]3Environment="HTTP_PROXY=http://localhost:7890/"4Environment="HTTPS_PROXY=http://localhost:7890/"5EOF -
重新加载配置并重启 Docker 服务
Terminal window 1sudo systemctl daemon-reload2sudo systemctl restart docker
报错 3:磁盘空间不足(No Space Left on Device)
write /var/lib/docker/tmp/…: no space left on device
原因: Docker 默认使用 /var/lib/docker 作为数据存储目录,如果该分区空间不足,就会出现此错误。
解决方法:
更改 Docker 的数据目录
-
查看当前的磁盘空间
检查
/var/lib/docker所在分区的剩余空间:Terminal window 1sudo df -h /var/lib/docker -
选择具有足够空间的目录
创建文件夹:
Terminal window 1mkdir -p ~/Downloads/Docker && cd ~/Downloads/Docker && pwd复制输出。
-
修改 Docker 的配置文件
编辑
/etc/docker/daemon.json文件(如果不存在会自动创建):Terminal window 1sudo vim /etc/docker/daemon.json添加或修改以下内容(将
Path/to/Docker替换为你的新数据目录的绝对路径,也就是刚刚复制的输出):1{2"data-root": "Path/to/Docker"3}ESC+:wq保存并退出。 -
重启 Docker 服务并验证
Terminal window 1sudo systemctl restart docker2docker info -f '{{ .DockerRootDir}}'
Some information may be outdated