docker制作深度学习环境操作(亲测可用,快速上手,内置基础版镜像!)

快速制作深度学习环境

一、安装docker

1.online安装docker

  1. 更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
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
  1. 安装需要的软件
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"
  ]
}

我的示例如下:

networkdownload docker刷下行_bash

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