前記
最近在學(xué)習(xí)深度學(xué)習(xí),奈何本地沒有GPU,于是租用了一臺GPU服務(wù)器。為了方便調(diào)試且管理環(huán)境,我想能夠本地VSCode連接到服務(wù)器的容器中,以此直接在容器中編碼。
一、容器準(zhǔn)備
服務(wù)器起容器
在服務(wù)器上啟動鏡像為:"pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel" 容器,將服務(wù)器的 6776端口(可設(shè)置為任意不沖突端口)映射到容器的 22 端口(ssh服務(wù)的默認(rèn)端口),容器起名為 test(可隨意配置),啟動后默認(rèn)進(jìn)入容器中。
docker run -it -p 6776:22 --name test pytorch/pytorch:1.6.0-cuda10.1-cudnn7-devel /bin/bash
注:
- -it:啟動后進(jìn)入容器的交互式界面
- -p:設(shè)置本機(jī)與容器端口映射,順序為 hostPort: containerPort
- --name:容器起名字
容器內(nèi)部準(zhǔ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
開啟 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 會改變ssh訪問的端口,這里改成6776,因此會訪問服務(wù)器的6776端口,而服務(wù)器的6776端口又映射到容器的22端口,所以相當(dāng)于訪問了容器的ssh server所監(jiān)聽的端口,理論上能夠達(dá)成目標(biāo)。
但實際上沒這么做,因為這需要服務(wù)器的外網(wǎng) ip 開啟6776端口,允許 6776 端口的流量進(jìn)入,而我沒有這個權(quán)限,因此放棄這個方案。
方案二
在本機(jī)輸入:
ssh -NL 6776:localhost:6776 root@${server_ip}
-L的解釋是:
-L port:host:hostport
將本地機(jī)(客戶機(jī))的某個端口轉(zhuǎn)發(fā)到遠(yuǎn)端指定機(jī)器的指定端口. 工作原理是這樣的, 本地機(jī)器上分配了一個 socket 偵聽 port 端口, 一旦這個端口上有了連接, 該連接就經(jīng)過安全通道轉(zhuǎn)發(fā)出去, 同時遠(yuǎn)程主機(jī)和 host 的 hostport 端口建立連接. 可以在配置文件中指定端口的轉(zhuǎn)發(fā). 只有 root 才能轉(zhuǎn)發(fā)特權(quán)端口.
簡單的理解就是,將本機(jī)localhost的6776端口與服務(wù)器的6776端口綁定,所有通過 localhost:6776 的數(shù)據(jù)都會轉(zhuǎn)發(fā)到服務(wù)器的 6776 端口上。注意這個轉(zhuǎn)發(fā)是單向的,即訪問 localhost:6776 會轉(zhuǎn)發(fā)到 服務(wù)器的 6776 端口,但訪問服務(wù)器的 6776 端口并不會轉(zhuǎn)發(fā)到 localhost:6776。如果想實現(xiàn)這個功能,需要另一個參數(shù):-R。附上 ssh 參數(shù)解釋連接:ssh參數(shù)解析。
-N 可以簡單理解為什么都不干。如果沒有 -N,則輸入命令后會直接連接到服務(wù)器,占用外網(wǎng)帶寬。加上 -N 后,這條命令更像是一條配置規(guī)則,規(guī)則的有效期就是該命令執(zhí)行后的阻塞時間(執(zhí)行完帶-N的命令后,會發(fā)現(xiàn)終端阻塞了)。
有了上面的步驟,便可以通過執(zhí)行下面命令來訪問容器了。不過只限于上面命令的阻塞期間:
ssh -p 6776 root@localhost
三、VSCode 通過 Remote Explorer 插件連接
在 VSCode 中安裝 “Remote Explorer” 插件,并通過 ssh 連接:ssh -p localhost root@localhost
即可。
后記
ssh是一個功能強大命令。