以下链接是个人关于深度学习环境搭建的所有链接,包含了各个框架:
深度学习环境搭建-史上最全无死角系列
有兴趣的朋友可以添加微信 17575010159 相互交流。

注意:本人编写该博客的时间为   2020 − 03 − 31 ,并不能保证适用于你现在的时间点 \color{red}{注意:本人编写该博客的时间为~~ 2020-03-31,并不能保证适用于你现在的时间点} 注意:本人编写该博客的时间为  20200331,并不能保证适用于你现在的时间点

介绍

Docker是种什么东西?有两种说法:

说法一:Docker就是虚拟机,在安装虚拟机的时候,我们当然需要一个镜像,借助这个镜像去构建一个虚拟机,这个虚拟机也被称为容器,容器创建好之后,我们就可以在自己的容器(虚拟机)中搭建自己想要的环境,如 tensoflow,pytorch,anconda等等。

说法二:镜像可以理解为程序代码,容器理解为一个进程。既然这样,代码当然只需要一份就行了,但是依照一份这样的代码,我们可以创建出很多进程(容器)。为每个项目构建一个容器,在该容器中搭建项目需要的环境,并把代码在容器中运行起来。

总结:在你看完这篇文章之后,就会觉得两种说法都差不多了,总的来说,使用 Docker 可以为每个项目创建单独的运行环境(容器),而不影响其他的项目环境。话虽如此,但是他是怎么实现的呢?请往下阅读

docker安装

在介绍如何使用之前,我们当然先要安装好docker,执行如下指令:

sudo apt install docker.io

sudo systemctl start docker

sudo systemctl enable docker

docker -v

本人版本打印如下:
在这里插入图片描述
现在已经安装好了,当然就是对 docker 的使用了。

docker使用

拉取镜像

首先,我们先要获取一个镜像,本人这里获取的镜像为 10.0-base-ubuntu18.04,也就是说,后续我们基于该镜像创建的虚拟机(容器)是一个以及安装了cuda10.0 的ubuntu18.04 的系统,镜像链接:
https://hub.docker.com/r/nvidia/cuda/tags?page=1&name=10.0-base-u
执行命令如下:

docker pull nvidia/cuda:10.0-base-ubuntu18.04

镜像拉取到本之后,执行:

docker images

本人显示如下,红色为刚才我们拉取下来的镜像:
在这里插入图片描述
大家不要在意我这里为什么这么多镜像,你那里现在应该只有一个镜像的,本人在这里记录一下镜像的ID为:

841d44dd4b3c

有了镜像之后,我们就可以创建自己的容器(虚拟机)了。

容器创建

当然,初步创建容器的时候,该容器只包含了cuda10.0 ,其他的anconda3,tensoflow,pytorch等等,全都没有。把他当作一台新的机器就可以了。在这里,需要一些其他的预备工作,因为创建出来的容器,需要有以下功能:
1、容器有独立的网址,并且这个网络和宿主机器在同一网段,因为这样我们在方便宿主机和容器(虚拟机)之间的信息交流,如ssh,共享文件等。
2、挂载本地的一个文件夹到容器之中,方便他们之间的信息交流。

综上所诉,我们创建容器时,需要指定 ip 以及 挂载的参数。在指定 ip 之前,我们需要创建一个网桥,先下执行指令 ifconfig,本人显示如下:
在这里插入图片描述
你只需要找到宿主机器,对应网址的网卡即可,本人为 eno4,估计你的和我的不一样,记录下来即可。

下面我们需要创建一个网桥,并且这个网桥的配置复制于 eno4 网卡信息,执行指令如下:

docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eno4  bredge-zwh

# -d macvlan 表示创建虚拟网卡,也可以换成 bridge
# --subnet=192.168.1.0/24  大概默认网段
# --gateway=192.168.1.1  大概路由网址
# parent=eno4 复制的网卡 
# bredge-zwh 网桥名字-可以任意取名

如果你的网段和我的不一样,那么请做合适的修改,执行后,在运行 docker network ls 可以看到我们创建的网桥,本人如下:
在这里插入图片描述
成功创建网桥,或者虚拟网卡之后,我们还要找到一个可用的在该网段中可用的 ip 然后分配给容器,执行指令:

nbtscan 192.168.1.1-254

在这里插入图片描述
其上显示的,为已经被占用的 ip,下面我们创建容器的 ip 不在上诉之中就可以了。本人执行创建容器的指令如下:

docker run -d     --restart=always  --net=bredge-zwh  -v   /opt/DATA/zwh/2.ChiPeak:/2.ChiPeak  --ip=192.168.1.100 --name  ub18.04-10.0cu-zwh-face  841d44dd4b3c  /bin/sh  -c "while true;do echo hello world;sleep 1;done"
# -d 后台运行容器
# --net=bredge-zwh  桥接网络,或许虚拟网卡的名称
# --restart=always 每次重启,都按照该设置(避免重起之后,预分配的静态ip消失)
# -v 把宿主的/opt/DATA/zwh/2.ChiPeak 目录挂载到2.ChiPeak(会自动创建目录) 
# --ip=192.168.1.100 静态分配的 ip,按照自己的需求进行更改
# -c 仅仅表示后面的为一个字符串
# ub18.04-10.0cu-zwh-face 为镜像names,换成镜像 id 也可
# /bin/sh 表示虚拟机运行之后要执行的命令

#  "while true;do echo hello world;sleep 1;done" ,执行该命令的主要原因是,
# 容器在没有进行运行时会自动关闭,所有手动给他创建一个循环进程,防止其stop。

创建了容器之后,执行:

docker ps -a

查看容器相关信息,本人显示如下:

在这里插入图片描述
本人在这里记录下容器 id = 41a79b39f0b7,后续需要用到,其上黄色字体 Exited 表示该容器已经退出,处于 stop状态。

现在我们已经创建了容器,那么总要把这个容器(虚拟机)用起来吧,我们可是需要他去跑项目的啊,执行如下指令 :

docker exec -it  41a79b39f0b7  /bin/bash
# 41a79b39f0b7换成容器名字也可以 
# /bin/bash表示启动一个新的终端。

本人显示如下:
在这里插入图片描述
是的,以后我们都使用上面的指令,就能进入这个容器了,是不是很熟悉啊,其实就是一个linux的操作系统,其上的 2.ChiPeak 文件夹,就是由宿主目录挂载而来,本人指令 ifconfig 显示如下:
在这里插入图片描述可以看到,我们自己分配的静态 ip 已经成功了。到这里,可以说 Docker 基本介绍完成,你可以在容器上去部署自己的深度学习环境,或者项目等等,下面我还记录了一些常用的Docker指令。

常用指令

创建容器

docker run -d     --restart=always  --net=bredge-zwh  -v   /opt/DATA/zwh/2.ChiPeak:/2.ChiPeak  --ip=192.168.1.100 --name  ub18.04-10.0cu-zwh-face  841d44dd4b3c  /bin/sh  -c "while true;do echo hello world;sleep 1;done"
# -d 后台运行容器
# --net=bredge-zwh  桥接网络,或许虚拟网卡的名称
# --restart=always 每次重启,都按照该设置(避免重起之后,预分配的静态ip消失)
# -v 把宿主的/opt/DATA/zwh/2.ChiPeak 目录挂载到2.ChiPeak(会自动创建目录) 
# --ip=192.168.1.100 静态分配的 ip,按照自己的需求进行更改
# -c 仅仅表示后面的为一个字符串
# ub18.04-10.0cu-zwh-face 为镜像names,换成镜像 id 也可
# /bin/sh 表示虚拟机运行之后要执行的命令

#  "while true;do echo hello world;sleep 1;done" ,执行该命令的主要原因是,
# 容器在没有进行运行时会自动关闭,所有手动给他创建一个循环进程,防止其stop。
进入已经启动的容器
docker exec -it  41a79b39f0b7  /bin/bash
# 41a79b39f0b7换成容器名字也可以 
# /bin/bash表示启动一个新的终端。
查看容器信息
docker ps -a 
容器停止
docker stop  (容器名字或者id
启动容器
docker start  (容器名字或者id
列出所有镜像:
docker images
停止所有的容器
docker stop $(docker ps -aq)

删除所有的容器
docker rm $(docker ps -aq)

删除所有的镜像
docker rmi $(docker images -q)

Nvidia-docker2安装

安装docker2

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

安装nvidia-docker2

# 清理以前的。If you have nvidia-docker 1.0 installed: we need to remove it and all existing GPU containers
sudo 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
sudo apt autoremove
 
# 执行命令。Add the package repositories
# command 1
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
 
# command 2
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
 
# command 3
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
 
# 正式安装。Install nvidia-docker2 and reload the Docker daemon configuration
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
 
# 测试一下。 Test nvidia-smi with the latest official CUDA image
sudo docker run --runtime=nvidia --rm nvidia/cuda:11.1.1-cudnn8-devel-ubuntu18.04  nvidia-smi
sudo groupadd docker
sudo usermod  -aG docker ${用户名}
sudo service docker restart

另外可以通过该网站: https://hub.docker.com/r/nvidia/cuda/tags?page=16拉取自己合适的镜像

手动安装

https://blog.csdn.net/weixin_41166785/article/details/131167418
https://github.com/NVIDIA/libnvidia-container/tree/gh-pages/stable/ubuntu18.04/amd64

 

报错(附加内容):

报错1: ‘gpg: 找不到有效的 OpenPGP‘ & ‘E: 无法定位软件包 nvidia-docker2‘

解决方式如下

打开ipaddress,搜索查找nvidia.github.io,即可得到对应的ip地址:

# nvidia.github.io
185.199.108.153 nvidia.github.io
185.199.109.153 nvidia.github.io
185.199.110.153 nvidia.github.io
185.199.111.153 nvidia.github.io

然后将上面的信息写入host文件即可:可在命令行输入sudo vi /etc/hosts,然后将上面的内容复制在文件
下方,保存退出即可。
这时候重新打开终端,再按安装指南一步一步操作的时候,就不会出现上面的问题了。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐