實踐教程|Docker使用記錄

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

VM是從操作系統(tǒng)級別上進行隔離,因此隔離程度要大于容器,但也因此需要耗費更多的資源。
容器則比較輕量級,但是隔離效果自然弱于VM。
Docker安裝與配置
Windows的安裝教程見 https://docs.docker.com/docker-for-windows/install/?spm=5176.12586973.0.0.573c2232pBtzGj,基本上下載安裝就好了。
Ubuntu系統(tǒng)上可以直接輸入如下命令:
$?sudo?apt-get?update
$?sudo?apt?install?docker.io
我運行的時候提示缺少containerd,只需要提前運行sudo apt install containerd進行安裝就好了。
一些常用的命令
查看所有鏡像: docker images查看當前正在運行的容器: docker ps查看所有容器(包含已退出的): docker ps \-a刪除鏡像: docker rmi 鏡像id刪除容器: docker rm 容器id
(刪除鏡像時需要先刪除使用該鏡像的容器)
(在刪除時還可能遇到如下情況,多個鏡像id相同,此時可以根據”REPOSITORY”和”TAR”進行刪除)其他命令見"Docker命令大全" —— https://www.runoob.com/docker/docker-command-manual.html?進行查閱。
使用示例
這里以天池比賽的Docker入門賽為例,看一下Docker完整的使用過程。
任務描述
輸出Hello world 計算 /tcdata/num_list.csv中一列數字的總和。 在/tcdata/num_list.csv文件中尋找最大的10個數,從大到小生成一個ListList.
num_list.csv文件中只有一列不為負的整數,其中存在重復值。
生成入口腳本run.sh,放置于鏡像工作目錄。運行后生成結果result.json放置于工作目錄(與run.sh同目錄),評分系統(tǒng)將根據result.json進行打分。json文件如下所示:
{??
????"Q1":"Hello?world",?
????"Q2":sum值,?
????"Q3":[top10_list]?
}
天池的比賽提交規(guī)則就是提交一個鏡像,要求容器執(zhí)行之后能夠生成比賽要求的包含輸出結果的文件,然后根據結果進行成績判定。
在這里,要輸出的結果就是result.json文件。
使用過程
整個過程主要包括:鏡像的構建,鏡像的推送,提交系統(tǒng)進行判定。
1. 鏡像構建
天池已準備了常用的Python基礎鏡像,可直接拉取使用:docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
這個過程類似于導入python包一樣,在Dockerfile中就可以使用FROM命令來直接使用。
然后我們在一個新文件夾中需要準備的就是如下幾個文件:
——
?|-Dockerfile
?|-hello_world.py
?|-run.sh
其中,Dockerfile文件用來構建鏡像,示例如下:
#?Base?Images
##?從天池基礎鏡像構建
FROM?registry.cn-shanghai.aliyuncs.com/tcc-public/python:3
##?把當前文件夾里的文件構建到鏡像的根目錄下
ADD?.?/
##?指定默認工作目錄為根目錄(需要把run.sh和生成的結果文件都放在該文件夾下,提交后才能運行)
WORKDIR?/
##?鏡像啟動后統(tǒng)一執(zhí)行?sh?run.sh
CMD?["sh",?"run.sh"]
hello_world.py文件就是編寫的要實現題目中要求的文件。這里示例如下:
import?json
#?要求1的結果
r1?=?"Hello?world"
#?讀取數據
data?=?[]
with?open('tcdata/num_list.csv',?'r',?encoding='utf-8')?as?f:
?for?i?in?f:
??data.append(int(i))
#?要求2的結果
r2?=?sum(data)
#?要求3的結果
r3?=?sorted(data,?reverse=True)[:10]
#?輸出結果文件
result?=?{"Q1":?r1,?"Q2":?r2,?"Q3":?r3}
with?open("result.json",?'w',?encoding='utf-8')?as?f:
?json.dump(result,?f)
run.sh文件就是一個sh腳本文件,這里的作用就是執(zhí)行該目錄下的hello_world.py文件從而生成結果:
python?hello_world.py
2.鏡像的推送
天池比賽需要將鏡像推送到阿里云鏡像倉庫進行提交,因此需要先注冊一個阿里云的鏡像服務(https://www.aliyun.com/product/acr?)免費開通鏡像托管。建議設置私有倉庫,并一定牢記倉庫密碼,后續(xù)提交需要使用。
開通后進入鏡像倉庫,創(chuàng)建命名空間以及鏡像倉庫,倉庫類型設為私有,代碼源設為本地倉庫。
創(chuàng)建成功之后,可以看到詳情頁,倉庫地址一般使用公網地址即可。
然后我們構建我們本地的鏡像并推送到倉庫中:
執(zhí)行 docker build -t 倉庫地址:版本號 .命令構建鏡像。倉庫地址是剛剛創(chuàng)建的倉庫地址的公網地址,版本號自己命名,用來區(qū)分每次構建的鏡像。最后的.是構建鏡像的路徑,因為是當前目錄,所以是.,不能省略。
這里參考官方教程?(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.sh
GPU鏡像: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.天池系統(tǒng)提交
推送完之后,就可以去天池系統(tǒng)進行提交了。

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

#?CV技術社群邀請函?#

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

