Docker 初窥(有一大坑,注意根目录磁盘爆满问题,易导致开机黑屏)
由于最近用到Temporal_Segment_Networks(TSN)光流提取,涉及Docker操作,故本节将简单讲解docker的一些使用命令,基于docker,利用宿主机上的dataset,提取对应的光流信息。 注意:Docker大佬请绕行,本章适合像本人一样的超级小白【手动狗头】。 如果用完docker,退出容器之后,之前容器内保存下来的数据将会消失,退出前请先将所需文件,拷贝至宿主机!!!!!当然有方法解决这一问题,大家可以自行探索一下。 |
1.安装docker以及nvida-docker
对于本小白,于我个人而言,docker类似电脑端安卓模拟器,也有点像虚拟机,只不过docker内的一些东西,貌似是完全隔离开的,具体介绍移步Docker教程。
总而言之,就是一个很牛叉的一个东西,大佬把自己的程序以及依赖包环境都上传上去,你下载下来就可以用了,甚至都不用配置环境(应该应该,因为我把TSN的docker镜像下载下来之后,可以直接运行scripts/extract_optical_flow.sh,不用bash build_all.sh,发现的过程是一部血泪史。。。)。
(1)先安装docker
在终端直接输入docker ps -a,ubuntu会提示你相关安装命令,两种方式,如下:
sudo apt install docker.io # 我用的是这个
sudo snap install docker # 不要用,因为可能会导致nvida-docker安装的失败,目录问题
(2)然后安装nvida-docker
这里参考ubuntu18.04 nvidia docker环境搭建
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 && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker # 如果失败,建议重新安装docker
(3)最后安装cuda镜像
由于docker安装后,权限仅归sudo所有,故而每次调用docker必须使用sudo docker命令,想免去sudo的同学,请移步:免sudo使用docker命令。
sudo docker pull nvidia/cuda:10.1-cudnn7-devel # 这里版本最好针对自己电脑的实际情况,本人直接与宿主机一样
(4)测试是否安装成功(nvida-docker、cuda镜像)
sudo docker run --gpus all nvidia/cuda:10.1-cudnn7-devel nvidia-smi
2.采用TSN镜像获取视频光流
(1)从docker上获取TSN镜像
sudo docker pull bitxiong/tsn # 进入dockerhub上对应的镜像界面,会有对应的命令
# 上面直接默认latest版本,可根据docker pull bitxiong/tsn:版本,下载想要下的版本(or tag)
(2)查看获取的镜像
sudo docker images
(3)以GPU方式,进入容器
sudo docker run --gpus all -it bitxiong/tsn bash
# 这里采用全部GPU,当然也可以指定GPU
# --gpus '"device=1,2"'
此时成功在该容器内,打开一个类似宿主机的终端,我们可以在该终端下,运行相关程序,与宿主机一样的操作,注意:可能会有一些命令不存在,例如gedit。
# 补充,退出容器:
exit
(4)对宿主机上的数据集,利用容器内程序提取光流
本人采用最低端的方法,将宿主机上的数据集,拷贝至容器内,当提取光流完成后,再将容器内的文件夹拷贝回宿主机上。
当然好像有方法,将docker内的文件挂载至宿主机,觉得拷贝比较浪费时间的同学,可以考虑挂载的方法。
sudo docker cp 宿主机文件夹地址 容器ID:容器目录地址
# 将宿主机文件/文件夹拷贝至容器指定目录下
sudo docker cp 容器ID:容器文件夹地址 宿主机目录地址
# 将容器内文件/文件夹拷贝至宿主机指定目录下
那么容器的ID该如何查看呢?注意是容器的ID,不是镜像的ID,二者有区别。这里我当时忘截图了,盗用网上的图,做一个简单对比:
- 容器ID(由于拷贝需要,不要退出容器,直接宿主机另打开一个终端窗口)
sudo docker ps -a # -a显示所有的容器
- 镜像ID
sudo docker images
3.根目录爆满,出现开机后黑屏现象
由于一开始对docker的一窍不通,所以没注意到docker默认数据安装在/var/lib/docker下,导致很快根目录空间不足,小伙伴们要注意,此时ubuntu会弹出提示,告诉你根目录空间不足!!!!
当本人发现,pycharm提示运行缓慢、google浏览器甚至都没法打开,此时怀疑空间不足导致,当然本人还认为是N多天没关机的缘故,于是选择重启,紧接着出现以下现象:
开机选择内核版本后,电脑黑屏,无法进入登陆界面!!!!WTF*!
这时候别慌(慌得不行,还要着急跑代码呢亲),去网上搜,有很多人推荐在一开始的ubuntu advance界面,选择内核recovery mode,然后卸载驱动,但是大都是是因为之前他们更新了驱动等操作,大家切忌直接跟风。
啥也不思考,可能驱动卸载了,也照样进不去,问题还会更严重,故本人特地写下本文章,供后来者参考!!!!!
当然本人电脑之前自动更新了内核,高版本内核与当前驱动程序不一致,曾经出现过nvidia-smi失败,所以每次选择之前的版本内核,请移步Ubuntu问题汇总ing...,那么对于当前情况,也会出现以下情况:
对于图6情况,可以参照【问题解决】/dev/sda6:clean / files, /blocks。或者选择系统之前的低版本内核,再试试。(在以前的电脑上,我利用后面的方法,“解决”了图6情况)
当我选择低版本内核后,不会出现图6的情况,但是会黑屏,无法进入登陆界面。回想之前ubuntu的提示,怀疑很可能是docker安装导致的根目录爆满问题,当时没有截图,大家自行脑补操作画面,sorry~:
-
首先进入ubuntu advance界面,选择内核recovery mode,选择root进入命令行模式,如图7所示;
-
输入 df -h 查看磁盘空间,会发现,以本人图6为例,/dev/nvme0n1p2爆满,挂载点为root /;
-
cd / ;进入根目录,继续查看各文件占用率;
-
du -h --max-depth=0(或者--max-depth=1) ;0代表当前目录使用的总空间大小,1代表当前目录使用总空间的大小以及当前目录下一级文件及文件夹各自使用的总空间大小
此时我们可以发现/var/lib/docker 占据了超大部分容量,故而进一步确定是docker的问题,由于本人已经利用docker完成了光流提取任务,后面基本用不到,所以直接选择了卸载 apt remove docker.io。如果卸载后,还是不行,很可能还需要手动删除 rm -rf /var/lib/docker。
此时即可安全启动电脑,顺利进入登陆界面。大家也可以参考解决docker占用系统根目录磁盘100%的问题, 将文件移植到其他地方。