【优雅至极】利用VSCode进行远程Linux服务器、容器开发,达到ide开发项目的效果

news2025/7/23 8:17:19

本文将介绍“局域网下远程ide式开发”、“公网下远程ide式开发”、“局域网下远程容器的ide式开发”、“公网下远程容器的ide式开发”这四种开发流程,让你无论在工位上还是在家中,都可以像打开本地ide那样进行远程的项目开发。

0 本地ide式开发

最方便、最开始的开发方式当然是在本地ide中,比如初学者在Windows电脑上使用pycharm来学习python、深度学习,或者使用devc++、visual studio等来编写c++项目。在本地ide中,可以浏览文件夹、查看文本和图片等,进一步还可以运行调试python、C++等项目。这样的开发过程称为“ide式开发”,初学者会觉得这些都是理所当然的。

1.0 局域网下远程终端开发

但是随着能力的提升、需求的扩大,我们需要使用Linux系统来进行开发,甚至是纯服务器形式的linux,连显示屏都没有。此时我们会初步接触ssh,连上linux服务器的终端,然后通过敲命令的方式来执行一些程序的运行,查看结果。注意只连终端是不可能进行代码编写、调试等步骤的,更别说看图片啥的。此时的做法应为在本地机写好代码,再通过ftp传输到服务器上运行。不过这也算入门linux中的项目开发了。

1.1 局域网下远程ide式开发

但是这种方式太low了,就不能实现windows里ide式开发的效果吗?可以的!借助强大的vscode的remote-ssh插件,同样是ssh连接服务器的22端口,却可以实现ide式开发,这样就可以愉快的点来点去和调试代码了。想实现这个功能请搜索“vscode远程连接linux”,或“vscode remote-ssh连接linux”等教程。

在这个环节,我们应该对ssh的原理、公钥私钥的概念与使用有所了解,还需要了解sshd_config中各项配置的含义。

1.2 公网下远程ide式开发

再进一步,我们会有居家办公的需求,比如现在疫情比较频繁,在家里没有了公司wifi,脱离了局域网环境,我们是无法像以前那样连接linux服务器的,因为ip是内网中的,而我们处在家中的话还去连那个ip,肯定就不对了。此时需要借助“端口转发”,或者说“内网穿透”工具来把处在公司内网的linux服务器的22端口暴露在公网环境中。对于计算机网络不太好的同学来说不论是理解还是实现这一功能都是比较困难的。

所谓内网穿透,就是借助处在公网中的服务器作为中介,让公司的linux服务器和家里的windows电脑都连接上公网服务器,windows向中介发送“sudo apt install vim”命令,中介就把这句话转发给公司linux服务器,公司linux服务器就会执行这个命令,然后返回“successfully installed vim.”信息给中介,然后中介再把这条信息传递给windows电脑,于是整体效果就是win端输入sudo apt install vim,接着显示successfully installed vim.这就是内网穿透。在内网穿透基础上,通过vscode的remote-ssh配置一下,就能实现公网下远程ide式开发。

内网穿透要注意的细节是比较多的,为了方便大家实现,也为了以后自己在新设备上复现,我做一些详细的说明。

整个内网穿透流程如下

在这里插入图片描述

在具体实施上,有3个环节要做:
1、购买并设置好拥有公网ip的阿里云服务器,在控制台的安全组中(并非在服务器内部,而是在阿里云控制台中)开放相应端口
2、在阿里云服务器上安装ssh, 安装frp,完成frps.ini的配置,开启防火墙,开放相应端口,frps服务添加至自启动并开启
3、在公司内网服务器上安装frp,完成frpc.ini的配置,开放相应端口,开启ssh,frpc服务添加至自启动并开启。
具体说明:

1、购买一个阿里云服务器

我买的是1核2g cpu,1Mbps带宽,100G容量的ecs.n4.small服务器,1年84元,服务器会提供一个公网ip(无论在哪个网络环境下都可以凭借公网ip访问云服务器,假设此ip为89.67.45.200)。在阿里云控制台的安全组的出和入里面添加服务端的反向代理监听端口(7000),映射端口(6000),为了后续的别的设备的端口转发,可以多开几个端口
在这里插入图片描述

2、阿里云服务器终端内

2.1、先开放端口

具体可参考这里

apt install openssh-server
systemctl start firewalld
firewall-cmd --add-port=7000/tcp --permanent
firewall-cmd --add-port=6000/tcp --permanent
firewall-cmd --add-port=6001/tcp --permanent
firewall-cmd --reload

2.2、接下来配置frp

mkdir /root/apps && cd /root/apps
wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
tar -xvf frp_0.34.3_linux_amd64.tar.gz
cd frp_0.34.3_linux_amd64

将frps.ini内容改为

[common]
bind_addr = 0.0.0.0
bind_port = 7000
token = 1234

frps表示server端的frp,同理frpc表示client端的frp。
其中bind_port表示监听端口。一个中介服务器可以同时完成多个设备的端口转发,但是监听端口只能有一个。
token表示密码,别的设备想让中介转发端口,得有这个密码

2.3、设置自启动

将sysytemd下的frps.service内容改为

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/root/apps/frp_0.34.3_linux_amd64/frps -c /root/apps/frp_0.34.3_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

然后执行

cp ./systemd/frps.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable frps
systemctl start frps

这样的话中介就配置好了

3、内网linux服务器配置

apt install openssh-server
mkdir /home/user/apps && cd /home/user/apps
wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
tar -xvf frp_0.34.3_linux_amd64.tar.gz
cd frp_0.34.3_linux_amd64

将frpc.ini内容改为

[common]
server_addr = 89.67.45.200
server_port = 7000
token=1234

[linux_in_company]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

server_addr表示中介的公网ip,server_port 是中介的监听端口,linux_in_company是这台linux服务器在中介那里的命名,如果有多个设备要用中介来转发端口,这个命名不可以重复
local_port 表示Linux服务器中要转发出去的端口,22表示终端
remote_port 是中介上的映射端口。win电脑访问中介的6000端口就能起到访问Linux服务器22端口的效果
然后做自启动,修改systemd下的frpc.service

[Unit]
Description=Frp Client Service
After=network.target
Wants=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/home/user/apps/frp_0.34.3_linux_amd64/frpc -c /home/user/apps/frp_0.34.3_linux_amd64/frpc.ini
ExecReload=/home/user/apps/frp_0.34.3_linux_amd64/frpc reload -c /home/user/apps/frp_0.34.3_linux_amd64/frpc.ini

[Install]
WantedBy=multi-user.target

cp ./systemd/frpc.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable frpc
systemctl start frpc

4、Win端ssh连接中介

到这一步就很简单了。
ssh user@89.67.45.200 -p 6000即可,想登root就改成ssh root@89.67.45.200 -p 6000,后面相应的输root的密码即可。有时记得sudo的密码却忘了su的密码咋整?sudo passwd root重置root密码即可
此外,还可以通过密钥对来进行免密登陆,这里不做赘述

2.1 局域网下远程容器的ide式开发

随着能力的进一步提升,我们不得不面临越来越困难、复杂的环境配置过程,比如cuda,tesnorrt的安装与更换版本等。很多时候,目的是C,但是为了做C要先把A和B这两个配置环境的环节给踩一遍,随着这种情况的增多,我们就会发现原先简单的linux服务器变得越来越庞大复杂,里面配置了各种各样的环境,复杂到,尝试更新显卡驱动失败了,导致很多东西都得跟着完蛋,最后连pytorch模型都跑不起来。
所以,我们直接在服务器本体上进行各种环境的配置与项目的开发有两个缺点:其一是耗时间,有的东西的确没必要搞这么清楚,如果有现成的直接用当然最好;其二是环境间容易相互影响产生依赖,一个出问题了其他都得完蛋。
在这种问题的驱动下,容器内的项目开发流程应运而生:我们打开Linux服务器,并不直接在其上面进行环境配置与代码编写调试,而是再在linux中创建容器并进入,在容器中去进行开发。一进容器,各种需要的环境已经为你准备好了,比如英伟达官方的pytorch容器,里面就配好了cuda,cudnn,pytorch,tensorrt等等,这就为我们节省了大量宝贵的时间。再者,在容器里面不管你怎么折腾,只要别把挂载文件夹里的东西乱删,那都没事,丝毫不影响容器外部的linux服务器。不小心把容器搞坏了,再run一个,一切照常。
而想要实现远程容器的ide式开发也很简单,只要在创建容器时增加端口映射即可,比如docker run … -p 6666:22 …,然后在容器中安装好ssh,开启服务,这样的话访问linux服务器(称为host)中的6666端口就等同于访问容器的22端口了。
所以只需把“1.1 局域网下远程ide式开发”中的ssh指令的用户名改为root,端口改为6666,即可在vscode中通过局域网来实现远程容器的ide式开发。

2.2 公网下远程容器的ide式开发

有了“1.2 公网下远程ide式开发”和“2.1 局域网下远程容器的ide式开发”的基础,公网下远程容器的ide式开发就变得非常简单:在公司linux服务器中的frpc.ini中增加一个端口转发请求,把6666端口转发到中介的6001端口,这样的话ssh root@89.67.45.200 -p 6001就会先转到linux服务器的6666端口,再转到容器的22端口,成功在家中进行公司服务器中容器的ide开发

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自然排序与比较器排序的使用

1、自然排序:java.lang.Comparable Comparable 接口中只提供了一个方法: compareTo(Object obj) ,该方法的返回值是 int 。如果返回值为正数,则表示当前对象(调用该方法的对象)比 obj 对象“大”;反之“小”&#xff…

前端实现克里金插值分析(二)

作者:yangjunlin 在上一篇文章中我们已经使用了像素法实现克里金插值的方式,但是问题也就随之抛了出来。1.第一点,在反距离权重插值的时候,因为处理的数据量大会直接导致主线程卡,导致用户体验不好,2.第二点&#xff0…

Apache开启SSL(https)访问网站配置

前言:问题稍微有点绕,整个配置过程,测试成功 服务器的80端口分配了Apache使用了(用phpstudy运行php网站),服务器上还有(IIS网站,站点使用81端口),需要用80转81(中转代理一下到IIS访问网站,iis无需重复配置ssl设置) 就实现了:一台服务器使用2种语言(php/asp.ne…

闭环控制(自动控制理论)

目录 闭环控制 开环控制和闭环控制优缺点 闭环控制 即有被控制量反馈的控制。从系统中信号流向看,系统的输出信号沿反馈通道又回到系统的输入端,构成闭合通道,故称作为闭环控制系统,又或者称为反馈控制系统 这种控制方式&#xf…

微服务环境搭建SpringCloud入门

目录 案例准备 技术选型 模块设计 微服务调用 创建父工程 创建基础模块 创建用户微服务 创建商品微服务 创建订单微服务 我们本次是使用的电商项目中的商品、订单、用户为案例进行讲解。 案例准备 技术选型 maven:3.5.4 数据库:MySQL 5.7 持…

【矩阵论】4. 矩阵运算——广义逆——广义逆的计算

4.3.2 AA^A 计算 a. 秩1公式 若A(aij)mn,r(A)1,则A1∑∣aij∣2AH1tr(AHA)AH\begin{matrix} 若A(a_{ij})_{m\times n},r(A)1,则A^\frac{1}{\sum \vert a_{ij}\vert^2}A^H\frac{1}{tr(A^HA)}A^H \end{matrix} 若A(aij​)mn​,r(A)1,则A∑∣aij​∣21​AHtr(AHA)1​AH​ AHAA^HAA…

Qt Quick 用cmake怎么玩子项目

以往在公司开发众多的项目中,都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程,那么需要做到不会泄密。 举一下爪子,以前做雷达开发的时候,客户从公司那儿买了这些雷达模块,也会需要从…

信号量的使用

信号量 英文名字:semaphore 这里的进程信号量会为下列的信号量打基础 Ucos系统的信号量c线程的信号量java进程和线程的信号量 信号量作用 当多个进程/线程进行共享操作时,用于资源保护,以防止出现相互干扰的情况 信号量用于“资源的保护“ …

图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】

图论算法大合集一. dfs和bfs 过程中要有visited数组标记已遍历过的节点6-1.1 邻接矩阵存储图的深度优先遍历6-1.2 邻接表存储图的广度优先遍历二、欧拉回路(度为偶数,且为连通图)6-1.3 哥尼斯堡的“七桥问题”三、判断连通图6-1.4 地下迷宫探…

进程调度的基本关系

文章目录1.什么是进程(process)2.进程的特性1.进程是非常重要的"软件资源"2.PCB(进程控制块)描述了哪些进程特征3.并行和并发4.进程的虚拟地址空间和进程间通信1.什么是进程(process) 简单来说就是:一个程序跑起来就是一个进程 一个应用没跑起来叫做程序,跑起来了就…

堆排序算法

一、大顶堆和小顶堆概念 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都…

Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)

文章目录1. 内部表、外部表1.1 内部表1.2 外部表1.3 内、外部表差异1.4 Location关键字的作用2. 分区表-Partitioned Tables2.1 概念2.2 创建2.3 分区表数据加载2.3.1 静态分区2.3.2 动态分区2.4 注意事项3. 分桶表-Bucketed Tables3.1 概念3.2 规则3.3 语法3. 事务表-Transact…

编译openMVG出现的错误的解决

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> submodule(s) are missing, please update your repository 在使用CMake生成openMVG解决方案时,出现错误: CMake Error at CMakeL…

另眼看数据中台

目录 前言: 一、故事的开始 二、成也中台,败也中台 1、中台是什么 2、数据中台与企业数字化转型 3、中台的赋能 4、数据中台、业务中台、技术中台 5、中台不一定适合你 ​编辑​编辑小结: 三、 自检数据应用的成熟度 前言&#xff1…

Python学习基础笔记十二——文件

1、目的:是要将数据永久地保存下来,就需要将数据永久保存在硬盘中。 2、概念:文件就是操作系统提供给应用程序来操作硬盘虚拟接口,用户或应用程序通过操作文件,可以将自己的数据永久地保存下来。 3、步骤; …

MACU-Net-用于精细分辨率遥感图像语义分割网络

摘要: 在本文中我们结合了由不同层次的U-Net生成的多尺度特征,设计了一个多尺度跳跃连接和基于非对称卷积的网络--MACU-Net。 网络具有以下几个优点1)多尺度跳跃连接将低层和高层特征图中包含的语义特征结合并重新进行排列2)非对…

一文搞懂傅里叶级数与变换

描述 这篇文章的目标:以最简单易懂的方式,让大家学会傅里叶变换! 为什么要写一篇关于傅里叶变换相关知识的文章呢。有两个原因: 一、这个知识很有趣,可以理解它是一件炫酷的事情。在工作中,一次分享会同事…

BufferPool缓存机制

BufferPool缓存机制 1、更新数据流程 流程图 sql更新数据刷到磁盘前会经过serve层 连接器-管理连接和权限校验优化器-语法词法分析优化器-执行计划生成索引选择执行器-连接bufferPool 1.1 流程步骤 从磁盘加载数据到buffer pool,会先去判断要更新的数据所在数据…

Hantek6022BE 虚拟示波器

​ 0. Hantek 厂家提供的介绍 安装方法按照说明来。 很多人都说原厂的软件不好用,于是折腾就开始了: 1. VIRTINS Multi-Instrument 这个别人已经写的很详细了 大概需要准备 Multi-Ins 这软件,目前找到 3.7 的合用 菜单里 添加设备到库&a…

HTML+CSS详细知识点复习(上)

文章目录一、初识HTML1、标签概述二、初识CSS1、CSS核心基础2、设置文本样式3、高级特性4、CSS的优先级三、CSS选择器1、关系选择器四、盒子模型1、边框属性2、边距属性3、背景属性4、盒子的宽与高5、CSS3新增盒子模型属性一、初识HTML HTML(超文本标记语言&#x…