Docker,救你于「深度学习环境配置」的苦海
date
Dec 18, 2021
Last edited time
Dec 18, 2021 04:41 AM
status
Published
slug
Docker,救你于「深度学习环境配置」的苦海
tags
Others
summary
type
Post
origin
Field
Plat
一、Docker、深度学习镜像、Nvidia-docker 的安装1. Docker 的安装2. Nvidia-docker 的安装3. 深度学习镜像的安装二、Docker 最常用操作(一)基本概念(二)容器的相关操作1. 容器的创建、查看、删除2. 容器的启动、进入、退出:(三)Docker jupyter notebook 服务 [力荐!]1. 如何创建自己的可以远程访问的容器:2. 创建了容器之后,我们可以进而启动 jupyter notebook:3. 开启本地与服务器的端口映射,从而远程登录 jupyter:(四)容器的备份实用工具简单的映射与挂载命令配置docker服务端(C/S架构)配置pycharm
一、Docker、深度学习镜像、Nvidia-docker 的安装
安装这种事儿,真不想详细写。因为这里确实没有很多坑。
1. Docker 的安装
链接:https://docs.docker.com/install/linux/docker-ce/ubuntu/ 跟着教程一路复制粘贴回车即可。 唯一的难点就是看懂英文的安装教程,看清楚段落层次结构。
反正,最后如果你运行
sudo docker run hello-world
,可以跑通,看到:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe9775e9f-6a55-4e45-914e-26dc85a630f4%2F94db02e6-4672-4f65-be29-4ff3b3cd92c9.jpeg?table=block&id=fea5b17f-166c-4c56-97f7-7fe62daaaba0&cache=v2)
就说明 Docker 已经被你成功安装了!
2. Nvidia-docker 的安装
为何又蹦出来一个 nvidia-docker?因为原本的 docker 不支持 GPU 加速,所以 NVIDIA 单独做了一个 docker,来让 docker 镜像可以使用 NVIDIA 的 gpu。 链接: https://github.com/NVIDIA/nvidia-docker 也是直接找对应的操作系统的命令,一行行复制粘贴回车就搞定了。
反正,最后当你运行
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base [nvidia-smi](https://www.zhihu.com/search?q=nvidia-smi&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22article%22%2C%22sourceId%22%3A64493662%7D)
时,如果看到:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8f15b65e-99fb-48ae-a0d4-6c988077cad0%2Fa237bab9-c199-4b0f-903c-988a14012d03.jpeg?table=block&id=7180403e-7568-4685-8a2e-564224da2c11&cache=v2)
恭喜,安装成功了!
3. 深度学习镜像的安装
我这里使用镜像是 deepo 一款咱们中国人做出来的深度学习镜像,包含了现在多数流行的深度学习框架,而且版本也很新,所以我这个小白第一次就选择了这个。 链接:https://hub.docker.com/r/ufoym/deepo 只有安装好了前面的 docker 和 nvidia-docker,这里就很方便了。 直接通过命令
docker pull ufoym/deepo
就可以把各种框架都下载下来。但是这样比较大,费时较长,所以教程里面也提供了值安装某一种框架的方式:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe864a4f3-5c17-4f57-bf62-b8551822f08a%2F84c39c04-94b9-43c1-b228-bdc100ec01a1.jpeg?table=block&id=08f312d1-4bb6-4aa7-943c-206bae83408f&cache=v2)
另外,还提供了 jupyter notebook 版的镜像,我这里就是安装的这个,因为我日常基本都是使用 jupyter notebook,这里贴一下我的命令:
这里的
all-jupyter-py36-cu100
也是 deepo 提供的 jupyter notebook 镜像的 tag。 安装好之后,通过docker images
命令,可以查看已经下载好的镜像:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F013c0cc3-f853-4cab-b599-b0942da05e58%2F86246ad3-6104-4d57-abac-2ab1ae5cd118.jpeg?table=block&id=72b4db73-8f22-4ae1-aec2-19729a3b16bd&cache=v2)
好了,该装的东西都装好了,下面进入操作部分了!
二、Docker 最常用操作
(一)基本概念
image,镜像,是一个个配置好的环境。 container,容器,是 image 的具体实例。 image 和 container 的关系,相当于面向对象中类与对象的关系。
如何查询命令参数:
docker
可以看 docker 客户端有那些基本命令; 对应每一条命令,想看看具体是做什么的,可以在后面加一个--help
查看具体用法,例如对于 run 命令: docker run --help
(二)容器的相关操作
1. 容器的创建、查看、删除
docker run [-it] some-image
创建某个镜像的容器。注意,同一个镜像可以通过这种方式创建任意多个 container. 加上-it
之后,可以创建之后,马上进入交互模式。[docker ps](https://www.zhihu.com/search?q=docker+ps&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22article%22%2C%22sourceId%22%3A64493662%7D)
列出当前运行的容器![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb8f57660-bcd3-4c02-bccf-a3c7328083b2%2F0818dc2e-2d80-4ee5-ac79-7e69224d24dd.jpeg?table=block&id=477a7a77-e250-4345-910c-1346b3ccd249&cache=v2)
docker ps -a
列出所有的容器,包括运行的和不运行的![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F6c0af7e8-1794-47d8-a409-0583b61ce4c2%2F420c9d4b-ac31-46e4-ba98-d7a255599252.jpeg?table=block&id=dc26e2ca-70a0-43e0-acd9-c32eb96e152d&cache=v2)
docker rm container-id
删除某个容器2. 容器的启动、进入、退出:
docker start [-i] container-id
启动某个容器,必须是已经创建的。 加上-i
参数之后,可以直接进入交互模式:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F171dbbcc-2568-4d59-8f52-2c017d3a8efa%2F22154fe1-92ff-4709-a383-0a1fdfb546ae.jpeg?table=block&id=32e3cc50-029c-4bea-9d4b-ec4242b43b5a&cache=v2)
除了通过
-i
进入交互模式,还有一种方法,那就是通过attach
: docker attach container-id
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F4d4d0b90-7688-425d-89f8-65d4dfa0fe2a%2Ff0e96007-a2b8-41eb-9715-674b6f55fe6f.png?table=block&id=c811742d-f8c2-4d65-afbc-825bc5dc92ca&cache=v2)
进入交互模式之后,怎么退出呢: - 想退出但是保持容器运行,按
CTRL+Q+P
三个键 - 退出,并关闭停止容器,按CTRL+D
或者输入exit
再回车注:Ctrl+P+Q 按的时候有时候会不灵,多按几次!
容器的停止、重启:
docker stop container-id
docker restart container-id
(三)Docker jupyter notebook 服务 [力荐!]
深度学习 jupyter notebook 镜像已经创建:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffc5ba7ca-b19b-471b-bccc-91956095ec08%2F6d3a8c22-1fd8-47ec-9160-425c90528e6c.png?table=block&id=59e3dc22-b53e-4dd2-a085-f00aff5a1c01&cache=v2)
1. 如何创建自己的可以远程访问的容器:
其中: -
-it
为直接进入交互式 - -p 7777:8888
是把主机的 7777 端口映射到容器的 8888 端口 - -ipc=host
可以让容器与主机共享内存 - 还可以加一个--name xxxxx
给容器定义一个个性化名字 - -v /home/shcd/Documents/gby:/gby
可以讲主机上的 / home/shcd/Documents/gby 地址挂载到容器里,并命名为 /data 文件夹,这样这个文件夹的内容可以在容器和主机之间共享了。因为容器一旦关闭,容器中的所有改动都会清除,所以这样挂载一个地址可以吧容器内的数据保存到本地。 - 90be7604e476
则是你安装的 jupyter 镜像的 id,可以在刚刚 docker images 命令后面查看,当然你也可以直接写全名ufoym/deepo:all-py36-jupyter
经过上面的操作,你应该可以直接进入容器了,这时你用
ls
命令,应该可以看到一个新的文件夹 gby 产生了!![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd34a6277-d339-4f89-9d05-30a71e2e670d%2Fff7c7dd0-5168-40df-98d0-503a166828f0.png?table=block&id=707af6d8-854e-453e-9f38-792c30dcb41f&cache=v2)
2. 创建了容器之后,我们可以进而启动 jupyter notebook:
其中: -
--no-browser
即不通过浏览器启动,--ip
指定容器的 ip,--allow-root
允许 root 模型运行 - --NotebookApp.token
可以指定 jupyter 登录密码,可以为空 - --notebook-dir='/gby'
指定 jupyter 的根目录3. 开启本地与服务器的端口映射,从而远程登录 jupyter:
在本地机器上,执行如下命令:
这样,可以将本地的 1234 端口,映射到服务器的 localhost 的 7777 端口(即你前面创建 jupyter 容器时候的指定的服务器端口) 这样,你在本地电脑的浏览器里输入’localhost:1234’,即可登录到服务器上的 jupyter notebook 了!
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F46346be3-1f48-4196-a01f-bebb45599472%2Fcbef7af3-e33e-44f3-8c28-22ceada135ff.png?table=block&id=2271a426-a19b-4ab8-a5eb-4b94820462fe&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb90d2ecc-129c-444a-99ef-f63a0df6906a%2F560660bf-0e4c-42e1-9670-579664b9908e.jpeg?table=block&id=d9053222-855e-4934-b135-e24d3a630961&cache=v2)
当我第一次看到这个画面的时候,简直激动地要跳起来! 既能远程访问高性能服务器,又可以像在本地一样便捷地操作,你说激动不激动你说激动不激动?
(四)容器的备份
之前好不容易配置好的环境,突然被学校服务器要重装!?怎么办? 你想到的一定是:能不能把配置好的环境备份一份,后面直接重新加载进来?
方法也很简单: 一般情况下,我们想备份的是容器,因为我们具体的配置都是在容器中进行的,而镜像一般都是直接在网上下载的,我们不做什么改动。
先通过
docker ps
或者docker ps -a
来查看你想备份的容器的 id, 然后通过:来将 id 为 your-container-id 的容器创建成一个镜像快照。
接着,你通过
[docker images](https://www.zhihu.com/search?q=docker+images&search_source=Entity&hybrid_search_source=Entity&hybrid_search_extra=%7B%22sourceType%22%3A%22article%22%2C%22sourceId%22%3A64493662%7D)
就可以查看到刚刚创建好的镜像快照了。 然后,通过:把那个镜像打包成 tar 文件,保存到服务器上。 后面就可以把服务器上打包好的 tar 文件,下载到本地了。
恢复:
docker load -i your-backup-name.tar
docker run -d -p 80:80 your-backup-name
以上就是我目前使用到的最常用的用法了,至少对我目前的需求来说是够用了,随着我使用次数的变多,我也会不断更新。希望能够减少大家在环境搭建之路上的折磨吧! > 本文由简悦 SimpRead 转码
实用工具
简单的映射与挂载命令
配置docker服务端(C/S架构)
配置pycharm
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F452ce959-4724-4f77-9828-327e2072e846%2FUntitled.png?table=block&id=4ea75e51-41fb-4a85-9363-54800d69a648&cache=v2)