Docker基础

本文介绍了如何在Windows11和Linux环境下安装Docker,包括在WindowsWSL中的问题、Linux虚拟机和Ubuntu中的Python环境配置,以及Mediapipe手势识别Demo的Docker部署。作者分享了解决Docker容器自动关闭和依赖库导入问题的方法。
摘要由CSDN通过智能技术生成

一.什么是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系统的安装

基于​​​​​虚拟机安装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过程中碰到的一些问题及解决方案,希望对你有所帮助,如有问题,欢迎讨论!

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值