PyCharm通过SSH连接Docker容器实现Python远程开发与调试

PyCharm连接Docker容器开发 场景介绍 很多时候我们部署一个东西到服务器上的时候,难免会污染已有环境,尤其某个东西比较复杂我们需要反复测试时 此时我们很自然的想到,在服务器上部署一个容器解决问题,如果是正常流程我们应该写Dockerfile构建容器,但是我们想更快,更方便 思路很简单,启动一个CentOS7镜像,如有必要这个镜像我们甚至能够直接启动到生产服务器上去,这个镜像一般暴露2个端口足够,一个用来SSH通信,一个对外提供自身的服务 然后我们借助PyCharm等专业开发工具,远程连接到这个容器里(通过SSH协议即可),这样PyCha 阅读详情

1. 为什么你需要这个组合?告别环境地狱

我猜你肯定遇到过这种场景:项目在你自己电脑上跑得好好的,一发给同事或者部署到服务器上,就各种报错——“ModuleNotFoundError”、“版本不兼容”、“系统依赖缺失”。这就是让所有开发者头疼的“环境地狱”。更别提当你需要在Windows上开发,但最终要部署到Linux服务器时,那种跨平台的酸爽了。

我自己就踩过不少坑。记得有一次,一个数据分析项目用了几个特定的科学计算包,本地调试一切正常,结果在测试服务器上死活装不上某个C扩展。折腾了两天,最后发现是GCC版本和系统底层库的问题。那时候我就在想,要是能有一个“一模一样”的环境,从开发到部署无缝衔接该多好。

后来,我把目光投向了Docker和PyCharm的组合。Docker能打包一个完整的、隔离的应用环境(我们称之为“容器”),而PyCharm作为我们最熟悉的Python IDE,如果能直接连接并操作这个容器,那不就像是在本地开发一样了吗?这个想法让我兴奋了很久。实测下来,这套方案不仅解决了环境一致性问题,还带来了几个意想不到的好处:环境隔离干净(每个项目一个容器,互不干扰)、快速重建(环境坏了?几秒钟用镜像重新拉一个)、方便协作(直接把Dockerfile和镜像给同事,他立刻拥有和你一模一样的环境)。

所以,这篇文章就是把我这几年用PyCharm连接Docker容器进行远程开发和调试的实战经验,手把手分享给你。无论你是想为团队建立标准的开发环境,还是单纯受够了配置环境的繁琐,这套方法都能让你事半功倍。我们不用讲太多复杂理论,直接开干,从零开始构建一个支持SSH的Python开发容器,并让PyCharm像操作本地文件夹一样操作它。

2. 打造你的专属开发容器:从零构建带SSH的Python镜像

万事开头难,但第一步走稳了后面就顺了。我们的目标是创建一个Docker镜像,它既要包含我们需要的Python开发环境,还要开启SSH服务,让PyCharm能够远程登录进来。别担心,我们一步一步来。

2.1 准备工作:安装必备工具

工欲善其事,必先利其器。首先,确保你的机器上已经安装了这两样东西:

  1. Docker:这是我们的容器引擎。去Docker官网下载对应你操作系统(Windows/macOS/Linux)的Docker Desktop安装就行。安装后,在终端输入 docker --version 能显示版本号,就说明安装成功了。
  2. PyCharm Professional(专业版):这是关键!只有专业版才支持SSH远程解释器和远程调试功能。社区版是没有的。如果你是在校学生或教师,可以用教育邮箱免费申请授权。这是投资,绝对值得。

2.2 第一步:创建一个带SSH的基础CentOS镜像

我们选择CentOS 7作为基础,因为它比较稳定,生态也成熟。当然,你也可以换成Ubuntu,步骤大同小异。

首先,我们启动一个最基础的CentOS 7容器,进去配置SSH:

# 拉取并运行一个基础的CentOS 7容器
docker run -it --name centos_ssh_builder centos:7 /bin/bash

现在你已经进入了容器的命令行。我们在这个临时容器里安装和配置OpenSSH服务器:

# 1. 安装必要的软件
yum install -y openssh-server passwd vim

# 2. 设置root用户的密码,等会儿PyCharm连接要用(比如设为'your_secure_password')
passwd

# 3. 生成SSH服务需要的密钥文件
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''

# 4. 修改SSH配置,允许root用户通过密码登录
vim /etc/ssh/sshd_config

找到并确保以下两行配置是这样的(用 vim 的搜索功能,按/然后输入PermitRootLogin或UsePAM):

PermitRootLogin yes
UsePAM no

保存并退出vim(按 Esc,然后输入 :wq 回车)。

# 5. 为了方便,创建一个启动脚本
echo '/usr/sbin/sshd -D' > /run.sh
chmod +x /run.sh

好了,这个临时容器的使命完成了。我们退出容器(输入 exit),然后把它当前的状态保存为一个新的镜像,这样以后就不用重复配置SSH了。

# 退出容器后,在宿主机的终端执行
# 先查看刚才容器的ID或名字
docker ps -a

# 使用commit命令创建新镜像,命名为 centos:7-ssh
docker commit centos_ssh_builder centos:7-ssh

# 删除临时的构建容器
docker
PyCharm+SSH+Docker:搭建远程开发环境,解决环境不一致 在Python开发中,环境不一致是导致部署故障的常见根源。Docker容器化技术能提供一致的运行环境,而SSH则让远程连接更安全灵活。将两者结合,通过PyCharm的远程解释器功能,可以让本地代码在远程Docker容器中运行和调试,实现开发即部署。这种模式将环境隔离、依赖管理和团队协作统一化,非常适合多人共用开发环境或需要利用闲置服务器算力的场景。本文围绕PyCharm、SSH和Docker的集成,演示如何配置远程Docker解释器与运行环境,帮助开发者从繁琐的本地环境配置中解脱出来。 阅读详情

相关推荐

告别环境冲突!用PyCharm专业版+Docker容器打造纯净Python开发环境(附SSH配置避坑指南)

本文详细介绍了如何利用PyCharm专业版与Docker容器构建纯净的Python开发环境,解决环境冲突问题。通过优化Docker镜像配置、SSH服务设置及PyCharm深度集成,实现高效开发与调试,特别适合多项目协作和复杂依赖管理的场景。

weixin_30387423的博客 441

PyCharm通过SSH连接Docker容器实现远程Python开发环境配置

本文详细介绍了如何通过PyCharm专业版配置SSH连接至Docker容器,从而搭建一个与生产环境一致的远程Python开发环境。文章从构建支持SSH的Python Docker镜像入手,逐步讲解在PyCharm中配置SSH远程解释器、映射目录、管理依赖及调试的全过程,旨在解决开发环境不一致的痛点,提升开发效率和代码可移植性。

pytorch8learner的博客 606

PyCharm连接Docker镜像搭建Python开发环境

文章目录一、Docker使用Centos镜像安装Openssh服务二、PyCharm连接Docker总结 Pycharm的工具是具有通过SSH协议远程访问一个环境作为开发环境的功能的。那么只要创建一个支持SSH远程访问的容器,那么就可以提供作为开发环境了。 需要做的基本步骤: 构建一个支持SSH服务的镜像 centos:7-ssh 构建基于支持SSH服务,支持执行python3环境的镜像 python_env 配置Pycharm的调试环境使用SSH连接上python_env 配置Pycharm自动同步项目

云 网 数 智 安 量子 4027

OAK-D-Pro深度解析:从硬件融合到全天候SLAM实战

本文深度解析OAK-D-Pro硬件架构及其在SLAM领域的实战应用。作为SLAM的"六边形战士",OAK-D-Pro融合主动双目摄像头、结构光投射器、6轴IMU等传感器,实现全天候稳定工作。通过实测数据展示其在弱纹理环境、动态光照等复杂场景下的卓越表现,并提供SLAM实战技巧与开发指南,帮助开发者快速部署高效SLAM解决方案。

weixin_27244795的博客 183

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

FPGA远程升级避坑实录:用STARTUPE2原语搞定Flash时钟,K7325T实测有效

本文深入解析了FPGA远程升级中的STARTUPE2原语应用,特别针对K7325T芯片的Flash时钟问题提供了实测有效的解决方案。通过详细的原语工作机制、Vivado工程实现步骤及调试技巧,帮助工程师规避常见陷阱,提升远程升级的可靠性和效率。

weixin_42558093的博客 141

Navicat16/17数据库密码安全解析与实战解密指南

本文详细解析了Navicat 16/17版本中数据库密码的加密机制,并提供了实用的密码找回指南。通过导出连接文件获取加密密文,利用基于AES-128-CBC算法的本地HTML工具,可安全、离线地解密遗忘的密码。文章强调该方法仅适用于合法恢复自有密码,并给出了操作步骤与安全建议。

weixin_28835583的博客 466

Plecs standalone 4.9.5最新版本,赶紧来下载使用吧,需要做并网逆变器及光伏储能变换器的朋友赶紧下载起来

PLECS 4.9.5较4.7.1版实现全面升级:采用自适应求解器切换技术,支持多核CPU/GPU加速,仿真速度提升30-50%;新增模型引用功能,实现模块化设计;强化光伏/风电等新能源组件,支持多物理场耦合分析;优化代码生成功能,兼容多种硬件平台和FMU导入。新版特别适用于复杂电力电子系统、多域联合仿真及硬件在环测试项目,但对硬件配置要求更高。基础教学项目仍可使用4.7.1版本。建议用户根据项目复杂度选择升级方案。

2430

Auto.js实现视频号点赞自动化

摘要:本文介绍了一个微信视频号自动化点赞的实现方案。通过定位点赞图标和数量容器,点击点赞按钮后检测点赞数变化,若发现取消点赞则自动补点。核心代码包括:1)获取点赞容器和图标;2)记录点赞前后数量;3)判断是否误取消并补点;4)循环执行点赞和滑动页面操作。该方案解决了滑动页面可能导致误取消点赞的问题,实现了自动化批量点赞功能。文章强调仅供学习参考,提醒勿滥用该技术。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 2574

Fiori Elements 表格之 Tree Tables:从数据建模到交互行为的全链路剖析

SAP Fiori elements的Tree Table组件将分层数据以表格形式展示,支持展开/折叠操作,适用于组织结构、物料清单等多级数据场景。该组件在List Report和Object Page中均可使用,支持懒加载、多选、列冻结等标准表格功能,并与OData V4服务层级注解深度集成。后端需通过RAP或CAP建模提供层级数据,前端通过清单配置切换表类型。需注意在草稿模式下仅显示活动实体,且展开状态在编辑时不保留。性能方面建议采用懒加载策略,避免全量加载树节点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 159

推荐系统[六]:混排算法简介、研究现状混排技术以及MDP-DOTA信息流第三代混排调控框架,高质量项目实战。

混排是指将多个不同的推荐结果混合在一起,以提供更多样化的选择和更全面的覆盖。混排的目的是为了避免推荐系统出现过度偏向某些内容或类型的情况,从而提高推荐的多样性和准确性。混排的实现方式通常是基于多种推荐算法和数据源,通过加权和组合的方式来生成最终的推荐结果。信息流推荐算法的核心是理解用户兴趣,捕捉用户逛买意图,并据此做到高效的人货匹配。

丨汀、的博客 1930

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Themida 3.1.8.0 加壳技术实战指南:从配置优化到逆向对抗(十)
下一篇: 从零搭建SLAM环境:Sophus模板类安装与C++11配置实战
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值