前記
最近在學(xué)習(xí)深度學(xué)習(xí)砖第,奈何本地沒(méi)有GPU,于是租用了一臺(tái)GPU服務(wù)器环凿。為了方便調(diào)試且管理環(huán)境梧兼,我想能夠本地VSCode連接到服務(wù)器的容器中,以此直接在容器中編碼智听。
一羽杰、容器準(zhǔn)備
服務(wù)器起容器
在服務(wù)器上啟動(dòng)鏡像為:"pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel" 容器,將服務(wù)器的 6776端口(可設(shè)置為任意不沖突端口)映射到容器的 22 端口(ssh服務(wù)的默認(rèn)端口)到推,容器起名為 test(可隨意配置)考赛,啟動(dòng)后默認(rèn)進(jìn)入容器中。
docker run -it -p 6776:22 --name test pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel /bin/bash
注:
- -it:?jiǎn)?dòng)后進(jìn)入容器的交互式界面
- -p:設(shè)置本機(jī)與容器端口映射莉测,順序?yàn)?hostPort: containerPort
- --name:容器起名字
容器內(nèi)部準(zhǔn)備
成功運(yùn)行上述命令后颜骤,應(yīng)該進(jìn)入了容器的交互界面。
更換apt阿里源:
cp /etc/apt/source.list /etc/apt/source.list.bak
sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/source.list
apt-get update
安裝 ssh 服務(wù)端:
apt-get install openssh-server
開(kāi)啟 ssh 服務(wù)端:
service ssh start
配置主機(jī)免密登陸(注意是自己的電腦悔雹,不是服務(wù)器复哆,這里以 mac 為例):
找到主機(jī) ssh 公鑰:
cat ~/.ssh/id_rsa.pub
將輸出的內(nèi)容復(fù)制到容器中的 ~/.ssh/authorized_keys 文件中欣喧,如果文件或目標(biāo)文件不存在,則創(chuàng)建:
mkdir -p ~/.ssh
cat << EOF > ~/.ssh/authorized_keys
> ${復(fù)制的內(nèi)容}
> EOF
二梯找、主機(jī)連接服務(wù)器容器
連接服務(wù)容器的方案有兩種:
方案一
在本地機(jī)器輸入:
ssh -p 6776 root@${server_ip}
-p 會(huì)改變ssh訪問(wèn)的端口唆阿,這里改成6776,因此會(huì)訪問(wèn)服務(wù)器的6776端口锈锤,而服務(wù)器的6776端口又映射到容器的22端口驯鳖,所以相當(dāng)于訪問(wèn)了容器的ssh server所監(jiān)聽(tīng)的端口,理論上能夠達(dá)成目標(biāo)久免。
但實(shí)際上沒(méi)這么做浅辙,因?yàn)檫@需要服務(wù)器的外網(wǎng) ip 開(kāi)啟6776端口,允許 6776 端口的流量進(jìn)入阎姥,而我沒(méi)有這個(gè)權(quán)限记舆,因此放棄這個(gè)方案。
方案二
在本機(jī)輸入:
ssh -NL 6776:localhost:6776 root@${server_ip}
-L的解釋是:
-L port:host:hostport
將本地機(jī)(客戶(hù)機(jī))的某個(gè)端口轉(zhuǎn)發(fā)到遠(yuǎn)端指定機(jī)器的指定端口. 工作原理是這樣的, 本地機(jī)器上分配了一個(gè) socket 偵聽(tīng) port 端口, 一旦這個(gè)端口上有了連接, 該連接就經(jīng)過(guò)安全通道轉(zhuǎn)發(fā)出去, 同時(shí)遠(yuǎn)程主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口.
簡(jiǎn)單的理解就是呼巴,將本機(jī)localhost的6776端口與服務(wù)器的6776端口綁定泽腮,所有通過(guò) localhost:6776 的數(shù)據(jù)都會(huì)轉(zhuǎn)發(fā)到服務(wù)器的 6776 端口上。注意這個(gè)轉(zhuǎn)發(fā)是單向的衣赶,即訪問(wèn) localhost:6776 會(huì)轉(zhuǎn)發(fā)到 服務(wù)器的 6776 端口诊赊,但訪問(wèn)服務(wù)器的 6776 端口并不會(huì)轉(zhuǎn)發(fā)到 localhost:6776。如果想實(shí)現(xiàn)這個(gè)功能府瞄,需要另一個(gè)參數(shù):-R碧磅。附上 ssh 參數(shù)解釋連接:ssh參數(shù)解析。
-N 可以簡(jiǎn)單理解為什么都不干遵馆。如果沒(méi)有 -N鲸郊,則輸入命令后會(huì)直接連接到服務(wù)器,占用外網(wǎng)帶寬货邓。加上 -N 后严望,這條命令更像是一條配置規(guī)則,規(guī)則的有效期就是該命令執(zhí)行后的阻塞時(shí)間(執(zhí)行完帶-N的命令后逻恐,會(huì)發(fā)現(xiàn)終端阻塞了)。
有了上面的步驟峻黍,便可以通過(guò)執(zhí)行下面命令來(lái)訪問(wèn)容器了复隆。不過(guò)只限于上面命令的阻塞期間:
ssh -p 6776 root@localhost
三、VSCode 通過(guò) Remote Explorer 插件連接
在 VSCode 中安裝 “Remote Explorer” 插件姆涩,并通過(guò) ssh 連接:ssh -p localhost root@localhost
即可挽拂。
后記
ssh是一個(gè)功能強(qiáng)大命令。