本文僅作參考,針對容器的22端口映射問題展開討論,解決問題為使用ssh連接服務器上的docker內的系統,其他docekr配置、服務器設置等不作贅述
原理簡介
遠程連接的使用一般是用被鏈接的主機的ip、端口、賬號密碼,有了這三樣我們才可以連接到對方的主機上。
ip:一般是服務器的ip,這個一般可以得到。
端口:我們使用的連接時ssh協議的,默認端口時22。文件傳輸協議sftp端口也是22。這樣我們只需要把22端口打開,正常的話一般都可以使用ssh和sftp來連接了。(沒猜錯的話sftp也是ssh的一小部分,ssh中的文件傳輸協議,待考察)
賬號密碼:這個是你自己設置的賬號密碼。(ubuntu正常情況下限制root用戶遠程登錄的,所以最好新建一個遠程登陸賬戶)
docker設置
我們再創建容器的時候,為了簡單起見(調用GPU),一般會使用nvidia-docker來創建docker,以前的命令是這樣的
nvidia-docker run -it -p 0.0.0.0:8881:[端口號] --name [容器名] --shm-size=8G [鏡像] bash
命令參數解釋:
-i 表示 讓容器的標准輸入保持打開狀態
-t 表示 為docker分配一個偽終端並綁定到容器的標准輸入上
-d 表示 后台運行
-p 0.0.0.0:8881:[端口號] 表示 設置端口映射 大概是將宿主機的端口號(未寫)映射到docker容器中的8881端口上去(這個地方最好不要這么使用,建議使用下邊的那條nvidia-docker命令,以前沒有問題的,現在不知為什么就出問題了,在下邊給出現在使用的端口映射)
--name [容器名] 表示 容器的名字,自己設置的,別忘了容器名包括REPOSITORY和TAG,格式:REPOSITORY:TAG
--shm-size=8G 表示 設置容器的顯存使用 限制為8G
[鏡像] 表示 從網上拉取的系統鏡像文件
bash 暫未知
以上是僅僅使用jupyter的容器配置,但是我們想的是能使用ssh訪問容器內的系統,如果嘗試使用我上個命令分配的端口的話,根本無法登陸進去,因為那個端口是jupyter的,我們用ssh連接的話根本無法使用。
但是如果是再這個宿主機上使用ssh連接容器內的系統,發現使用容器內系統的ip是可以進行連接的,所以這就需要使用端口映射。將容器內的系統的ssh服務映射到宿主機上,那么只要是我們一訪問宿主機的這個端口,那個他就會自動連接到容器內的那個端口上,那么就是使用ssh連接到了容器內的系統上。 上一句話基本都是廢話,舉個例子吧,我們先假裝將容器內的系統叫做內系統,將宿主機系統叫做外系統。22端口是ssh的端口,我理解為服務入口,訪問這個端口就相當於使用ssh服務,如果將內系統的22端口映射到了外系統的9001端口上,那么在訪問外系統的9001端口的時候,就相當於訪問了內系統的22端口,就相當於在訪問外系統的9001端口的使用遠程連接了內系統。所以這是我們將端口進行映射的目的。
所以要想能遠程連接服務器上的容器內的系統,上邊的命令就要加上22端口的映射,變成下邊這種:
nvidia-docker run -it -p [端口號1]:8888 -p [端口號2]:22 --name [容器名] --shm-size=8G [鏡像] bash
這里 -p 參數和上邊不一樣了,網上查的都是這種寫法,冒號前的 [端口號] 是需要映射到的宿主機的端口,冒號后的 8888 是容器內系統的我們需要的服務的端口,在這里將22映射到了“端口號2”所示的端口上。
注意:
1.這個端口可以映射多個,一般都是在創建容器的使用進行映射,這是簡單的方法,還有一種是修改docker的文件,我感覺挺麻煩就沒有嘗試。
2.如果說我現在已經是正在使用着這個容器,沒有創建怎么辦?
那么就需要將容器先停下來
docker stop [你現在這個容器名]
打包容器現在這個鏡像
docker commit [你現在這個容器名] [自己起一個容器鏡像名字]
這個打包好的鏡像可以查看
docker images
使用自己打包好的這個鏡像創建容器(上邊那個nvidia-docker命令)
nvidia-docker run -it -p [端口號1]:8888 -p [端口號2]:22 --name [容器名]:latest --shm-size=8G [鏡像] bash
建議在使用端口的時候用命令查查看看端口是否被占用
netstat -ap | grep [端口號]
如果沒有顯示東西因該就是可以使用,端口號不要占用1024以內的,否則可能問題
測試
那么這樣創建好了docker之后,便可以直接使用命令將docker啟動,啟動完之后如果想要遠程連接需要打開ssh服務
service ssh start
我從網上查的想開機自啟動設置呢,可是docker的啟動docker的方式和linux的開機啟動方式好像不一樣,他不像是linux開機時需要自檢很多文件,我猜他是直接保存的緩存文件,否則怎么會當運行
docker start [name]
時,馬上就能起來系統?(如有大佬看過docker的原理請告知,小弟現在這謝謝了)因此開機自啟動ssh服務就這么擱置了,不過基本上正常情況下應該不會關機吧?如果關機也只能進去宿主機,進入docker,再打開服務了。
撤多了,回到上邊打開服務這,當服務打開了,基本就可以連接了,使用宿主機的ip,端口是映射到宿主機的那個端口,那個自己設置的 [端口號2]
ssh 172.123.4.88:9001
(這里假設宿主機ip是172.123.4.88,ssh服務映射端口是9001,就是上邊的那個 [端口號2] )
參考:
https://www.cnblogs.com/kingsonfu/p/11578073.html
https://www.linuxidc.com/Linux/2016-01/127345.htm