
極市導讀
今天初次接觸Docker的使用,記錄一下自己的學習心得和理解,加深一下印象。>>加入極市CV技術交流群,走在計算機視覺的最前沿
首先需要理解幾個概念:鏡像,容器。
什麼是容器?簡單來說,操作系統在管理進程時,可以把整個操作系統看成一個大的容器,所有的進程在這一個容器中運行。因此這些進程之間有幾個特點:
所以為了解決上述這些問題,我們需要為某些進程的運行提供獨立的運行環境,從而避免它影響其他正常的進程。容器的本質目的就是如此。
引用一下對容器的解釋:容器就是一個視圖隔離、資源可限制、獨立文件系統的進程集合。所謂「視圖隔離」就是能夠看到部分進程以及具有獨立的主機名等;控制資源使用率則是可以對於內存大小以及 CPU 使用個數等進行限制。容器就是一個進程集合,它將系統的其他資源隔離開來,具有自己獨立的資源視圖。容器具有一個獨立的文件系統,因為使用的是系統的資源,所以在獨立的文件系統內不需要具備內核相關的代碼或者工具,我們只需要提供容器所需的二進制文件、配置文件以及依賴即可。只要容器運行時所需的文件集合都能夠具備,那麼這個容器就能夠運行起來。
什麼是鏡像?我們將這些容器運行時所需要的所有的文件集合稱之為容器鏡像。(簡單來說可以理解為容器運行所需要的所有的依賴文件構成的集合)
那麼怎麼構建鏡像呢?通常情況下,我們會採用 Dockerfile 來構建鏡像,Dockerfile 可以看做是一系列的命令,這些命令都會對已有的文件系統進行操作,這樣就會帶來文件系統內容的變化,直到最終將容器運行所需的所有依賴文件都構建出來,就構造好了對應的鏡像。
「容器」與「VM」聽起來容器和虛擬機(VM)作用非常像。但是想一想他們的差別還是比較明顯的:

VM是從操作系統級別上進行隔離,因此隔離程度要大於容器,但也因此需要耗費更多的資源。
容器則比較輕量級,但是隔離效果自然弱於VM。
Docker安裝與配置Windows的安裝教程見 https://docs.docker.com/docker-for-windows/install/?spm=5176.12586973.0.0.573c2232pBtzGj,基本上下載安裝就好了。
Ubuntu系統上可以直接輸入如下命令:
$sudoapt-getupdate$sudoaptinstalldocker.io我運行的時候提示缺少containerd,只需要提前運行sudo apt install containerd進行安裝就好了。
一些常用的命令這裡以天池比賽的Docker入門賽為例,看一下Docker完整的使用過程。
任務描述num_list.csv文件中只有一列不為負的整數,其中存在重複值。生成入口腳本run.sh,放置於鏡像工作目錄。運行後生成結果result.json放置於工作目錄(與run.sh同目錄),評分系統將根據result.json進行打分。json文件如下所示:
{"Q1":"Helloworld","Q2":sum值,"Q3":[top10_list]}天池的比賽提交規則就是提交一個鏡像,要求容器執行之後能夠生成比賽要求的包含輸出結果的文件,然後根據結果進行成績判定。在這裡,要輸出的結果就是result.json文件。
使用過程整個過程主要包括:鏡像的構建,鏡像的推送,提交系統進行判定。
1. 鏡像構建天池已準備了常用的Python基礎鏡像,可直接拉取使用:docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3這個過程類似於導入python包一樣,在Dockerfile中就可以使用FROM命令來直接使用。
然後我們在一個新文件夾中需要準備的就是如下幾個文件:
——|-Dockerfile|-hello_world.py|-run.sh其中,Dockerfile文件用來構建鏡像,示例如下:
#BaseImages##從天池基礎鏡像構建FROMregistry.cn-shanghai.aliyuncs.com/tcc-public/python:3##把當前文件夾里的文件構建到鏡像的根目錄下ADD./##指定默認工作目錄為根目錄(需要把run.sh和生成的結果文件都放在該文件夾下,提交後才能運行)WORKDIR/##鏡像啟動後統一執行shrun.shCMD["sh","run.sh"]hello_world.py文件就是編寫的要實現題目中要求的文件。這裡示例如下:
importjson#要求1的結果r1="Helloworld"#讀取數據data=[]withopen('tcdata/num_list.csv','r',encoding='utf-8')asf:foriinf:data.append(int(i))#要求2的結果r2=sum(data)#要求3的結果r3=sorted(data,reverse=True)[:10]#輸出結果文件result={"Q1":r1,"Q2":r2,"Q3":r3}withopen("result.json",'w',encoding='utf-8')asf:json.dump(result,f)run.sh文件就是一個sh腳本文件,這裡的作用就是執行該目錄下的hello_world.py文件從而生成結果:
pythonhello_world.py2.鏡像的推送天池比賽需要將鏡像推送到阿里雲鏡像倉庫進行提交,因此需要先註冊一個阿里雲的鏡像服務(https://www.aliyun.com/product/acr?)免費開通鏡像託管。建議設置私有倉庫,並一定牢記倉庫密碼,後續提交需要使用。
開通後進入鏡像倉庫,創建命名空間以及鏡像倉庫,倉庫類型設為私有,代碼源設為本地倉庫。
創建成功之後,可以看到詳情頁,倉庫地址一般使用公網地址即可。
然後我們構建我們本地的鏡像並推送到倉庫中:
這裡參考官方教程(https://tianchi.aliyun.com/competition/entrance/231759/tab/174?spm=5176.12281978.0.0.37724127ZpsgRZ),假設倉庫地址是registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit,所以完整命令為:docker build \-t registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit
構建完成後可先驗證是否正常運行,正常運行後再進行推送。CPU鏡像:docker run your_image sh run.shGPU鏡像:nvidia-docker run your_image sh run.sh
推送到鏡像倉庫 docker push registry.cn-shenzhen.aliyuncs.com/test_for_tianchi/test_for_tianchi_submit:1.0
注意推送之前需要登錄登錄阿里雲Docker Registry:
sudo docker login \--username=用戶名 registry.cn-hangzhou.aliyuncs.com
用於登錄的用戶名為阿里雲賬號全名,密碼為開通服務時設置的密碼。
3.天池系統提交推送完之後,就可以去天池系統進行提交了。

根據【我的成績】中的分數和日誌可以查看運行情況。
如果覺得有用,就請分享到朋友圈吧!
公眾號後台回復「transformer」獲取最新Transformer綜述論文下載~

#CV技術社群邀請函#

備註:姓名-學校/公司-研究方向-城市(如:小極-北大-目標檢測-深圳)
即可申請加入極市目標檢測/圖像分割/工業檢測/人臉/醫學影像/3D/SLAM/自動駕駛/超分辨率/姿態估計/ReID/GAN/圖像增強/OCR/視頻理解等技術交流群
每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、乾貨資訊匯總、與10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發者互動交流~
