實(shí)踐教程|Docker使用記錄

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

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

根據(jù)【我的成績(jī)】中的分?jǐn)?shù)和日志可以查看運(yùn)行情況。
如果覺得有用,就請(qǐng)分享到朋友圈吧!
公眾號(hào)后臺(tái)回復(fù)“transformer”獲取最新Transformer綜述論文下載~

#?CV技術(shù)社群邀請(qǐng)函?#

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

