Docker+PyCharm远程调试环境隔离解决方案
Docker+PyCharm+Miniconda实现深度学习代码远程调试和环境隔离

本文详细介绍了如何在局域网环境下,利用Docker、PyCharm和Miniconda构建一个高效的深度学习远程调试平台。首先在服务器(server)上,通过Docker构建包含不同CUDA环境的镜像,以运行容器并实现环境的隔离。通过位于主机(host)的PyCharm,将项目代码deploy至容器中,从而实现远程debug或代码运行。为了处理容器内产生的大量数据文件,这些文件将被挂载到服务器的存储设备上。此外,通过在服务器(Windows系统)上设置文件分享,与主机建立连接,便于用户在主机上访问和浏览由深度学习应用产生的数据。这种配置确保Host内的项目代码只能在Host上被修改,而server上的数据文件只能在host上被预览且不可更改,从而最大程度上保障了数据的安全性和完整性。
环境说明
- Windows 11 23H2
- Docker Desktop 4.34.2(Windows)
- Docker Engine v27.2.0
- PyCharm 2024.2.1
- GeForce 3060Ti
路由配置
WAN口接入互联网,LAN口接host和servers,为LAN口配置静态ip(例如本文主图的静态ip配置)。
关于路由:我选用的是水星(Mercury)MR100GP-AC 商用5口千兆有线路由-250元。
Docker设置(Windows系统)
以Windows上Docker Desktop 4.34.2 (167172)为例。
环境配置
docker图标右键,switch to Linux containers切换至Linux container!如果显示switch to Windows containers说明已经在Linux container环境了,跳过该步骤即可。

设置里builders把desktop-Linux设置为default builder.

网络配置
设置里general->expose daemon on tcp://localhost:2375选项开启。(让其他软件可以调用docker的daemon接口)

that only can be accessed via tcp://127.0.0.1, My inner IP address 192.168.3.9 doesn’t work. The document said to edit the C:\ProgramData\Docker\config\daemon.json and add “hosts”: [“tcp://0.0.0.0:2375”], but it’s doesn’t work for any IP address, I’m very sure I did it as the document.
不要尝试上述方案,因为不起作用。请按下述方式进行。
管理员身份运行Windows powershell,运行(监听+防火墙):
netsh interface portproxy add v4tov4 listenport=2375 connectaddress=127.0.0.1 connectport=2375 listenaddress=192.168.1.3 protocol=tcp
netsh advfirewall firewall add rule name="docker_daemon" dir=in action=allow protocol=TCP localport=2375
listenaddress=192.168.1.3是我server的静态ip,你应当修改为你的server的实际地址。
设置docker的proxy才能拉取镜像,或者换源(大部分镜像最近都失效了或者只能在校园/公司网内部使用)。

注意,上述ip和port应当改成你自己局域网内的proxy地址。
连接测试
pycharm(2024.2): settings->build,execution,deployment->docker

通过TCP socket连接server’s docker,若virtual machine path那个框内有项目,可以先把里面的项目删掉。看是否显示connection successful.

然后你可以在pycharm里远程控制docker on the server.(找到侧边栏services或快捷键alt+8)。你可以自行探索一下pycharm的远程docker控制功能有哪些。

构建image
直接pull image
我构建好的镜像已上传my docker hub,可以直接pull,避免手动构建失败:
- GeForce 3060Ti适用
- 此镜像从nvidia官方镜像
nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04构建
docker pull sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04
image push命令:
docker push sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04 # The push refers to repository [docker.io/sylvanding/my-cuda]
从Dockerfile手动构建
我的server使用GeForce 3060Ti(以此为例),我们从nvidia官方镜像nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04开始构建dockerfile:
- 继承官方cuda和cudnn runtime环境
- 安装工具包(最重要的是openssh-server将用于pycharm远程连接)
- 修改root用户登录密码
- 修改openssh配置文件,允许远程连接
- 安装
nvidia-container-toolkit(会根据当前容器环境自动选择合适的版本),从而使nvidia-smi等命令可以运行 - 安装miniconda
- 设置工作目录和暴露接口
上述dockerfile文件如下:
FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu20.04LABEL maintainer="sylvanding@qq.com"# set env
# https://stackoverflow.com/questions/61388002/how-to-avoid-question-during-the-docker-build
ENV TZ=Asia/Shanghai \DEBIAN_FRONTEND=noninteractiveRUN apt-get update && apt-get install -y \wget \curl \git \bzip2 \vim \openssh-server \&& rm -rf /var/lib/apt/lists/*# change root pwd
ARG USERPWD=123456
RUN echo "root:${USERPWD}" | chpasswd# openssh config
RUN mkdir /var/run/sshd
RUN echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config.d/ssh_config.conf \&& echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config.d/ssh_config.conf
RUN service ssh restart# install nvidia-container-toolkit
# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
## configure the production repository
RUN curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o \/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
## update the packages list from the repository
RUN apt-get update
## install the NVIDIA Container Toolkit packages
RUN apt-get install -y nvidia-container-toolkit# install Miniconda
# https://docs.anaconda.com/miniconda/#quick-command-line-install
RUN mkdir -p ~/miniconda3
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
RUN bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
RUN rm ~/miniconda3/miniconda.sh
## initialize newly-installed Miniconda
RUN ~/miniconda3/bin/conda init bashWORKDIR /reposEXPOSE 22 8080
各个组件的版本选择:显卡驱动 → CUDA → CUDA Toolkit → cuDNN → Pytorch
通过命令构建image
docker build --build-arg HTTP_PROXY=http://192.168.1.2:10811 -f ./path/to/your/Dockerfile -t sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04 .
注意:修改你的http_proxy才能顺利构建环境(国内)。
在pycharm里构建image
打开编写的dockerfile,edit设置build image的配置:

name是你这个run configuration的名称,server选择你刚刚添加的docker服务器接口,注意:在build args中添加http_proxy才能顺利构建环境(国内)。之前设置的proxy只是docker desktop的proxy,这里构建镜像时要再次指定! 最后,apply和run。


创建容器
pycharm里选中image右键create container.

docker run配置:
- server: 设置为之前配置的网络docker
- bind ports: 将container 22端口映射到server的2222端口
- bind mounts: 将container的
/repos工作路径挂载到server的E:\repos,方便以后直接在server(Windows)里设置E:\repos文件夹网络共享文件 - env variables: 为container设置proxy,记得更换为你自己的
- run options:
--gpus all
docker run -p 2222:22 -v E:\repos:/repos --env http_proxy=http://192.168.1.2:10811 --env https_proxy=http://192.168.1.2:10811 --name cuda113-cudnn8-ubuntu20 --pull missing --restart always --gpus all sylvanding/my-cuda:11.3.1-cudnn8-runtime-ubuntu20.04

☑️ container创建成功:

PyCharm项目部署和远程同步(基于Windows文件共享)
pycharm项目部署
settings->deployment->new SFTP

新建ssh连接

❌ 若test connection提示:Cannot connect to remote host: net.schmizz.sshj.transport.TransportException: Server closed connection during identification exchange,首先尝试重启ssh服务
docker exec cuda113-cudnn8-ubuntu20 service ssh restart. 若依然无法连接,检查/etc/ssh/sshd_config.d/*.conf和/etc/ssh/sshd_config等ssh配置文件和防火墙配置,修改正确后重启ssh服务再次进行test connection.
root path设置为工作目录;Rsync可根据个人需求选择是否开启。

设置项目mapping路径:local path是本地项目路径 --mapping>> deployment path是server上相对于root path的远程项目路径。

向server的development path推送项目:选中需要推送的项目(比如我的project是DBlink),工具栏tools->deployment->upload…,建议开启automatic upload.
⚠️ 不推荐使用Deployment中的 Mapping 设置,为记录的完整性在此列出相关操作。更推荐在配置远程interpreter时直接设置项目同步(见下一节),原因如下:
- Deployment 功能主要用于将本地开发环境中的文件部署到远程服务器上。这包括将代码文件、资源和相关配置文件传输到线上环境或开发测试服务器中。
- SSH 连接解释器中的 Sync Folders 设置,主要用于同步本地和远程解释器环境中的文件,以便在远程服务器上运行和测试代码,同时保持本地和远程环境的代码一致性。非常适合于远程开发场景,可以在本地编辑代码并直接在远程环境下运行和调试。
Deployment 主要用于部署,而 Sync Folders 更侧重于持续的开发和实时调试。如果是开发过程中频繁需要测试代码,即利用远程资源和环境,则使用 SSH 解释器的 Sync Folders 更为合适;如果主要是将更新推送到生产或测试环境,使用 Deployment 功能会更直接有效。 ——generated by GPT

推送成功结果查看:

pycharm远程miniconda环境解释器配置
通过ssh连接远程container,调用miniconda,获取miniconda中的所有虚拟python环境。设置双向文件同步。
settings->project->python interpreter->add interpreter ->on ssh

⚠️ 这里并非创建基于docker的interpreter,因为我的之前run的container cuda环境在多个项目中是可以复用的,因此我们在container中用miniconda创建虚拟环境是一种更好的选择。

自动读取远程环境配置…

选择conda environment,设置conda虚拟环境。sync folders填写工作路径/repos/your project name,勾选自动上传到服务器。

查看interpreter配置结果:

查看同步情况:

查看从container->server的挂载是否成功:

Windows文件共享
⚠️ 测试发现,pycharm可以实现本地文件的Automatic upload,但无法实现服务器端文件更新后传回本地。事实上,在深度学习模型训练、测试过程中产生的大量数据文件也不需要传回本地,可以使用Windows的文件共享实现在server端共享挂载的文件夹,在本地预览server上的文件,选择需要的数据文件进行下载,降低本地存储大小。
在host和server(均为Windows操作系统)上开启网络共享。

server
server: 在局域网上共享container挂载的E:\repos:/repos.


server上也可以管理共享或查看所有共享:

host
Host: 在host上挂载server共享的repos文件夹:




这样,数据文件存放在远端电脑,而host可以通过文件共享的方式预览文件(并不会下载文件到本地)。
Windows通过SSH连接实现远程显存监控
Server(Windows)
Windows开启SSH-server服务
检查 OpenSSH 的可用性
管理员身份打开powershell并运行:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

如果任何 SSH 客户端或服务器功能不可用,请根据 PowerShell (Admin) 中的要求使用以下命令。
安装 OpenSSH 服务器
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

再次检查可用性。

修改ssh-server配置文件
默认情况下,OpenSSH 客户端和 OpenSSH 服务器位于以下目录:C:\Windows\System32\OpenSSH. 管理员身份打开记事本,再在记事本里打开配置文件sshd_config_default.

修改如下部分:
- PermitRootLogin yes
- PasswordAuthentication yes
保存。搜索service服务:

找到openssh ssh server服务,修改启动方式为“自动”,点“启动”。然后apply and ok.

Host(-)
Host通过ssh服务测试连接server(Windows ssh):
ssh admin@192.168.1.3
显卡状态监控:
nvidia-smi -l 5
测试pytorch能否正常使用显卡
参考官方文档安装pytorch后,尝试运行下述代码:
import torchprint(torch.cuda.is_available())
输出true,则pytorch cuda版运行正常。
原创声明:©️ 本文为博主原创文章,转载需注明出处——https://blog.csdn.net/IYXUAN
相关文章:
Docker+PyCharm远程调试环境隔离解决方案
DockerPyCharmMiniconda实现深度学习代码远程调试和环境隔离 本文详细介绍了如何在局域网环境下,利用Docker、PyCharm和Miniconda构建一个高效的深度学习远程调试平台。首先在服务器(server)上,通过Docker构建包含不同CUDA环境的镜…...
数字化转型的理论框架对比:从多维视角指导企业成功变革对比DPBOKIT4ITCOBITTOGAF
数字化转型的多维框架解析 在数字化时代,企业如何有效实现数字化转型已成为其生存和发展的关键问题。然而,市场上关于数字化管理的各种框架和理论并存,企业需要根据自身的需求选择最适合的指导路径。本文将通过对几个核心理论框架的对比&…...
【C++掌中宝】深入解析C++命名空间:有效管理代码的利器
文章目录 前言1. namespace 的价值2. namespace 的定义3. 命名空间的本质4. 嵌套的命名空间5. 命名空间的使用6. using 指令7. 补充结语 前言 假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外&am…...
2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
目录 21.合并两个有序链表 题目描述 题目链接 解题思路与代码 2.两数相加 题目描述 题目链接 解题思路与代码 --------------------------------------------------------------------------- 21.合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返…...
Python学习的主要知识框架
Python的主要学习知识点非常广泛且深入,但我可以为您概括一些核心的学习领域,帮助您系统地掌握Python编程。以下是Python学习的主要知识框架: 1. Python基础语法 数据类型:整数、浮点数、字符串、布尔值、列表、元组、字典、集合…...
LLaMA-Factory 使用 alpaca 格式的数据集
LLaMA-Factory 使用 alpaca 格式的数据集 flyfish alpaca 格式最初与Stanford大学的一个研究项目相关联,该项目旨在通过少量高质量的数据来微调大型语言模型。它受到了Alpaca模型(一种基于LLaMA的指令跟随模型)的影响,该模型是在…...
【Mysql】Mysql数据库基础
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
一文彻底让你搞懂轨迹规划(总结)
机器人在运行中不可避免的会进行运动,那么就会产生出轨迹规划的概念。 轨迹规划的特点:用一定的函数形式表示控制量(位置,速度,加速度)的控制律,根据约束或最优目标,求取控制控制参…...
windows C++ 并行编程-异步消息块(二)
overwrite_buffer 类 concurrency::overwrite_buffer 类与 unbounded_buffer 类类似,只不过 overwrite_buffer 对象仅存储一条消息。 此外,当目标接收来自 overwrite_buffer 对象的消息时,不会从缓冲区中删除该消息。 因此,多个目…...
【软件基础知识】什么是 API,详细解读
想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…...
计算机四级-计算机网络
一、基础知识 1.对计算机网络发展具有重要影响的广域网是:ARPANET 随机争用型的介质访问控制方法起源于:ALOHANET 2.计算机网络发展阶段: A)第一阶段的主要成果是计算机技术与通信技术的结合 B)第二阶段的主要成果…...
【linux 获取时间】
linux 获取时间接口 我们在开发调试过程中,可能遇到一些和调用时序相关的问题,为了查看哪个步骤先调用,哪个步骤后调用,我们可以使用函数打印或者主动trace堆栈…但是有的时候我们需要排查2个接口调用的时间间隔,我们可…...
Dockerfile部署xxljob
使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时,通常会使用xxljob容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服…...
Conda新建python虚拟环境问题
Conda新建python虚拟环境问题: 【问题1】 conda create --name yolov8 python3.10 -y Retrieving notices: …working… done Channels: defaults Platform: win-64 Collecting package metadata (repodata.json): failed UnavailableInvalidChannel: HTTP 404 NO…...
这几个优秀的工具网站真心值得推荐——搜嗖工具箱
即时工具 https://www.67tool.com/ 这是一个专注提升效率的办公工具网站;这也是一个拥有260多款自研在线工具和200多个客户端离线工具的服务网站;这还是一个可以满足包括视频处理、音频处理、图片处理、文档处理、文档转换、办公辅助、图表生成、文本工…...
ESP32开发 -- VSCODE+PlatformIO环境安装
参看官网安装:PlatformIO IDE for VSCode 一、安装PlatformIO IDE 参看:日常生活小技巧 – Visual Studio Code 简单使用 扩展中搜索platformIO IDE 当安装完提示重启之后。 打开一个要创建新工程的文件夹: 点击 Create New Project&…...
MySQL--导入SQL文件(命令行导入)
MySQL--导入SQL文件 一、前言二、导入SQL文件 一、前言 用可视化编辑工具编写,并且在控制台输入命令行在MySQL中导入SQL文件。 在导入SQL文件之前查看了目前存在的数据库 **目标:**在可视化编辑工具(这里以word文档为例)中编写SQL语句&…...
【C#基础】函数传参大总结
目录 前言参数是值类型的情况1. 按值传递(Pass by Value)2. 按引用传递(Pass by Reference)使用 ref使用 in 3. 输出参数传递(Output Parameters)参数修饰符对比小结 参数是引用类型的情况1. 按值传递类对象…...
初学51单片机之IO口上下拉电阻相关
本案本来是描述一下I2C总线的,在此之前推荐一下B站一个UP关于时序图的讲解 I2C入门第一节-I2C的基本工作原理_哔哩哔哩_bilibili 不过在描述I2C前先简单的探讨下51单片机IO口下拉电阻的基本情况,事实上这个问题困扰笔者很长时间了,这次也是一…...
Resnet50网络——口腔癌病变识别
一 数据准备 1.导入数据 import matplotlib.pyplot as plt import tensorflow as tf import warnings as w w.filterwarnings(ignore) # 支持中文 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
