简要介绍:
Docker 包括三个基本概念:
镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
具体请自行查看其他资料,下面开始进入正题。
1. Pytorch环境的配置
由于我使用的是学校的服务器,之前一直用的conda环境来使用服务器的gpu,使用一般登入服务器会直接登录一个用户,但是这里每个用户只是用文件夹区分,本身不是一个linux的子系统,使用如果需要使用docker,这时候一定要进入root,也就是切换到root用户才可以使用docker(这样就不需要sudo的指令了)
以下的记录将从零开始配置一个torch的环境:
- 切换到root用户
su root
- 安装docker
yum install docker
- 启动docker服务
service docker start
- 查看docker版本
docker version
- 为了加速下载,配置下载源
vi /etc/docker/daemon.json
- 在/etc/docker/daemon.json文件中添加以下内容
{
“registry-mirrors”: [“https://registry.docker-cn.com”],
“live-restore”: true
}
- 下载镜像
docker pull library/hello-docker
- 查看当前镜像
docker images
- 运行image文件
docker run hello-world
- 查看当前的容器
docker ps -a
- 现在直接删除镜像是不行的,需要删除容器,再删除镜像
docker rm 2f9001bc1e8c # 其中2f9001bc1e8c是容器名
docker rmi feb5d9fea6a5 # 其中feb5d9fea6a5是镜像名
- 现在下载一个pytorch的镜像(在docker.hub中寻找)
docker pull pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel
显示以上画面表示下载成功
- 在镜像中创建一个容器
docker run -it pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel /bin/bash
可以看见,现在进入了容器的一个workspace目录里面了;@后面的0d10ba3b0aaf就是启动的容器id
- 重命名容器
docker rename old_name new_name
这里我改为testtorch
- 拷贝文件到容器中
docker cp MLP 95909784d85b:/workspace/
- 进入容器中
docker exec -u 0 -it testtorch /bin/bash
查看路径文件,确实可以看见之前拷贝过来的MLP文件,pip install必要的包之后,就可以在容器里面跑代码了.
- vim出现问题:bash:vim:command not found
但是,一般想通过vim编辑器来查看里面的代码,但是这时出现了也问题
ERROR: Could not find a version that satisfies the requirement vim
ERROR: No matching distribution found for vim site:blog.csdn.net
或者是
E: Unable to locate package vim
以上的问题,可以通过下面的方法来解决
pkg update # 更新源 # apt update # 更新源的另一种方式 apt install vim # 安装
之后就可以正常代开编辑了:
但是我发现此时是没有使用gpu的,torch.cuda.is_available()显示为False
如何退出当前容器?在宿主机敲以下命令即可
docker stop testtorch
此时容器端就会主动退出,如下所示:
可以看见,我尝试过在容器内输入docker exit是没有用的,在宿主机中输入docker stop testtorch后,容器就会退出到宿主机界面中,可以看见:root@95909784d85b:/workspace/MLP# -> [root@localhost LLC]# 的改变。
- 这里重现创建一个gpu环境,命名为torch_gpu的容器
docker run -it --name torch_gpu --gpus all pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel /bin/bash
同时在宿主机中再拷贝项目到容器内
# 以下两个命令均可 docker cp MLP 365febc3316d:/workspace docker cp MLP torch_gpu:/workspace
现在可以看见,没有workspace里面没有文件,现在有了MLP这个项目
在这个容器内,可以跑gpu了
pip安装需要的包之后,就可以跑代码了,如下所示:
所以最后,这里创建了两个pytorch的深度学习环境,如下所示:
2. Docker命令行总结
常用的命令行总结如下:
# 安装docker yum install docker # 开启docker服务: service docker start # 列出所有docker镜像的命令: docker images # 删除指定docker镜像的命令: docker rmi anibali/pytorch # 下载一个新的镜像的命令: docker pull anibali/pytorch:1.7.0-cuda11.0 # 运行新镜像,创建一个cpu运行的容器 # -i: 交互式操作。 # -t: 终端。 # /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash docker run -it --name torch_cpu anibali/pytorch:1.7.0-cuda11.0 /bin/bash # 运行新镜像,创建一个gpu运行的容器 docker run -it --name torch_gpu --gpus all anibali/pytorch:1.7.0-cuda11.0 /bin/bash # 查看所有的容器命令如下: docker ps -a # 查看当前正在运行的容器命令如下: docker ps -l # 启动已被停止的容器 docker start CONTAINER_ID/CONTAINER_NAME # 停止运行中的容器 docker stop CONTAINER_ID/CONTAINER_NAME # 重启容器 docker restart CONTAINER_ID/CONTAINER_NAME # 删除容器(-f是指强制执行) docker rm -f CONTAINER_ID/CONTAINER_NAME docker rm CONTAINER_ID/CONTAINER_NAME # 进入容器 docker exec -it CONTAINER_ID/CONTAINER_NAME /bin/bash # 重命名容器 # docker rename <Old_Name> <New_Name> docker rename testtorch torch_gpu # 拷贝本地文件到容器 # docker cp 本地路径 容器ID:容器路径 # docker cp <Local_File> <CONTAINER_ID/CONTAINER_NAME>:/workspace/ docker cp MLP 95909784d85b:/workspace/ # 查看容器端口的映射情况 docker port CONTAINER_ID/CONTAINER_NAME # 指定宿主机与容器端口的映射(通过参数-p指定端口映射) docker run -it -d --name CONTAINER_NAME -p 8088:80 IMAGE_NAME # 保存容器为镜像 docker commit -a <Auther_Name> <CONTAINER_ID/CONTAINER_NAME> <Version_Number>
参考资料:
pytorch: 使用docker
Nvidia-Docker配置python3与pytorch环境
Docker 简单的命令行总结