docker制作深度学习环境操作(亲测可用,快速上手,内置基础版镜像!)
快速制作深度学习环境
一、安装docker
1.online安装docker
- 更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt update
- 安装需要的软件
sudo apt install apt-transport-https ca-certificates software-properties-common curl
3.添加 GPG 密钥,并添加 Docker-ce 软件源(中科大源)
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
4.安装docker-ce
sudo apt update
sudo apt install docker-ce
2.online安装nvidia-docker
1.卸载 nvidia-docker 1.0 及其他GPU容器
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
2.添加package repositories
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
3.安装 nvidia-docker2
sudo apt-get install -y nvidia-docker2
3.offline安装docker及nvidia-docker2
1.online下载docker 注意有3个文件
2.nvidia-docker2 安装之前要先安装好 nvidia 驱动,在可以访问互联网的机器上运行以下指令
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
# 下载以下5个文件
apt download libnvidia-container1
apt download libnvidia-container-tools
apt download nvidia-container-toolkit
apt download nvidia-container-runtime
apt download nvidia-docker2
# 将下载的文件拷贝至离线机器上,按照顺序安装
dpkg -i libnvidia-container1
dpkg -i libnvidia-container-tools
dpkg -i nvidia-container-toolkit
dpkg -i nvidia-container-runtime
dpkg -i nvidia-docker2
# 安装后重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
二.设置国内源
1.设置国内docker源加速拉取镜像
对本机/etc/docker/daemon.json 进行修改,在{ }中,加入以下内容
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://registry.docker-cn.com"
]
}
我的示例如下:
2.设置docker容器中的apt更新国内源
进入容器后做以下修改如下
# !!!进入容器后做以下修改如下
cp /etc/apt/sources.list /etc/apt/sources.list.backup
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
apt-get update
三.将用户加入docker组
# 添加docker用户组,一般已存在,不需要执行
sudo groupadd docker
# 将登陆用户加入到docker用户组中
sudo gpasswd -a $USER docker
# 更新用户组
newgrp docker
# 测试docker命令是否可以使用sudo正常使用
docker version
四.docker使用基础操作
# docker开机自启动
systemctl enable docker
# 拉取镜像
docker pull nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04
# 查看镜像
docker image ls -a
# 启动容器
docker run -it(-d) --runtime=nvidia --network=host --name=test -v /home/alinnvv/worknjw:/media --privileged=true --restart=on-failure(或者always) nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 /bin/bash
## 参数说明:
## -it : i 指示 docker 要在容器上打开一个标准的输入接口 t 指示 docker 要创建一个伪 tty 终端,连接容器的标准输入接口 d表示后台运行,返回容器id
## --runtime=nvidia : 启用物理gpu,可使用nvidia-smi命令
## --network=host : 映射物理机器的network
## -name=test : 容器的命名
## -v 挂载目录 /home/alinnvv/worknjw:本地目录 /media:容器目录,在创建前容器若没有media目录,docker 容器则自动创建
## --privileged=true 关闭安全权限
## --restart=on-failure/always , on-failure为非0状态下重启,always表示任何情况都重启
## nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 : docker image
## /bin/bash : 必要参数,默认命令,输入是基于 bash shell 执行的
## -p 9000:9000 : 指定端口映射
#容器更新重启参数
docker update --restart=on-failure/always container-id # 未添加自动重启配置的容器更新参数
# 查看容器
docker ps -a # 查看所有的容器
docker ps # 查看已运行的容器
docker ps -l #列出最近创建的容器
docker ps -n 3 # 列出最近创建的3个容器
docker ps -q #只列出容器id
# 停止与启动容器
docker stop container-id # 停止已运行的容器
docker kill container-id # 强制停止容器
docker start container-id # 启动已停止的容器
docker restart container-id # 重启容器
# 退出与进入容器
ctrl+p+q # 退出不关闭容器
docker exec -it container-id /bin/bash # 进入已运行的容器
docker attach container-id #进入已运行的容器
# 删除容器/镜像
docker container rm container-id # 删除容器
docker rm -f container-id #强制删除容器
docker image rm image-id # 删除镜像
# 宿主机和容器交互
docker cp container-id:/path1 /path0 #从dokcer容器内拷贝文件到宿主机
# path1 容器内文件路径 path0 宿主机路径
# 容器保存为镜像
docker commit container-name image-name
#镜像备份与迁移(保存镜像为文件,迁移到其他机器)
docker save -o saved_file_name image_name
e.g docker save -o ./ubuntu_cuda10.tar ubuntu_cuda10
docker load -i ./ubuntu_cuda10.tar # 加载镜像到本地
# 镜像上传至docker hub
https://hub.docker.com/ # 注册
docker login # 登录
docker tag repo-name:tag-name 新repo-name:新tag-name # 按照规范命名镜像
docker push username/repo-name:tag-name # 推送镜像到docker hub
# e.g docker push alinnvv/ubuntu:v1
五.docker容器内服务自启
一般的做法为docker 容器创建的时候,加载脚本start.sh(自命名),详细做法为:
(1)在配置好的docker 容器内,编写start.sh,大致内容如下:
#/bin/bash
#添加环境变量,编写服务启动命令
XXXXXX
XXXXXX
/bin/bash
# 其中,上述start.sh中的"xxxx"表述的为export环境变量、服务启动命令;最后一行需要加入/bin/bash,作用是待服务启动后,保留交互式终端(/bin/bash)。
(2)在容器内,为start.sh添加运行权限
chmod 777 start.sh
(3)将添加start.sh的容器保存为镜像(操作命令见第四节),或者直接将start.sh放置在映射的本地文件夹
(4)重新创建容器,命令如下:
docker run -it(-d) --runtime=nvidia --network=host --name=test -v /home/alinnvv/worknjw:/media --privileged=true --restart=on-failure(或者always) nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04 /bin/bash -c 'sh /XXXX/start.sh'
#注意: sh /XXXX/start.sh 中,sh后面的是start.sh在容器内的绝对路径。
六.docker中安装软件(ubuntu 16.04)
进入容器后,与Ubuntu系统方法一致,安装各类软件。
1.安装cuda10.0与cudnn7.6.5
下载cuda10.0对应.run文件与对应的cudnn7.6.5
sh cuda_10.0.130_410.48_linux.run --no-opengl-libs # 不要安装对应的显卡驱动,docker依赖使用物理机系统的显卡驱动)
ldconfig /usr/local/cuda-10.0/lib64
tar -xvzf cudnn-10.0-linux-x64-v7.6.5.32.tgz
cp cuda/include/* /usr/local/cuda-10.0/include/
cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
chmod +x /usr/local/cuda-10.0/include/cudnn.h
chmod +x /usr/local/cuda-10.0/lib64/libcudnn*
nvcc -V
2.安装anaconda3
# download: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
sh Anaconda3-5.3.1-Linux-x86_64.sh
source ~/.bashrc
conda -V
3.设置conda源为国内源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda info
4.虚拟环境与tf和torch安装(可指定版本)
conda create -n tf # 创建虚拟环境安装tf
conda create -n torch # 创建虚拟环境安装pytorch
conda install tensorflow-gpu=1.15.0
conda install pytorch==1.6.0 torchvision==0.7.0 cudatoolkit=9.2 # pytorch官网查看对应的pytorch、cuda与cudatoolkit版本对应
# pip install XXX -i https://pypi.tuna.tsinghua.edu.cn/simple 使用清华源进行安装。
5.安装opencv4.4.0(支持cuda)
(1)下载编译
# github下载对应的opencv-4.4.0 opencv_contrib-4.4.0源码,并将两者解压到同文件夹下,online下载诸多boostdesc_bgm_bi.i文件放在opencv_contrib-4.4.0/modules/xfeatures2d/src/下
# 贴出我整理的opencv440完整src(见百度网盘),不需要做任何调整,依据以下步骤操作即可
# 链接:https://pan.baidu.com/s/14peTkvRXjp7iljTTeiA4vQ 提取码:ahz4
# 如果你需要编译其他版本,github下载src后,将需要加入的文件(如boostdesc_bgm_bi.i)加到相应的文件夹下,需要加入的文件见百度网盘
# 链接:https://pan.baidu.com/s/1vyY3iuwOjSHviTAKRXH8OA 提取码:cjz0
cd opencv-4.4.0/
mkdir release
cd release
cmake -D WITH_CUDA=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D WITH_GTK=ON -D WITH_VTK=OFF -D CUDA_ARCH_BIN="7.5" -D CUDA_ARCH_PTX="" -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv440 .. (CUDA_ARCH_BIN根据显卡修改,参考NVIDIA网站)
make -j${nproc}
make install
(2)环境变量设置
cd /etc/ld.so.conf.d
touch opencv.conf(若存在,直接修改)
vim opencv.conf
edit, /usr/local/lib /opt/opencv440/lib
ldconfig
vim ~/.bashrc
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/opencv440/lib/pkgconfig
source ~/.bashrc
(3)其他
# 验证opencv4路径
pkg-config --libs opencv4 , pkg-config --cflags opencv4;
# CMakeLists.txt中使用时,设定语句为
set(OpenCV_DIR /opt/opencv440/lib/cmake/opencv4/) # OpenCVConfig.cmake上级目录
find_package(OpenCV REQUIRED)
七.编译好的镜像
# My IMAGE:Ubuntu16.04 cuda10.0/cudnn7.6.5 tensorflow-gpu 1.15.0 pytorch1.6.0 opencv4.4.0(cuda) anaconda3
docker pull alinnvv/ubuntu-deeplearning:v1