Docker镜像类似于虚拟镜像,是一个只读的文件,包括进程需要运行所需要的可执行文件、依赖软件、库文件、配置文件等等。
而容器则是基于镜像创建的进程,可以利用容器来运行应用。
总结来说,镜像只读,容器是动态的,我们又可以基于容器创建新的镜像,而docker就是帮助我们实现这些功能的应用引擎。
本教程实现在深度学习环境下安装配置docker
配置一个镜像只需要执行
直接使用官网脚本自动安装即可
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
测试docker是否安装成功
sudo docker help
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。例如:科大镜像,阿里云等等。
以阿里云为例:阿里云镜像获取地址
然后在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请健该文件)
{“registry-mirrors":["https://XXX.mirror.aliyuncs.com/"]}
之后重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
1.首先注册一个账号,然后在本地登录
sudo docker login
登录成功后,我们就可以在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
- i:交互式操作
- t:终端
- lingjunlh/torch1.9.1-cuda11.1:v2: 镜像名字: 镜像标签
- /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命令执行代码
这里直接根据官方教程安装即可。
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
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成新的镜像,方便下一次使用~