Docker配置DL envs教程

Docker容器与镜像的区别

Docker镜像类似于虚拟镜像,是一个只读的文件,包括进程需要运行所需要的可执行文件、依赖软件、库文件、配置文件等等。
而容器则是基于镜像创建的进程,可以利用容器来运行应用。
总结来说,镜像只读,容器是动态的,我们又可以基于容器创建新的镜像,而docker就是帮助我们实现这些功能的应用引擎。

本教程实现在深度学习环境下安装配置docker

配置一个镜像只需要执行

  1. 从docker hub 上面下载一个基础镜像; 2. 然后在这个基础镜像的基础上安装python代码所需要的package; 3. 更新镜像。

一、安装Docker

直接使用官网脚本自动安装即可

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

测试docker是否安装成功

sudo docker help

二、Docker镜像加速

国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。例如:科大镜像,阿里云等等。

以阿里云为例:阿里云镜像获取地址

然后在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请健该文件)

{“registry-mirrors":["https://XXX.mirror.aliyuncs.com/"]}

之后重启服务

sudo systemctl daemon-reload
sudo systemctl restart docker

三、登录Docker hub

1.首先注册一个账号,然后在本地登录

sudo docker login

登录成功后,我们就可以在docker hub 直接拉去自己账号下的全部镜像

四、从Docker hub上面下载基础镜像

如果需在服务器上跑深度学习算法,需要下载pytorch-cuda 包镜像,执行一下命令:

sudo docker search torch1.9

选择一个合适的镜像下载即可

sudo docker pull lingjunlh/torch1.9.1-cuda11.1

这样我们就把这个镜像下载到了本地,使用如下命令进行查看

sudo docker images

五、根据镜像创建容器

镜像只是一个可读文件,需要创建容器来运行程序,因此根据镜像创建一个容器

sudo docker run -it lingjunlh/torch1.9.1-cuda11.1:v1 /bin/bash
  1. i:交互式操作
  2. t:终端
  3. lingjunlh/torch1.9.1-cuda11.1:v2: 镜像名字: 镜像标签
  4. /bin/bash: 命令操作
    在这里插入图片描述
    这样就进入了容器,该容器的ID为26…, 一个容器就相当于一个进程,是镜像的实例化,利用包含了程序运行的环境和配置环境,例如python, cuda, list。 我们可以在容器中执行命令,例如pip list。

六、在容器内安装所需要的包

通常情况下,为了达到我们自己的目标,还需要在基础镜像的基础上安装新的包,这一过程可以直接在容器内进行,具体操作和在本地命令行操作一样,即直接在容器内通过conda install或者pip install。安装完之后用exit命令退出容器。

七、更新镜像

容器动态,镜像静态。我们在容器中更新了python包,如果以后可以持久化使用,还需要使用commit将容器打包为镜像。

docker commit -m="update packages" -a="XXX" 26.... XXX/pymarl:v1

-m: 提交描述信息
-a: 指定镜像作者
26…: 容器ID
XXX/pymarl:v1:作者名/镜像名:标签

在这里插入图片描述
查看镜像,可以看到我们已经成功的构建了自己的镜像pymarl:v1

在这里插入图片描述

之后我们就可以直接利用该镜像创建容器,在容器里跑代码啦~

八、在本地使用容器运行代码

为了测试镜像能否正常运行我们的代码,可以先在本地用容器测试一下。

首先我们需要创建一个本地Ubuntu系统和docker容器共享的文件夹:

sudo mkdir /data
sudo docker run -v /data :/data-itd  zhouxuanhan/pymarl:v1 bash

在这里插入图片描述
然后将代码cp到/data 下,这样该目录下就和容器中的/data 目录互通,查看此时正在运行的容器。

sudo docker ps

在这里插入图片描述
该容器就是我们刚刚所创建的用于本地测试代码的容器,用docker attach进入容器

sudo docker attach 500...

之后的步骤就是与在本地系统命令行的操作一样,进入代码的文件夹,用python命令执行代码

九、安装nvidia-cuda

这里直接根据官方教程安装即可。

Installation Guide — NVIDIA Cloud Native Technologies documentation

安装完nvidia-cuda之后,再创建容器时加上**–gpus all**,即可在容器内调用cuda,即

sudo docker run -v /data:/data -itd --gpus all zhouxuanhan/pymarl:v1 bash

十、推送镜像到Docker Hub

sudo docker push XXX/pymarl:v1

常见命令

1. 查看所有镜像  docker images
2. 查找镜像         docker search XXXimage
3. 下载镜像         docker pull XXXimages:tag
4. 删除镜像         docker rmi XXXimages:ta
5. 启动容器         docker run -it aimge:tag /bin/bash
6. 退出容器         exit
7. 查看正在运行的容器 docker ps
8. 进入正在运行的容器 docker attach container-ID
9. 查看已停止运行的容器  docker ps -a
10.启动已停止的容器   docker start container-ID
11.停止容器   docker stop container-ID
12.重启已停止的容器 docker restart container-ID
13.退出容器终端 docker exec
14.更新镜像    1.先用镜像创建容器 docker run -it image:tag /bin/bash
               2.在容器内操作,然后commit 提交容器副本创建新的镜像
               docker commit -m=‘description' -a='author' container-ID author/image:tag2 

总结

总结一下,镜像实际上就是一个虚拟的操作系统,容器是镜像的实例化,在容器里操作和在本地系统的命令行操作没有任何区别,容器如果发生了改变,可以直接commit成新的镜像,方便下一次使用~

你可能感兴趣的:(docker,深度学习)