AI容器化部署开发尝试 (一)(Pycharm连接docker,并部署django测试)

news/2024/5/19 15:39:07

目标:使用容器化技术快速部署AI应用进行开发。

注意:从 Docker 19.03 开始,Docker 引入了对 NVIDIA GPU 的原生支持,因此若AI要调用GPU算力的话docker版本也是有要求的,后面博客测试。

当然本篇博客还没设计到GPU的调用,主要Pycharm加Anaconda的方案用习惯了,现在改用docker进行部署,不知道怎么连接Pycharm,毕竟IDE都没有还开发个P的AI(大佬除外)。这里由于我以后要做AI部署到云服务器的项目得要个后端,就以django这个后端框架的部署为例了。

主要是给出一直比较舒服的开发方案,即通过docker将项目文件夹挂载到宿主机中,而编译环境在docker容器中,Pycharm则调用docker容器的编译环境,来看代码,并且通过Pycharm中的Terminal对容器的环境进行管理。
这样既可以享受到Pycharm的操作,又可以获得docker优秀的环境迁移的方便性。
(远程ssh部署调试的话先鸽,因为我还是建议在本地完成后直接通过容器的方式快速部署到其他远端的宿主机上,主要是我还没买云GPU服务器)
在这里插入图片描述

一.简介

Docker 技术与 PyCharm 的整合:加速未来 AI 技术的快速部署

在人工智能 (AI) 的快速发展过程中,技术工具的整合与优化不断推动着开发效率的提升。Docker,作为一种开源的容器化平台,提供了一种高效、轻量级的方法来封装和运行应用,确保了应用在不同环境中的一致性和可移植性。而 PyCharm,作为一款广受欢迎的 Python 开发环境,其对 Docker 的支持使得开发者能够在一个集成的环境中更便捷地开发、测试和部署 AI 应用。

  1. 环境一致性和便捷性:Docker 容器确保了从开发到生产环境的无缝过渡,每个容器都包括用于运行软件的完整和标准化的运行时环境。这解决了常见的“在我机器上可以运行”的问题,大大减少了环境配置导致的延误。

  2. 快速迭代与部署:通过使用 Docker,AI 开发者可以快速地打包他们的应用和所有依赖,简化部署过程。PyCharm 的 Docker 集成允许开发者直接在 IDE 中管理容器,从而提高开发速度和迭代效率。

  3. 可扩展性和资源管理:Docker 容器的轻量级特性使得在不同的硬件和云环境中部署和扩展 AI 应用变得更加简单和成本效率。这对于需要大量计算资源的 AI 模型训练和推理尤为重要。

  4. 多版本和实验管理:AI 开发常常需要测试多个版本的模型和算法。Docker 容器可以轻松管理不同版本的 AI 应用,而 PyCharm 提供的工具可以帮助开发者跟踪不同实验的性能。

  5. 安全性:Docker 提供了隔离的环境,可以有效地分隔不同应用和实例,增强了安全性。这对于处理敏感的 AI 数据尤其重要。

注意本章解释的部署:django的工程文件是处于容器外的不是在容器里面,这样方便工程代码的更新(以及后续的自动化部署),以及没安装docker desktop 安装指南的先安装了再说。

二.编写docker配置

准备好配置好的,docker-compose.yml , Dockerfile , requirements.txt , 以及django的工程文件,(特别注意文件之间的目录关系!)
配置文件0积分下载CSDN偷改积分了叫我。

然后在 docker-compose.yml 目录下输入

docker-compose up -d

若安装有问题要全删除使用命令 bash docker-compose down 还是删除不了则使用 bash docker rm -f 容器ID或名称 成功后你可以看到如下,说明成功的部署上了django的容器

在这里插入图片描述
在这里插入图片描述

注意由于我在Dockerfile中的配置,我是打算连接上pycharm后手动控制开启django服务的,因此容器启动后是无法自动开启django工程的,如果你确定你的django工程代码写好了,并且想让容器开启就运行,你可以按照下面代码这样修改 Dockerfile 的内容

# 使用官方 Python 3.7 运行时作为父镜像
FROM python:3.7# 设置容器内的工作目录为 /app
WORKDIR /app# 将当前目录内容复制到位于 /app 中的容器中
COPY . /app# 安装 requirements.txt 中指定的任何需要的程序包
RUN pip install --no-cache-dir -r requirements.txt# 使端口 8000 可用于外界访问
EXPOSE 8000# 定义环境变量
ENV NAME World# 在容器启动时运行 manage.py, (完成调试后开启!)
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

然后用以下命令来重新构建服务的镜像并启动容器:

docker-compose up -d --build

以我提供的代码为例,修改后这样启动,那么在镜像开启后,就会自动开启django服务并,这时用浏览器访问 http://localhost:8000/ 就可以看到成功的页面了 在这里插入图片描述

二.pycharm连接本地docker

在 PyCharm 中配置 Docker 容器作为 Python 解释器并不需要设置 Docker 的 SSH 服务。您可以直接通过 PyCharm 的内置 Docker 集成来实现。请确保您已经在您的 Windows 机器上安装了 Docker Desktop,并且 Docker 正在运行。然后,您可以按照以下步骤来配置 Docker 容器作为 Python 解释器:

步骤 1: 配置 Docker 服务

  1. 打开 PyCharm。
  2. 转到 File -> Settings(或使用快捷键 Ctrl+Alt+S)。
  3. 在设置窗口中,选择 Build, Execution, Deployment -> Docker
  4. 点击 + 图标来添加一个新的 Docker 配置。
  5. Docker API URL 中,如果您使用的是 Docker Desktop,默认应该可以使用 unix:///var/run/docker.sock(Linux)或 npipe:./pipe/docker_engine(Windows)。通常 PyCharm 会自动检测并填写。
  6. 点击 Apply 保存设置。

步骤 2: 添加 Docker 容器作为 Python 解释器

  1. 在设置窗口中,转到 Project: [您的项目名称] -> Python Interpreter
  2. 点击右下角的齿轮图标,选择 Add
  3. 在弹出的窗口中,选择左侧的 Docker
  4. Configuration 下拉菜单中选择您刚刚配置的 Docker 服务。
  5. Image name 输入框中,输入您的 Django 应用的 Docker 镜像名称。这个名称应该与您的 Dockerfile 中定义的镜像名称相对应。
  6. PyCharm 会自动尝试获取镜像中的 Python 解释器路径。如果无法自动检测,您可能需要手动指定 Python 执行路径(通常是 /usr/bin/python3 或相似路径)。
  7. 点击 OK 保存配置。
    在这里插入图片描述在这里插入图片描述

若出现连接失败如下

在这里插入图片描述
当您在 PyCharm 中遇到无法连接到 Docker 守护进程的问题时,通常是因为 Docker 没有正确设置来允许通过 TCP 连接,或者 Docker 守护进程根本就没有运行。以下是一些检查和解决步骤:

检查 Docker 是否在运行

  1. 打开命令提示符或 PowerShell:您可以在 Windows 中搜索 “cmd” 或 “PowerShell”,然后打开它。

  2. 运行 Docker 版本检查命令

    docker --version
    

    这将显示 Docker 的版本,如果 Docker 没有运行或没有正确安装,这个命令可能会报错。

  3. 检查 Docker 服务状态

    docker info
    

    如果 Docker 正在运行,这个命令会显示 Docker 的详细信息。如果 Docker 没有运行,您将看到一个错误消息,提示 Docker 守护进程没有运行。

确保 Docker 允许 TCP 连接

默认情况下,Docker 可能不允许通过 TCP 连接。您需要确保 Docker 配置为允许远程 API 访问。对于 Docker Desktop 用户:

  1. 打开 Docker Desktop:点击 Windows 任务栏中的 Docker 图标。

  2. 设置:在 Docker Desktop 的界面上,点击设置图标(通常位于右上角)。

  3. 选择 General(常规):确保勾选了 “Expose daemon on tcp://localhost:2375 without TLS”。这允许无 TLS 的本地 TCP 连接。
    在这里插入图片描述

  4. 应用 & 重启:更改设置后,确保点击应用 & 重启,使设置生效。

重新配置 PyCharm

在确保 Docker 守护进程运行并配置了 TCP 连接后,返回到 PyCharm 进行如下操作:

  1. 重试连接:回到 Settings -> Build, Execution, Deployment -> Docker,重新尝试连接。

  2. 检查防火墙设置:确保没有防火墙规则阻止了从 PyCharm 到 Docker 的连接。

通过以上步骤,您应该能够解决 PyCharm 无法连接到 Docker 守护进程的问题。如果问题依然存在,可能需要进一步检查网络设置或咨询 Docker/PyCharm 的官方支持。

步骤 3: 使用 Docker 容器运行和调试您的应用

  • 现在,可以使用配置的 Docker 解释器来运行和调试您的 Django 应用。在 PyCharm 的运行/调试配置中,选择您刚刚创建的 Docker 解释器。
  • 选择运行或调试按钮来启动您的应用。PyCharm 将在 Docker 容器中执行您的应用,并允许您利用 PyCharm 的调试工具进行调试。

这样,就可以在 PyCharm 中利用 Docker 容器作为 Python 解释器,无需配置 SSH,便于在相同的开发环境中运行和调试您的 Django 应用。
在这里插入图片描述

点击确定后,可观察到docker desktop中出现pycharm连接用的对应的docker 容器的启动
在这里插入图片描述

在这里插入图片描述

Path Mappings是否设置

Path mappings 是用来链接本地开发环境中的文件路径和 Docker 容器内部的文件路径。这在进行源代码调试时尤为重要,因为它确保了 PyCharm 能够正确地对应到源代码位置。

另外是否需要配置 Path Mappings?

  • 如果您的应用在运行和调试时不依赖于具体的文件路径,或者您的 Docker 容器已经通过 Dockerfile 或者 docker-compose.yml 文件正确地映射了所有必要的卷(volumes),那么可能不需要手动设置路径映射。
  • 如果您在调试中遇到问题,例如断点不工作或者文件路径错误,那么您可能需要设置路径映射。

如何配置 Path Mappings?

如果您决定需要配置路径映射,可以按照以下步骤操作:

  1. 打开 PyCharm 的 Settings/Preferences。

  2. 导航到 Project: [您的项目名称] -> Python Interpreter

  3. 在 Python 解释器页面,点击您配置的 Docker 解释器旁边的齿轮图标,选择 Show All...

  4. 在弹出的窗口中,选择您的 Docker 解释器,然后点击 Edit 按钮(铅笔图标)。

  5. Interpreter Path 下方,您会看到 Path mappings 的选项。点击 ... 来添加或编辑映射。

  6. 您需要添加本地路径以及对应的容器内路径。例如:

    • Local path: C:\Users\YourName\PycharmProjects\YourProject
    • Remote path: /app (假设您的 Docker 容器中项目位于 /app)
  7. 确认添加后,点击 OK 保存设置。

通过正确配置路径映射,您将能够更顺畅地在 Docker 容器中使用 PyCharm 进行开发和调试。如果您在配置过程中遇到任何问题,可以重新检查您的 Docker 容器设置或咨询相关文档。

三.设置 Terminal 直接控制 Docker 容器

如果想在 PyCharm 的 Terminal 中直接控制 Docker 容器,需要配置 PyCharm 使其 Terminal 使用 Docker 容器的 shell。以下是如何在 PyCharm 中设置这一功能的步骤:

1. 打开 PyCharm 设置

首先,打开 PyCharm 的设置或首选项:

  • 在 Windows 上,这通常在 “File” 菜单下的 “Settings”。
  • 在 macOS 上,这通常在 “PyCharm” 菜单下的 “Preferences”。

2. 配置 Terminal

  • 在设置界面中,导航到 “Tools” -> “Terminal”。
  • 在此界面中,您可以找到一个叫做 “Shell path” 的设置项,这里可以配置要启动的 shell 命令。

3. 设置 Docker 命令

  • 在 “Shell path” 字段中,输入用于连接到 Docker 容器的命令。这通常看起来像这样:
    docker exec -it <container_name_or_id> /bin/bash
    
    其中 <container_name_or_id> 替换为您的 Django 容器的名称或 ID。如果您的容器使用的是不同的 shell(比如 /bin/sh),请相应调整。
    例如我这里是 docker exec -it f_cloud-django-1 /bin/bash
    不过有时因为环境变量的原因会失败,因此如果不行的话还是用带有docker.exe路径的更全都命令如下
"C:\Program Files\Docker\Docker\resources\bin\docker.exe" exec -it f_cloud-django-1 /bin/bash

在这里插入图片描述

4. 应用并关闭设置

  • 完成设置后,点击 “OK” 或 “Apply” 保存并关闭设置窗口。

5. 测试 Terminal

  • 打开 PyCharm 的 Terminal 面板(通常在 IDE 底部的标签页中)。它应该会启动一个新的 session,连接到您的 Docker 容器中。
  • 在 Terminal 中,您现在应该能够运行与 Docker 容器内部环境相关的命令。

如下可看到在pycharm中的Terminal与直接进入docker后的效果相同

6.设置teminal失败

看起来您遇到了在 PyCharm 中设置 Terminal 连接 Docker 容器时的问题。出现这种情况可能有几个原因:

1. Docker 容器未运行

首先,请确保 Docker 容器 f_cloud-django-1 正在运行。您可以使用以下命令来检查容器的状态:

docker ps

这会列出所有正在运行的容器。如果您的容器没有在运行,您需要先启动它。

2. Docker 命令路径

如果您在 Windows 系统上运行 PyCharm,并且 Docker 命令没有在系统的 PATH 环境变量中,PyCharm 可能无法直接调用 docker 命令。您可以尝试在命令前指定 Docker 的完整路径。例如:

"C:\Program Files\Docker\Docker\resources\bin\docker.exe" exec -it f_cloud-django-1 /bin/bash

这里的路径 "C:\Program Files\Docker\Docker\resources\bin\docker.exe" 是假设的,根据您的实际安装路径调整。

3. Shell 路径格式问题

在 Windows 上,有时候直接在 PyCharm 的 Terminal 设置中使用 docker exec 命令会遇到问题,因为 Windows 和 Unix/Linux 系统的命令行环境有所不同。您可以尝试使用以下方法之一来解决这个问题:

  • 使用 Windows Subsystem for Linux (WSL):
    如果您已经在 Windows 上安装了 WSL,可以尝试通过 WSL 来运行 Docker 命令:

    wsl docker exec -it f_cloud-django-1 /bin/bash
    
  • 使用 PowerShell 脚本:
    您可以创建一个 PowerShell 脚本来启动 Docker 容器的 shell,然后在 PyCharm 中设置该脚本为 Terminal 的启动命令。

4. 检查日志文件

PyCharm 提示查看 idea.log 文件以获取详细信息。您可以按照提示操作,通过 “Help | Show Log in Explorer” 查看日志文件,里面可能包含更具体的错误信息帮助诊断问题。

如果上述步骤仍然不能解决问题,您可能需要检查更多的配置细节或者考虑联系技术支持。同时,确保 PyCharm 和 Docker 均更新到最新版本,以避免可能的兼容性问题。

注意
  • 确保 Docker 容器在执行这些步骤之前已经在运行状态。
  • 如果您频繁需要连接到不同的 Docker 容器,可能需要根据当前工作需求调整 Terminal 设置。

四.完成环境部署开始调试验证

完成所有部署后,以后开发的是否就像下面的流程
1.打开docker desktop 确保django容器启动
2.打开pycharm进行编辑代码(还是IDE香,用vim什么的就算了,难度太大…)
3.使用Terminal进行django的启动,以及各类包的管理

(这样,通过安装例如numpy,opencv等的包到镜像中,以后就可以很方便的直接通过拷贝镜像的方法迁移环境了,比使用anaconda要更加的方便, 当然有些AI程序由于是GPU调用的原因需要宿主机安装,这个以后讨论)

如下图就是在Terminal中运行 Django 开发服务器命令的效果:

python manage.py runserver 0.0.0.0:8000

在这里插入图片描述


http://www.mrgr.cn/p/40086114

相关文章

IIR滤波器的设计与实现(内含设计IIR滤波器的高效方法)

写在前面&#xff1a;初学者学习这部分内容&#xff0c;要直接上手写代码可能会感到比较困难&#xff0c;我这里推荐一种高效快速的设计IIR,FIR滤波器的方法——MATLAB工具箱&#xff1a;filterDesigner。打开的方法很简单&#xff0c;就是在命令行键入&#xff1a;filterDesig…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心&#xff0c;在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍&#xff0c;感兴趣可以参考安装。 背…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

如何从0到1设计诊断系统

诊断系统设计主要涵盖了诊断方案设计、诊断需求定义和诊断数据库开发。本文会逐一介绍这些环节,以便更好地理解和把握诊断系统设计的全貌。引言在整车电子电气体系中,诊断系统的设计扮演着至关重要的角色,负责支持整车的刷写、故障排查和EOL(End of Line)等关键操作。这一重…

springboot实现https双向认证

1.生成证书#生成服务端密钥文件localhost.jks keytool -genkey -alias xdd-server -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore xdd-server.jks -dname CN=pero,OU=pero,O=pero,L=sz,ST=gd,C=cn -validity 3650 -storepass xxx-password-xxx -keypass xxx-pass…

JDK源码分析-Vector

概述 Vector 是 Java集合中线程安全的动态数组,它也可以根据需要进行扩容和缩容,与 ArrayList 类似。但有一个重要的区别,Vector 是同步的,也就是它的操作是线程安全的,在某些特定场景下是可以保证线程安全的,但同时也会带来性能损耗,因此在单线程环境通常还是推荐使用 …

(windows ssh) windows开启ssh服务,并通过ssh登录该win主机

☆ 问题描述 想要通过ssh访问win主句 ★ 解决方案 安装ssh服务 打开服务 如果这里开不来就“打开服务”&#xff0c;找到下面两个开启服务 然后可以尝试ssh链接&#xff0c;注意&#xff0c;账号密码&#xff0c;账号是这个&#xff1a; 密码是这个 同理&#xff0c;如果…

【React】Sigma.js框架网络图-入门篇

一、介绍 Sigma.js是一个专门用于图形绘制的JavaScript库。 它使在Web页面上发布网络变得容易&#xff0c;并允许开发人员将网络探索集成到丰富的Web应用程序中。 Sigma.js提供了许多内置功能&#xff0c;例如Canvas和WebGL渲染器或鼠标和触摸支持&#xff0c;以使用户在网页上…

改善员工绩效管理的 8 种最佳方法

企业如何改进绩效管理体系,才能获得最好的结果?请仔细阅读,找出答案… 人力资源部门对组织的成功起着至关重要的作用,组织的员工也是如此。更好的组织管理会带来更高的利润。人力资源部门的工作很大一部分就是规范绩效管理体系,营造员工能做出最好的工作、发挥最大能力的工…

【数据结构】时间复杂度的例题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 &#x1f337;例题1&#xff1a; &#x1f337;例题2&#xff1a; &#x1f337;例题3&#xff1a; &#x1f337;例题4&am…

amCharts图像分类

代码案例<!DOCTYPE html> <html><head><script src="https://cdn.amcharts.com/lib/5/index.js"></script><script src="https://cdn.amcharts.com/lib/5/xy.js"></script><script src="https://cdn.am…

车用MCU,R7F701320EAFP、R7F701321EAFP、R7F701322EAFP、R7F701323EAFP微控制器功耗低,闪存容量高达2MB

RH850/P1M 是适用于底盘系统的汽车微控制器,功耗低,闪存容量高达 2 MB,RAM 容量高达 128 KB。RH850/P1M——适用于底盘系统的汽车用微控制器 简介 RH850/P1M 微控制器功耗低,闪存容量高达 2 MB,RAM 容量高达 128 KB,具有增强型电机控制定时器、CAN 接口、SENT 和 PSI5 等…

Recommended Azure Monitors

General This document describes the recommended Azure monitors which can be implemented in Azure cloud application subscriptions. SMT incident priority mapping The priority “Blocker” is mostly used by Developers to prioritize their tasks and its not a…

主打熟人双向社交,UXLINK 如何用群组打造超强社交生态

社交&#xff0c;作为最强 Web3 流量入口 Web2 世界里&#xff0c;社交产品总是最具想象力。全球使用 Facebook 系列产品的日活用户&#xff08;DAP&#xff09;均值近 30 亿人&#xff0c;占全球人口的 1/3。然而&#xff0c;加密货币用户仅约有 4.2 亿&#xff0c;占全球人口…

Apache RocketMQ ACL 2.0 全新升级

我们推出了 RocketMQ ACL 2.0 升级版,进一步提升 RocketMQ 数据的安全性。本文将介绍 RocketMQ ACL 2.0 的新特性、工作原理,以及相关的配置和实践。作者:徒钟 引言 RocketMQ 作为一款流行的分布式消息中间件,被广泛应用于各种大型分布式系统和微服务中,承担着异步通信、系…

说说你对分而治之、动态规划的理解?区别?

一、分而治之 分而治之是算法设计中的一种方法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并 关于分而治之的实现,都会经历三个步骤:分解:将原问题分解为若干个规模较小,相对独立,与原问题…

【C语言】深入解析选择排序算法

一、算法原理二、算法性能分析三、C语言实现示例四、总结 一、算法原理 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小&#xff08;或最大&#xff09;元素&#xff0c;放到已排序的序列的末尾&#xff…

科普:嵌入式代码软件在环(SiL)测试的可靠性

​​关键词:嵌入式系统、软件在环(SiL)、测试、生命周期01.简介当前,嵌入式系统开发的大趋势为通过软件实现大量的硬件功能,这导致软件的复杂程度显著上升——代码开发成本和风险也成倍增加。复用已有系统中的软件组件是改进嵌入式系统生命周期的一种可能的解决方案,对代…

hitcontraining_heapcreator

[BUUCTF]hitcontraining_heapcreator UAF|Off-By-One|堆溢出 对应libc版本libc6_2.23-0ubuntu9_amd64 [*] /home/bamuwe/heapcreator/heapcreatorArch: amd64-64-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: No PIE (0x3fc000)bamu…

django自定义构建模板,通过bootstrap实现菜单隐藏和显示

实现后的界面1.自定义页面模板实现 主页面代码(home.html) {% extends layout.html %} #引用模板 {% load static %} {% block content %}<h3>欢迎登录</h3> {% endblock %}自定义内容layout.html文件设置(模板){% load static %} {% load menu %} #导入me…