在进行深度学习的时候,服务器上用docker,总结一下docker的建立与配置。
docker image相当于配置变量,而容器中放入的是要操作的软件、代码或其他文档等。
一、 在现有镜像文件基础上建立docker
以 docker image为例,docker hub中搜索Tensorflow,选择其中一个搜索结果进入,如图所示。
由于我要挂在GPU,因此,执行nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu。
注意:首先得确认电脑上安装了nvidia_docker,NVIDIA/nvidia-docker
从上图中可以看出GPU、CUDA、docker、container和应用之间的关系。
现在回来说安装image的情况:nvidia-docker run -it -p 8888:8888 tensorflow/tensorflow:latest-gpu命令中,使用了tensorflow/tensorflow:latest以后台模式启动一个容器,并将容器的8888端口映射到服务器的8888端口。个8888端口指的是docker所在服务器的端口,第二个8888指的是容器的端口。
如果我想给后台启动的容器起个名字,那么命令可以改为:nvidia-docker run -it --name wjtensorflow -p 8888:8888 tensorflow/tensorflow:latest-gpu,并执行该命令。
运行该命令时发现主机的8888端口号被占用了,因此,换一个端口号,并执行命令:nvidia-docker run -it --name wjtensorflow -p 18888:8888 tensorflow/tensorflow:latest-gpu,出现一下信息。其中我用红框标注的‘Serving notebooks from local directory: /notebooks’表示docker默认工作路径,是镜像文件自带的。而‘http://localhost:8888/?token=589f8b259b666ba1386797b5f033f533768398828167b768’表示我启动jupyter的url链接地址。需要注意的是:这里需要将localhost:8888修改一下,改为docker所在服务器的ip地址和端口号,由于我使用的服务器ip地址为192.168.2.254,端口号是上面的18888,所以对url地址修改一下即可,然后在网页内输入token。
到此,docker镜像安装完成。
但是!
我们访问容器或者对容器进行操作的时候很麻烦,因为容器和服务器相当于两个独立的空间,所以,为了我们的可操作性,会将服务器主机上的目录与容器中的目录做一个映射,其关键指令就是-v。比如,我在主机上新建一个文件夹,与容器名称相同,即都为wjtensorflow,那么指令如下:
nvidia-docker run -it --name wjtensorflow -p 18888:8888 -v /home/huichang/wjtensorflow:/notebooks tensorflow/tensorflow:latest-gpu
其中,/home/huichang/wjtensorflow是主机上我建立的目录,而/notebooks是容器wjtensorflow 的目录,此时,主机上的目录就映射到容器上了,而主机目录里面的内容则会完全替代容器中的内容。由于主机目录中的内容为空,所以容器中的原有内容会被清空。
但是,如果我不希望容器目录中的内容被清除掉,我可以在/notebooks下再建立一个文件夹,将/home/huichang/wjtensorflow文件的内容映射到/notebooks下的一个文件中,即这样子的:
nvidia-docker run -it --name wjtensorflow -p 18888:8888 -v /home/huichang/wjtensorflow:/notebooks/wj tensorflow/tensorflow:latest-gpu
至此,成功啦!
后面需要上传的项目代码,可以直接放在/home/huichang/wjtensorflow/wj中啦。