如果你之前不了解docker,今后也没啥自发愿望要了解更多,之所以要用docker就是为了要用tensorflow的话,那么看此文就对了。
简单来说,docker里有两个必须清楚的概念,image(镜像)和container(容器)。镜像就像是C++中的类,而容器则类比为对象。一般来说郑重其事保存起来的都是镜像。而每次我们去运行相应的镜像则会产生一个容器。细说一句,这个容器会有一套全新的文件系统,与本机环境基本毫无关系,类似于开了个虚拟机,我们可以专门开启这样一个容器来使用tensorflow-gpu。
下面我将重点“描述”一下大家可能用的到的几条docker命令。
查看所有的docker镜像:
docker image ls
运行一个docker镜像所产生的容器:
docker run -it --rm --mount type=bind,source=/opt/source,target=/opt/target --gpus all --name abc Repository:Tag bash
这条命令可能基本包含了深度学习训练所能用到的大多数东西。
首先docker run的语法是:docker run + 参数 + 镜像 + 命令。
-i:交互式操作
-t: 终端
--rm:该容器结束后自动删除
--mount:将本机的source目录作为一个数据卷挂载在所创建的docker容器的target目录下,简而言之,实现了两者的数据共享。这个还是挺重要的。
--gpus all:这个肯定都懂
--name:给你的容器取个名字,后面会讲名字的用处
[Respository:Tag]:这两个东西你只要运行一下docker image ls看一下就明白了,简而言之和ID一样可以成为镜像的唯一表示。
bash:这个命令保证了你接下来可以在shell中使用刚创建的docker容器。
将一个运行中的容器保存为镜像:
docker commit Name Repository:Tag
docker commit Name ID
上面两条命令都可以,Name是容器的名字,最后是你给镜像的唯一标识。这点也很重要,谁也不想自己配置完环境的容器就这么直接消失不是。不过据说在run的时候不加--rm容器会被保存下来,这样应该也能之后接着运行,不过具体的话我就没有试过了。
删除仓库里的镜像:
sudo docker image rm xxxxx
有创有删,这条命令比较粗暴易懂。
补充一条,如果容器运行的时候shell崩了,那么该容器有几率没有停止运行,可以使用
docker stop /CONTAINER_NAME
来终止该容器运行,如果在run的时候有指定--rm,那么该容器不会被保存。
再补充一条,查看运行中的docker容器:
docker ps