Docker | 深度学习中的docker看这一篇就够啦

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

1.了解Docker 

1.1.为什么要用docker?

1.2.可以用docker做什么?

1.3.docker 框架

2.Docker 的基本使用

3.实例 :VS code远程连接服务器上的docker环境

3-1:环境框架可视化及ssh连接搭建pytorch深度学习环境

3-2:搭建一个新的容器pytorch深度学习环境Create New Env - GPU 版本)

3-3:创建一个TensorFlow深度学习环境Create New Env:Tensorflow

 安装OpenCV

 安装相关依赖,再安装 dlib

 Docker container set Caffe正在进行时

3-4:创建第二个版本的TensorFlowCreate Env:Tensorflow

总结Summary

问题与解决(PS)

[PS1]

[PS2]

[PS3]ImportError: libGL.so.1: cannot open shared object file: No such file or directory

[PS4]docker容器中执行vim命令报错bash: vim: command not found

[PS5]

[PS6]

[PS7]

[PS8]

[PS9] 

[PS10]VS code 打不开服务器的docker 容器

 参考文献


1.了解Docker 

1.1.为什么要用docker?

容器没有二进制映像这使得 docker 与其他虚拟工具相比占用的空间要少得多。

1.2.可以用docker做什么?

  • 模拟系统:Ubuntu等
  • 配置深度学习环境:Pytorch/Tensorflow等

1.3.docker 框架

Docker[1] 使用客户端-服务器架构。Docker 客户端与 Docker 守护进程它负责构建、运行和 分发Docker 容器。Docker 客户端和守护程序可以在同一系统上运行也可以将 Docker 客户端连接到远程 Docker 守护 进程。Docker 客户端和守护程序使用 REST API 通过 UNIX 进行通信 套接字或网络接口。另一个 Docker 客户端是 Docker Compose 这是一组容器组成的应用程序。

Docker 守护程序Docker daemon 监听 Docker API 请求并管理 Docker 对象例如映像、容器、网络和卷。守护进程也可以 与其他守护程序通信以管理 Docker 服务。

Docker 客户端 Client是许多 Docker 用户交互的主要方式 与 Docker 一起。当使用命令时客户端会发送这些命令 执行这些命令。该命令使用 Docker API。Docker 客户端可以与多个守护程序通信。

Docker注册表Docker registriesDocker 注册表存储 Docker 映像。Docker Hub 是公共的 任何人都可以使用的注册表并且 Docker 配置为在 默认情况下为 Docker Hub。您甚至可以运行自己的私有注册表。使用 or 命令时所需的图像是 从配置的注册表中提取。使用该命令时 映像将推送到配置的注册表。

镜像Images镜像是只读模板其中包含有关创建 Docker 的说明 容器。通常一个图像基于另一个图像还有一些额外的 定制。例如您可以构建一个基于该映像的映像但会安装 Apache Web 服务器和您的应用程序以及 使应用程序运行所需的配置详细信息。

容器Containers容器是映像的可运行实例。您可以创建、启动、停止、 使用 Docker API 或 CLI 移动或删除容器。可以连接一个 容器到一个或多个网络将存储附加到其中甚至创建新的 基于其当前状态的图像。

默认情况下容器与其他容器的隔离相对较好并且 它的主机。可以控制容器的网络、存储、 或其他底层子系统来自其他容器或主机 机器。容器由其映像以及任何配置选项定义 在创建或启动它时提供它。删除容器后对未存储在持久存储中的状态将消失。

如图docker的原理是通过docker hub拉取镜像

通过镜像image建立容器

 整体如图容器通过操作

 三者之间的关系如下

2.Docker 的基本使用

[以下内容包括:Ubuntu user path    ]

启动docker

service docker start

 (chongqidiannao hou yijiu xuyao qidong docker)

  docker

docker info

 images

docker images

docker pull  

docker pull pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel

docker run 创建一个新的容器并运行一个命令Build and run

yufa:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明

  • -a stdin: 指定标准输入输出内容类型可选 STDIN/STDOUT/STDERR 三项

  • -d: 后台运行容器并返回容器ID

  • -i: 以交互模式运行容器通常与 -t 同时使用

  • -P: 随机端口映射容器内部端口随机映射到主机的端口

  • -p: 指定端口映射格式为主机(宿主)端口:容器端口

  • -t: 为容器重新分配一个伪输入终端通常与 -i 同时使用

  • --name="nginx-lb": 为容器指定一个名称

  • --dns 8.8.8.8: 指定容器使用的DNS服务器默认和宿主一致

  • --dns-search example.com: 指定容器DNS搜索域名默认和宿主一致

  • -h "mars": 指定容器的hostname

  • -e username="ritchie": 设置环境变量

  • --env-file=[]: 从指定文件读入环境变量

  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行

  • -m :设置容器使用内存最大值

  • --net="bridge": 指定容器的网络连接类型支持 bridge/host/none/container: 四种类型

  • --link=[]: 添加链接到另一个容器

  • --expose=[]: 开放一个端口或一组端口

  • --volume , -v: 绑定一个卷

实例

docker run -it -e  /home/elena:/home/elena --gpus all --ipc host --net host --name torch_na pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel /bin/bash

如果出错可查看[PS]

也就是说以交互模式运行容器,为容器重新分配一个伪输入终端,设置环境变量为 /home/elena:/home/elena,使用 GPU版本,指定容器的网络连接类型为 host。

进入docker 容器

docker exec -it pytorch /bin/bash

这里/bin/bash表示载入容器后运行bash ,docker中必须要保持一个进程的运行要不然整个容器就会退出。这个就表示启动容器后启动bash。

再次返回到我们的容器。为此我们需要知道“容器 ID/名称”

docker ps

docker ps 是查看现在运行的docker 容器

docker ps -a

 docker ps -a 是查看docker 现有的所有容器

让我们做附加

docker attach 容器名称/容器id
  • 先按Ctrl+P然后再按Ctrl+Q:退出容器且容器在运行

  • Ctrl+D:退出容器且容器不在运行(停止容器)

  •   启动容器
docker start 容器名称/容器id

  •  进入容器
docker exec -it 容器名称/容器id /bin/bash

 默认根用户身份登录

  • 检查当前正在运行的进程(容器内查看)
top

 

如有4个进程它们是与主机进程隔离的进程。

 按Ctrl+P然后再按Ctrl+Q,

  • 检查容器内正在运行哪些进程(容器外查看)
docker top 容器名称/容器id

可以使用“docker top ”检查容器内正在运行哪些进程

  • 停止在后台运行的容器
docker stop 容器名称/容器id

docker ps 就可以看到容器没有在运行了.

删除容器

1)首先需要停止所有的容器

docker stop 容器id/名称

2)删除所有的容器(只删除单个时把后面的变量改为container id即可)

docker rm 容器id/名称

删除镜像

1)查看host中的镜像

docker images

2)删除指定id的镜像

docker rmi 镜像id/名称

3)删除全部的images

docker rmi 

3.实例 :VS code远程连接服务器上的docker环境

3-1:环境框架可视化及ssh连接搭建pytorch深度学习环境

默认所有镜像获取于docker hub,国内拉取可能会比较慢建议大家更改国内镜像

进入docker环境使用如下命令修改root用户密码passwd

注意这里的密码是后续在vscode中远程登录时需要输入的密码

创建环境

(要确认是下载到linux服务器里还是容器里)

linux服务器

安装openssh-server 

如果是root 

apt-get update
apt-get install openssh-server

如果是用户本文中都是用户操作

sudo apt-get update

sudo apt-get install openssh-server

 

然后设置两遍相同的密码之后登陆的时候要用到 4. 修改配置文件

vim /etc/ssh/sshd_config

用户操作

sudo vim /etc/ssh/sshd_config

 注释掉 PermitRootLogin prohibit-password 这一行 添加这一行 PermitRootLogin yes 5. 重启ssh服务

j :向下

i: 添加文本输入

x: 删除

先按快捷键ESC然后输入: wq 保存文件并退出

 

service ssh restart
# 或使用
# /etc/init.d/ssh restart

进入目录查看是否有sshd文件如果没有则使用如下命令创建 mkdir -p /var/run/sshd

woyou 

启动openssh-server

 /usr/sbin/sshd -D &

安装netstat apt-get install net-tools (如果已经安装可忽略)

查看sshd是否监听22端口 netstat -apn | grep ssh

 

在window上vscode中下载Remote-SSH插件

STEP 1 :拉取镜像把pytorch的环境下载到本地

 然后创建和运行容器than build and run container

docker run -it -e  /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name elena_torch  pytorch/pytorch:1.12.1-cuda11.3-cudnn8-devel /bin/bash 

验证是否可用

退出 python

exit()

 - exit是退出Python指令

复制ubuntu的文件夹到 容器内

 按Ctrl+P然后再按Ctrl+Q,回到ubuntu用户地址下。

ls

- ls指令查询当前位置所有文件夹

复制Ubuntu 本地文件到容器内

docker cp face_asian torch_na:/workspace

 - torch_na是docker容器名称后面跟得是容器内保存地址可以换自己想保存的路径

输入指令后就复制好了打开容器后到指定路径就会有文件存在

在VS code中也可以查看 

 

# 开启 docker 自启动
systemctl enable docker.service

# 关闭 docker 自启动
systemctl disable docker.service

3-2:搭建一个新的容器pytorch深度学习环境Create New Env - GPU 版本)

获取镜像

打开 Explore Docker's Container Image Repository | Docker Hub

 

pytorch中有很多版本点击标签tags,选择一个合适的

拉取pytorch-gpu版本镜像

创建并运行容器

docker run -it -e  /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name torchv2 pytorch/pytorch:1.13.1-cuda11.6-cudnn8-runtime /bin/bash

复制项目到容器内

docker cp face-att torchv2:/workspace

 

新建test的python文件

touch test.py

 test.py


print("hi")
 
import torch
print("torch v:"torch.__version__)
 
print("cuda used:"torch.cuda.is_available())
print(torch.version.cuda)
print(torch.backends.cudnn.version())
 
import platform
print(platform.python_version())
import torchvision
print(torchvision.__version__)

配置OpenCV下载opencv-python版本会出错这个版本不会

pip install opencv-python-headless

 

设置Tensorboard(Setting Tensorboard)

)

 docker pytorch容器 安装 tensorboard

pip install tensorboard

 if wrong,see [PS8]

docker pytorch容器 安装 matplotlib

pip install matplotlib

 3-3:创建一个TensorFlow深度学习环境Create New Env:Tensorflow

 

打开MobaXterm open  MobaXterm,拉取TensorFlow-gpu版本镜像

docker pull tensorflow/tensorflow:devel-gpu

 与上面的pytorch同理创建TensorFlow深度学习容器并运行

docker run -it -e  /home/elena/workspace:/home/elena/workspace --gpus all --ipc host --net host --name tf tensorflow/tensorflow:devel-gpu /bin/bash

 然后直接进入容器

打开win10系统的VS code Open VS code在Ubuntu用户下复制项目文件到TensorFlow深度学习容器内

复制命令如下 

docker cp face-att tf:/workspace

 - face-att是保存在我Ubuntu用户下的我的项目文件名

- tf:/workspace是容器名称后面跟的项目保存路径

在MobaXterm软件上进入docker容器:

安装deepface第三方库 Set Deepface

pip install deepface

 安装如图

 中间省略

可选择升级一下pip版本

/usr/bin/python3 -m pip install --upgrade pip

 

建立一个python文件 (build a file) ,叫做 deepface.py

touh deepfacetest.py

 因为容器内没有vim命令所以下载然后更新

apt-get install vim
apt-get update

( 如果这里出错查看P4)

建立并编辑一个python文件 

vim deepfacetest.py

 deepfacetest.py

from deepface import DeepFace

obj = DeepFace.analyze(img_path = "/workspace/data/face_asian/faces_JinChungChen/00000A02.jpg".jpg", 
        actions = ['age', 'gender', 'race', 'emotion']
)

#/workspace/data/face_asian/faces_JinChungChen/00000A02.jpg
print(obj)

 - 此处路径需要改为自己文件的图片路径

编辑完事后按快捷键 Esc 输入 :wq 退出并保存文件。

如果出错查看P5 if wrong see P5

运行刚编辑的python文件(Run deepfacetest.py)

也可以上传自己的文件从Ubuntu服务器到容器内

与配置pytorch深度学习环境同理复制文件到容器内

docker cp face_att_v1 tf:/workspace

 安装OpenCV

在OpenCV时安装得是opencv-python-headless,而不是opencv-python我一开始安装的就是opencv-python无法运行(because of cv and dlib,so install env) 。

pip3 install opencv-python-headless

 (远程服务器中docker 容器,配置dlib)

 安装相关依赖,再安装 dlib

依次安装文件

  • cmake
  • libgtk-3-dev
  • libboost-all-dev
  • dilb
apt-get install build-essential cmake

apt-get install libgtk-3-dev

apt-get install libboost-all-dev

 

pip3 install dlib

pip3 list 

 Docker container set Caffe正在进行时

 

3-4:创建第二个版本的TensorFlowCreate Env:Tensorflow

简单概括

#拉取TensorFlow-GPU版本镜像
docker pull tensorflow/tensorflow:1.11.0-devel-gpu-py3

#创建并运行docker容器
docker run --runtime=nvidia -it --name tf tensorflow/tensorflow:1.11.0-devel-gpu-py3 /bin/bash

#python验证
python -c "import tensorflow as tf;a=tf.constant(1);b=tf.constant(2);c=tf.add(a,b);sess=tf.Session();result=sess.run(c);print('The result is',result)"

 如图

4.将自己的深度学习环境打包成docker镜像

有时候我们自己开发的软件需要被其他人所应用。为了减少代码环境配置的时间成本我们可以将当前运行的容器进行打包并输出镜像文件传给使用者即可。

Docker commit 命令

docker commit [CONTANINER ID] [IMAGE NAME:TAG]

 docker commit :从容器创建一个新的镜像。 

# docker commit的其他参数

# -a :镜像作者名字

# -c :使用dockerfile指令来创建镜像

# -m :提交说明文字

# -p :暂停容器服务。

实例

将容器3e7433c86ec7 保存为新的镜像,并添加提交信息和说明信息。

docker commit -a="elena" -m="torch_na" 3e7433c86ec7 torch_na:torch1.12-cuda11.3-cudnn8-py3

-  3e7433c86ec7 是想要打包的容器id

-  torch_na 是想要打包的容器名称

 打包镜像

docker save -o torch_nlp.tar torch_nlp # 当前路径下会生成一个torch_nlp.tar

将tar包生成镜像

docker load < torch_na.tar # 生成的镜像跟之前打包的镜像名称一样
 

总结Summary

Container and Ubuntu GPU are irrelevant 

Docker是一种相对使用较简单的容器我们可以通过以下几种方式获取信息

1通过docker run执行命令或许返回信息

2通过docker logs去获取日志做有针对性的筛选

3通过systemctl status docker查看docker服务状态

4通过journalctl -u docker.service查看日志

5.如文章所示docker不仅可以模拟系统还可以搭建不同版本的环境在我们日常工作中省去了很多不必要的麻烦。

问题与解决(PS)

[PS1]

docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"process_linux.go:432: running prestart hook 0 caused \\\"error running hook: exit status 1, stdout: , stderr: nvidia-container-cli: requirement error: unsatisfied condition: cuda>=11.6, please update your driver to a newer version, or use an earlier cuda container\\\\n\\\"\"": unknown.
ERRO[0000] error waiting for container: context canceled

[PS2]

docker重启错误-重启命令一直卡住

systemctl重新启动docker卡住

未知原因可能是启动的容器数量过多或者磁盘IO问题

解决方式

systemctl启动docker-cleanup.service

systemctl启动docker

[PS3]ImportError: libGL.so.1: cannot open shared object file: No such file or directory

导入错误libgl.so.1无法打开共享对象文件没有这样的文件或目录

 如果您的应用程序依赖于cv2或opencv-python如果您尝试使用诸如 python:3.9-slim、python:buster 等图像构建 docker 容器并且如果您导入 cv2您将收到以下错误。

(pip uninstall opencv-python)

安装opencv-python-headless

(pip install opencv-python-headless)
代替opencv-python您可以安装opencv-python-headless包含没有外部依赖项的预编译二进制轮除了numpy并且适用于 Docker 等无头环境。

与此相比python3-opencv这是一个更轻量级的包并将 docker 映像大小减少了 700MB

[PS4]docker容器中执行vim命令报错bash: vim: command not found

原因分析 :因为vim没有安装。

apt-get install vim

 

 这时需要先执行命令apt-get update等更新完后在执行命令vim命令进行安装后就可以正常使用了!

apt-get update的作用是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引这样才能获取到最新的软件包,yiban qingkuangxia anzhaunghou douxuyao yong zhetiao mingling gengxinyixia 。

[PS5]

解决

pip3 install --update numpy

 [PS6]

 [PS7]

pip3 list

[PS8]

 TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).TypeError: 描述符不能被直接创建。
如果这个调用来自_pb2.py文件你的生成的代码已经过时了必须用protoc >= 3.19.0重新生成。
如果你不能立即重新生成你的protos其他一些可能的解决方法是。
 1. 将protobuf包降级到3.20.x或更低。
 2. 设置PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python但这将使用纯Python解析速度会慢很多。
解决方案

卸载重装!!!

[PS9] 

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: initialization error: nvml error: driver not loaded: unknown.

ERRO[0000] error waiting for container: context canceled

docker守护进程的错误响应创建shim任务失败。OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: 自动检测模式为'legacy'。
nvidia-container-cli初始化错误nvml错误驱动程序未加载未知。
ERRO[0000]等待容器的错误上下文取消了

原因分析没安装nvidia/cuda

sudo apt install nvidia-cuda-toolkit

[PS10]VS code 打不开服务器的docker 容器

 参考文献

【1】Docker overview | Docker Documentation

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker