
最近兩天折騰了一下docker容器,主要的原因是我的亞馬遜雲伺服器快到期了。之前因為我主要在手機上用pydroid3和termux進行python程式設計,學習機器學習,量化投資等。但有的庫在手機上要麼裝不了,要麼裝上卻用不了。于是弄了個可以免費使用的亞馬遜雲的E2伺服器,在伺服器上搭建開發環境。在手機上寫程式,再通過scp或者github傳到伺服器上,在伺服器上運作,再把結果傳回手機。我的量化投資學習筆記裡的代碼都是這麼完成的。
這麼做有點麻煩,我想的是在手機上寫好以後,一個指令就可以調用伺服器上的開發環境執行程式,結果(比如圖檔)等就直接儲存在本地了。在知乎上提問了,有知友建議用docker容器,我搜了一下,的确能實作我的想法,但是幾乎都是用IDE來實作的,有用pycharm的,也有用VS code的,問題是我用的是安卓手機……而且看着還是蠻複雜的,于是就放下了,還是用scp吧。
最近因為免費伺服器快到期了,到期我不想續期了,畢竟付的是美元。到期面臨着重新在新的伺服器上建開發環境的問題。而docker容器正好就是解決這個痛點的神器。于是我決定嘗試一下。docker容器是用go語言開發的,它就像一個集裝箱。集裝箱内部裝的東西是各種各樣的,但裝到集裝箱裡就以統一的面目示人了。docker就是把程式和程式的運作環境都打包成一個容器(container),以容器為機關釋出,運作。與虛拟機相比,容器要輕量得多,開銷要小得多。是以一台裝置上可以運作很多的容器。還有一個重要的概念是鏡像(image),是建立容器的模闆。可以自己編輯Dockerfile來建立鏡像,也可以用别人建立好的鏡像,并在此基礎上修改,增加新的内容,再把這個新的容器儲存為鏡像。在docker hub網站上有各種各樣建立好的docker鏡像。
我先在伺服器上折騰,安裝了docker,在docker hub網站上注冊了賬号,用docker pull下載下傳了一個anaconda3的鏡像,生成容器以後,在容器裡安裝了tensorflow,pytorch等庫,安裝了vim,再根據該容器生成鏡像,最後上傳到docker hub上。這樣換伺服器時就不必重建立立開發環境了,下載下傳鏡像,生成容器就行了。我的鏡像名是zwdnet/mypython。具體過程不再贅述了,參考了兩本書:《第一本docker書》和《docker技術入門與實戰》。
接下來,我想能不能在termux裡也裝docker,這樣連伺服器也可以省了。在網上一搜,還真有在termux裡裝docker的。不是直接裝,而是用虛拟機qemu安裝linux虛拟機環境,然後在虛拟機裡裝docker。
具體過程參考這裡:
Android運作Docker!(Termux + QEMU + linux_alpine, qemu網絡映射)stageguard.top
作者說沒啥用,就是折騰。我這不就找到個用處啦?哈哈。就是照文章的過程進行的,注意在我這裡用VNC Viewer有問題,主要是用vi編輯,要退出的時候顯示"q"未實作,在termux終端裡就正常了。另外鏡像檔案大小最好指定在10G以上。
按照文章安裝好docker環境,要準備下載下傳我上傳的鏡像了。在下載下傳前先按照這篇文章
Docker鏡像源修改_運維_superwind-CSDN部落格blog.csdn.net
更換國内的源,我用的中科大的。
下載下傳過程蠻長的,之後就加載鏡像為容器,用tensorflow測試了一下,成功了!注意tensorflow是用conda建了tensorflow環境的,是以要先激活該環境。
有個問題,輸出好像不會換行,超出一行的内容就顯示不了了。還會出現很多顯示混亂的問題。
我在知乎提問了:
在手機裡用qemu裝Alpine Linux虛拟機,終端顯示不會換行,要如何設定?www.zhihu.com
接下來要解決檔案共享的問題,還要探索一下能不能實作不進虛拟機環境而通過ssh等直接調用。
可以在啟動虛拟機的指令後面加&,就在背景執行了,然後用
ssh [email protected] -p 2222
就可以登陸虛拟機裡的linux。
用
scp -P 2222 ../pytorchtest.py [email protected]:~/code
可以把檔案從主控端複制到虛拟機裡,注意P是大寫的。在虛拟機裡,用-v選項啟動容器,可以在虛拟機和容器之間共享目錄。就跟在伺服器上一樣了。
現在的問題就是能不能直接在termux裡調用虛拟機裡的開發環境,而不用這一系列的複制檔案,登陸等操作。再研究一下吧。
----------------分割線------------------
更新一下,亞馬遜的伺服器到期了,換了一個伺服器,運作docker容器。
同時研究了一下我的原始問題:怎麼像在本地一樣用遠端docker容器裡的開發環境運作程式。最後用scp将檔案複制到伺服器上,運作完成後再複制回本地。設定ssh免密登陸。
寫了一個腳本:
# coding:utf-8
使用方法:
python run.py all filename.py 上傳本地目錄所有檔案并執行filename.py然後将伺服器上的檔案複制回本地
python run.py filename.py 隻上傳本地目錄filename檔案并執行,然後将伺服器上的檔案複制回本地
對于要儲存檔案的程式,比如畫了圖要儲存圖形檔案,可以用python的裝飾器,在要儲存操作的函數前使用修飾器。
import run
@run.change_dir
def fun():
...
我發文章的三個地方,歡迎大家在朋友圈等地方分享,歡迎點“在看”。
我的個人部落格位址:https://zwdnet.github.io
我的知乎文章位址: https://www.zhihu.com/people/zhao-you-min/posts
我的微信個人訂閱号:趙瑜敏的口腔醫學學習園地