目标:使用容器化技术快速部署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 应用。
-
环境一致性和便捷性:Docker 容器确保了从开发到生产环境的无缝过渡,每个容器都包括用于运行软件的完整和标准化的运行时环境。这解决了常见的"在我机器上可以运行"的问题,大大减少了环境配置导致的延误。
-
快速迭代与部署:通过使用 Docker,AI 开发者可以快速地打包他们的应用和所有依赖,简化部署过程。PyCharm 的 Docker 集成允许开发者直接在 IDE 中管理容器,从而提高开发速度和迭代效率。
-
可扩展性和资源管理:Docker 容器的轻量级特性使得在不同的硬件和云环境中部署和扩展 AI 应用变得更加简单和成本效率。这对于需要大量计算资源的 AI 模型训练和推理尤为重要。
-
多版本和实验管理:AI 开发常常需要测试多个版本的模型和算法。Docker 容器可以轻松管理不同版本的 AI 应用,而 PyCharm 提供的工具可以帮助开发者跟踪不同实验的性能。
-
安全性:Docker 提供了隔离的环境,可以有效地分隔不同应用和实例,增强了安全性。这对于处理敏感的 AI 数据尤其重要。
注意本章解释的部署:django的工程文件是处于容器外的不是在容器里面,这样方便工程代码的更新(以及后续的自动化部署),以及没安装docker desktop 安装指南的先安装了再说。
二.编写docker配置
准备好配置好的,docker-compose.yml , Dockerfile , requirements.txt , 以及django的工程文件,(特别注意文件之间的目录关系!)
配置文件0积分下载CSDN偷改积分了叫我。
然后在 docker-compose.yml 目录下输入
bash
docker-compose up -d
若安装有问题要全删除使用命令
bash docker-compose down
还是删除不了则使用bash docker rm -f 容器ID或名称
成功后你可以看到如下,说明成功的部署上了django的容器
注意由于我在Dockerfile中的配置,我是打算连接上pycharm后手动控制开启django服务的,因此容器启动后是无法自动开启django工程的,如果你确定你的django工程代码写好了,并且想让容器开启就运行,你可以按照下面代码这样修改 Dockerfile 的内容
bash
# 使用官方 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"]
然后用以下命令来重新构建服务的镜像并启动容器:
bash
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 服务
- 打开 PyCharm。
- 转到
File
->Settings
(或使用快捷键Ctrl+Alt+S
)。 - 在设置窗口中,选择
Build, Execution, Deployment
->Docker
。 - 点击
+
图标来添加一个新的 Docker 配置。 - 在
Docker API URL
中,如果您使用的是 Docker Desktop,默认应该可以使用unix:///var/run/docker.sock
(Linux)或npipe:./pipe/docker_engine
(Windows)。通常 PyCharm 会自动检测并填写。 - 点击
Apply
保存设置。
步骤 2: 添加 Docker 容器作为 Python 解释器
- 在设置窗口中,转到
Project: [您的项目名称]
->Python Interpreter
。 - 点击右下角的齿轮图标,选择
Add
。 - 在弹出的窗口中,选择左侧的
Docker
。 - 从
Configuration
下拉菜单中选择您刚刚配置的 Docker 服务。 - 在
Image name
输入框中,输入您的 Django 应用的 Docker 镜像名称。这个名称应该与您的Dockerfile
中定义的镜像名称相对应。 - PyCharm 会自动尝试获取镜像中的 Python 解释器路径。如果无法自动检测,您可能需要手动指定 Python 执行路径(通常是
/usr/bin/python3
或相似路径)。 - 点击
OK
保存配置。
若出现连接失败如下

当您在 PyCharm 中遇到无法连接到 Docker 守护进程的问题时,通常是因为 Docker 没有正确设置来允许通过 TCP 连接,或者 Docker 守护进程根本就没有运行。以下是一些检查和解决步骤:
检查 Docker 是否在运行
-
打开命令提示符或 PowerShell:您可以在 Windows 中搜索 "cmd" 或 "PowerShell",然后打开它。
-
运行 Docker 版本检查命令:
bashdocker --version
这将显示 Docker 的版本,如果 Docker 没有运行或没有正确安装,这个命令可能会报错。
-
检查 Docker 服务状态:
bashdocker info
如果 Docker 正在运行,这个命令会显示 Docker 的详细信息。如果 Docker 没有运行,您将看到一个错误消息,提示 Docker 守护进程没有运行。
确保 Docker 允许 TCP 连接
默认情况下,Docker 可能不允许通过 TCP 连接。您需要确保 Docker 配置为允许远程 API 访问。对于 Docker Desktop 用户:
-
打开 Docker Desktop:点击 Windows 任务栏中的 Docker 图标。
-
设置:在 Docker Desktop 的界面上,点击设置图标(通常位于右上角)。
-
选择 General(常规) :确保勾选了 "Expose daemon on tcp://localhost:2375 without TLS"。这允许无 TLS 的本地 TCP 连接。
-
应用 & 重启:更改设置后,确保点击应用 & 重启,使设置生效。
重新配置 PyCharm
在确保 Docker 守护进程运行并配置了 TCP 连接后,返回到 PyCharm 进行如下操作:
-
重试连接 :回到
Settings
->Build, Execution, Deployment
->Docker
,重新尝试连接。 -
检查防火墙设置:确保没有防火墙规则阻止了从 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?
如果您决定需要配置路径映射,可以按照以下步骤操作:
-
打开 PyCharm 的 Settings/Preferences。
-
导航到
Project: [您的项目名称]
->Python Interpreter
。 -
在 Python 解释器页面,点击您配置的 Docker 解释器旁边的齿轮图标,选择
Show All...
。 -
在弹出的窗口中,选择您的 Docker 解释器,然后点击
Edit
按钮(铅笔图标)。 -
在
Interpreter Path
下方,您会看到Path mappings
的选项。点击...
来添加或编辑映射。 -
您需要添加本地路径以及对应的容器内路径。例如:
- Local path:
C:\Users\YourName\PycharmProjects\YourProject
- Remote path:
/app
(假设您的 Docker 容器中项目位于/app
)
- Local path:
-
确认添加后,点击
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 容器的命令。这通常看起来像这样:
bashdocker 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路径的更全都命令如下
bash
"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
正在运行。您可以使用以下命令来检查容器的状态:
bash
docker ps
这会列出所有正在运行的容器。如果您的容器没有在运行,您需要先启动它。
2. Docker 命令路径
如果您在 Windows 系统上运行 PyCharm,并且 Docker 命令没有在系统的 PATH 环境变量中,PyCharm 可能无法直接调用 docker
命令。您可以尝试在命令前指定 Docker 的完整路径。例如:
bash
"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 命令:
bashwsl 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 开发服务器命令的效果:
bash
python manage.py runserver 0.0.0.0:8000
