一.什么是Docker?
Docker是一个开源的容器化平台,可帮助开发者轻松地创建、部署和运行应用程序。Docker
使开发人员能够在一个独立的容器中打包应用程序及其依赖项,这样他们就可以轻松地将应用程序移植到任何其他环境中。
Docker比起虚拟环境更轻量、更方便,其包括Docker客户端(“命令行工具”)、Docker守护程序、Docker镜像(应用程序及依赖项的打包版本)、Docker容器(Docker镜像的运行实例)、Docker仓库(存储Docker镜像的地方)。
二.Windows11家庭中文版本下Docker的安装
(17条消息) 【Win11家庭中文版本Docker Desktop安装指北】_docker desktop设置中文_迷茫的老鸟的博客-CSDN博客
个人参考教程一步步安装之后,并不能在命令窗中采用wsl查看容器的信息,docker ps命令也存在一些问题,且Docker Destop会有一个关于wsl的错误提示/警告。直接忽略这些,当我在使用这种情况下的docker部署一个基于ubuntu的容器时,在此容器中许多命令是无法使用的,因此我打算尝试早基于虚拟机的Linux系统中使用docker部署项目。
三.Linux系统的安装
运用docker运行一个容器时常用命令是:sudo docker run hello-world
如果自己的docker中不存在这个容器,则会从远程仓库中获取,在实际操作时常常出现获取超时的情况,个人建议添加镜像源 -> Linux docker设置国内镜像_Marvin_Xavier的博客-CSDN博客
四.Linux虚拟环境中python环境的配置
参考教程 -> Ubuntu中的python环境
个人在运行sudo apt -y upgrade时报错:无法获得锁 /var/lib/dpkg/lock...... -> 解决方法:在命令行依次输入sudo rm /var/cache/apt/archives/lock和sudo rm /var/lib/dpkg/lock即可。之后会发现更新速度过慢,可以更换apt-get镜像源 -> Ubuntu apt-get 国内镜像源替换
五.Mediapipe手势识别Demo通过Docker部署
手势识别Demo详见 -> 基于Mediapipe的姿态识别_mediapipe姿态识别_蔚蓝o的博客-CSDN博客
我尝试了基于虚拟机在linux系统中通过docker部署项目,部署时可以成功部署的,但由于虚拟机还是占用我一部分CPU内核,使用Ubuntu18.04时速度太慢,最终我还是决定用windows中的docker来部署,而碰到的wsl问题,上网搜索尝试解决即可。
首先说明关于Docker的一个问题及解决方式:docker容器启动后就自动关闭但容器有logs的解决方式 -> docker run --name Container_name(容器名)-dit image_name(镜像名) /bin/bash,随后利用docker ps查看正在运行容器的ID -> docker exec -it Container ID(容器ID) /bin/bash,个人是这样解决的。
5.1 -> 部署到基于Python3.7.13的镜像中
项目结构如上,其中main.py是主程序,requirements.txt是python虚拟环境导出(进入虚拟环境后键入pip freeze > requirements.txt即可)所需的依赖库,此处我在部署的过程中发现import cv2和import mediapipe会报错,而在本地是没有问题的,通过检查发现opencv-python和mediapipe库亦是存在的,最终解决方案是再安装一个opencv-python-headless库,这里需要手动添加至requirements.txt文件中亦或在Dockerfile中多加一行命令。
main.py文件稍作修改,内容如下:
#导包
import cv2
import mediapipe as mp
# 绘图模块
myDraw = mp.solutions.drawing_utils
# 手部识别模块
mpHands = mp.solutions.hands
hands = mpHands.Hands(
static_image_mode=True, # 图片
max_num_hands=1, #单手检测
min_detection_confidence=0.8,
min_tracking_confidence=0.8
)
# 自定义函数:返回关键点之间的距离
def distance(m, n):
return ((n.x-m.x)**2+(n.y-m.y)**2)**0.5
for i in range(3):
img = cv2.imread('./gestures/' + str(i + 1) + '.jpg')
results = hands.process(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
# 判断手势的代码
base = 0.3 # 辅助以判断手势
distance_0_5 = distance(handLms.landmark[0], handLms.landmark[5]) # 0和5号关键点之间的距离
distance_0_8 = distance(handLms.landmark[0], handLms.landmark[8])
distance_0_12 = distance(handLms.landmark[0], handLms.landmark[12])
distance_0_16 = distance(handLms.landmark[0], handLms.landmark[16])
distance_0_20 = distance(handLms.landmark[0], handLms.landmark[20])
gesture = "None"
if distance_0_8 >= base and distance_0_12 >= base and distance_0_16 < base and distance_0_20 < base:
gesture = "Scissor"
if distance_0_8 >= base and distance_0_12 >= base and distance_0_16 >= base and distance_0_20 >= base:
gesture = "Paper"
if distance_0_8 < base and distance_0_12 < base and distance_0_16 < base and distance_0_20 < base:
gesture = "Rock"
cv2.putText(img, gesture, (50, 50), 0, 1, (0, 0, 255), 2)
myDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)
# 保存图片
cv2.imwrite('./results/' + str(i + 1) + '.jpg', img)
Dockerfile的内如如下:
# 基础镜像
FROM python:3.7.13
# 拷贝本地配置
ADD . /home/test
# 指定后续工作目录
WORKDIR /home/test
# 对镜像执行操作 -> 下载所需的库
RUN pip3 install -r /home/test/requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple
RUN pip3 install opencv-python-headless -i https://pypi.mirrors.ustc.edu.cn/simple
# 运行文件
CMD ["python", "/home/test/main.py"]
在文件夹下运行docker build -t cvdemo . 构建完成后 -> docker run --name test cvdemo,显示信息 -> INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
运行该命令后,进入容器可以看到results文件夹下已经有了结果图片,但直接在docker镜像中查看较为繁琐,因此可以导出查看 -> docker cp Container ID(容器ID):/home/test/results D://test(自己设定即可),结果如下:
5.2 -> 部署到基于Ubuntu的镜像中
项目结构、main.py与requirements.txt文件均与5.1相似,Dockerfile文件内容如下:
# 基础镜像
FROM ubuntu:latest
# 拷贝本地配置
ADD . /home/test
# 指定后续工作目录
WORKDIR /home/test
# 对镜像执行操作 -> 下载所需的库
RUN apt-get update
# -y代表在ubuntu镜像中对Y/n回复为yes
RUN apt-get -y upgrade
RUN apt-get install -y python3
RUN apt-get install -y pip
RUN pip install -r /home/test/requirements.txt -i https://pypi.mirrors.ustc.edu.cn/simple
# 匹配opencv-python版本,以避免出错
RUN pip install opencv-python-headless==4.5.5.64 -i https://pypi.mirrors.ustc.edu.cn/simple
# 运行文件
CMD ["python3", "/home/test/main.py"]
到D盘可以找到容器中的结果图片如下:
5.3 -> 上传自己的镜像到Docker Hub中
首先要注册一个docker hub账号,然后使用docker login登录自己的账号(我的是ca1mli3)
登录成功之后会出现Login Succeeded,随后使用docker images查看镜像,输入docker push cvdemo:latest但显示访问被拒绝,这时需要用tag给镜像改标签(与用户名一致),如下:
稍等片刻,上传成功!
情况说明:以上内容是个人在学习docker过程中碰到的一些问题及解决方案,希望对你有所帮助,如有问题,欢迎讨论!