目录
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:创建第二个版本的TensorFlow(Create Env:Tensorflow)
总结(Summary)
问题与解决(PS)
[PS1]
[PS2]
[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 registries):Docker 注册表存储 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:创建第二个版本的TensorFlow(Create 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)"
如图
总结(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