首頁 > 軟體

利用VSCode進行遠端Linux伺服器、容器開發,達到ide開發專案的效果(最新推薦)

2022-12-07 14:01:42

本文將介紹“區域網下遠端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密碼即可
此外,還可以通過金鑰對來進行免密登陸,這裡不做贅述

4.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式開發。

4.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開發

不過要注意,ssh連之前要先在linux伺服器中執行該容器,並通過/etc/init.d/ssh start開啟ssh服務。這個環節可以使用容器的初始指令碼來完成,首先在linux伺服器上找個地方寫一個指令碼~/code/start.sh

#! /bin/bash
if [ -f "/etc/init.d/ssh" ]; then
    echo "ssh OK"
    /etc/init.d/ssh start
else
    echo "ssh not installed. Start intallation."
    /code/install_ssh.sh
fi

/bin/bash

然後chmod 777 ~/code/start.sh

其中安裝ssh的指令碼如下,沒個容器情況不同,所以僅供參考

#! /bin/bash
cd /
echo -e "deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversendeb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversendeb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiversen" >> sources.list
cp sources.list /etc/apt/sources.list
apt update
apt install -y --allow-downgrades openssh-client=1:7.2p2-4ubuntu2.10
apt install -y openssh-server
echo "ssh installed. Now you need to configure it."

然後chmod 777 ~/code/install_ssh.sh

接下來建立容器!

docker run --gpus all -it -p 6666:22 --name trt -v ~/code:/code nvcr.io/nvidia/tensorrt:21.10-py3 /bin/bash /code/start.sh

我來詳細解讀一下這條指令:

run就是從映象建立容器,–gpus all就是把host的所有gpu都開放使用權利,-it就是以互動模式執行容器併為其分配一個終端命令列,-p 6666:22就是把容器的終端埠22對映到host的6666埠,–name trt就是給這個容器命名為trt,-v ~ /code:/code就是把host的~/code資料夾掛載到容器中的/code資料夾。nvcr.io/nvidia/tensorrt:21.10-py3就是映象的名字,/bin/bash /code/start.sh表示一建立容器就用bash執行這條start.sh指令碼,而且start.sh指令碼末尾還有一行“/bin/bash”就是說執行完安裝或開啟ssh指令碼後,執行bash,留著終端這個程式,不然容器會自動退出。

這樣就可以做到一開啟容器,就能自動開啟ssh啦

到此這篇關於利用VSCode進行遠端Linux伺服器、容器開發,達到ide開發專案的效果的文章就介紹到這了,更多相關VSCode遠端Linux伺服器開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com