目錄
摘要:
1,編寫(xiě)Dockerfile制作鏡像
?2,使用鏡像創(chuàng)建容器
3,交互式運(yùn)行容器/鏡像修改
3.1 編輯
3.2保存
4,將鏡像上傳至DockerHub
?5,從DockerHub拉取鏡像
摘要:
? ? ? ?本文僅涉及docker的基礎(chǔ)使用。主要介紹如何在docker容器內(nèi)運(yùn)行python程序,以及一些相關(guān)問(wèn)題及解決方法,例如:如何讓容器啟動(dòng)后自動(dòng)運(yùn)行程序?如何二次修改鏡像,如何進(jìn)行文件掛載?如何將鏡像上傳至dockerhub?......? ? ? ??
? ? ? 本文涉及到與DockerHub/DockerDesktop相關(guān)的一些操作需要搭梯子。。。
1,編寫(xiě)Dockerfile制作鏡像
? ? ? ?為了在docker容器中運(yùn)行python程序,首先要編寫(xiě)Dockerfile.txt文件,并以此來(lái)制作鏡像。一般的我們將Dockerfile文件放置在python項(xiàng)目根目錄下,如下圖所示:
一個(gè)簡(jiǎn)單的Dockerfile文件內(nèi)容是這樣的:
FROM python:3.7-slim
WORKDIR /work
COPY . /work
RUN pip install --no-cache-dir -r requirements.txt
# 如果不能自動(dòng)運(yùn)行請(qǐng)嘗試加上:RUN chmod +x main.py
CMD ["python", "main.py"]
第一行表示使用python:3.7-slim為基礎(chǔ)鏡像(可以在dockerhub中找到,dockerhub是一個(gè)存放鏡像的云倉(cāng)庫(kù),類(lèi)似于github)。
第二行表示在docker容器根目錄下創(chuàng)建一個(gè)名為work的工作目錄。
第三行表示將本機(jī)當(dāng)前目錄下的內(nèi)容復(fù)制到容器工作目錄。
第四行使得創(chuàng)建容器時(shí)自動(dòng)安裝項(xiàng)目依賴,本例中我們安裝numpy。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
第五行使得容器啟動(dòng)后自動(dòng)運(yùn)行main.py。另外如果加了這句指令仍不能自動(dòng)運(yùn)行,請(qǐng)嘗試加上我注釋的代碼RUN chmod +x main.py授予權(quán)限。
? ? ? ?編寫(xiě)好Dockerfile后開(kāi)始制作鏡像。首先運(yùn)行DockerDesktop程序(請(qǐng)事先安裝),之后在終端打開(kāi)項(xiàng)目文件。
?可以看到python項(xiàng)目?jī)?nèi)容以及我們編寫(xiě)的Dockerfile正在此目錄內(nèi)。使用如下指令構(gòu)建鏡像:
docker build -t <鏡像名稱(chēng)> . -f Dockerfile.txt
可以使用docker images指令查看存在鏡像的信息,可以看到我們新創(chuàng)建的鏡像
?2,使用鏡像創(chuàng)建容器
? ? ? ? 如果需要進(jìn)行數(shù)據(jù)卷掛載,需在這里進(jìn)行。通俗的講,數(shù)據(jù)卷掛載就是將容器中的一個(gè)文件(夾)和本機(jī)中的一個(gè)文件(夾)關(guān)聯(lián)起來(lái)。例如容器中有一個(gè)文件夾A,本機(jī)中有一個(gè)文件夾B。那么B中內(nèi)容同步在A中,容器內(nèi)可見(jiàn);容器中對(duì)A文件夾的內(nèi)容進(jìn)行修改也會(huì)同步在B文件夾,在本機(jī)可見(jiàn)。我們以掛載兩個(gè)文件夾(input,output)分別用作程序輸入輸出為例。
使用如下指令構(gòu)建容器(方括號(hào)指令可選)
docker run [--rm] [--name <容器名稱(chēng)>] [-v <本機(jī)文件夾路徑>:<容器文件夾路徑>] <鏡像名稱(chēng)>
--rm 使得容器為一次性容器,程序運(yùn)行結(jié)束后容器退出并銷(xiāo)毀。如果需要容器后仍存在,請(qǐng)刪除。
--name <容器名稱(chēng)> 是給容器命名,不添加系統(tǒng)會(huì)自動(dòng)生成名稱(chēng)。
-v 進(jìn)行數(shù)據(jù)卷掛載
當(dāng)然還有很多其他的參數(shù)可選,如有需要請(qǐng)查閱官方文檔。
容器啟動(dòng)后自動(dòng)運(yùn)行main.py,相應(yīng)的本機(jī)掛載的文件夾中出現(xiàn)輸出結(jié)果。
#main.py內(nèi)容
import os
import numpy as np
print('hello docker')
print(np.zeros((3,3)))
files=os.listdir('/input')
with open('/output/temp.txt','w',encoding='utf-8') as f:
for i in files:
f.writelines([i+'\n'])
? ? ? ?可以看到容器啟動(dòng)后確實(shí)自動(dòng)運(yùn)行了main.py腳本。由于使用了--rm,所以程序運(yùn)行結(jié)束后容器退出并銷(xiāo)毀!
3,交互式運(yùn)行容器/鏡像修改
? ? ? ?如果需要修改一個(gè)已有鏡像,需要用該鏡像創(chuàng)建一個(gè)容器并在該容器中進(jìn)行修改,最后將該容器保存為一個(gè)新鏡像。
3.1 編輯
用如下指令交互式啟動(dòng)容器(啟動(dòng)容器運(yùn)行bash終端):
docker run -it <鏡像名稱(chēng)> /bin/bash
注意,這里一定不能使用--rm,因?yàn)槲覀冃枰褂迷撊萜鲃?chuàng)建新鏡像。
? ? ? ?啟動(dòng)容器并進(jìn)入bash終端后的過(guò)程就像是操作Linux命令行(docker容器就像是丐版Linux)。初始位于我們創(chuàng)建的工作目錄下。
可以退到根目錄看到整個(gè)文件系統(tǒng)全貌,其中就有我們創(chuàng)建的work工作目錄。
如果需要查看/修改某一文件我們需要借助nano工具,用如下指令下載(也可使用apt-get):
apt update #更新軟件源
apt install nano #安裝
例如我想要查看main.py,那么進(jìn)入所在目錄后使用nano main.py即可。
在如上界面可進(jìn)行文件內(nèi)容的編輯。
在容器中可以使用Linux指令進(jìn)行各種操作,包括下載其他三方包,編輯文件(如上)等。
? ? ? ?哦對(duì)了,有時(shí)可能需要上傳新文件(夾)至容器,這需要在容器外操作。先使用exit退出容器,然后使用如下指令復(fù)制文件(夾)到容器內(nèi)。
docker cp <需上傳的文件本機(jī)路徑> <容器ID/容器名>:<文件上傳位置(容器中路徑)>
? ? ? ?哦,補(bǔ)充一下,這里的路徑格式和前面的不太一樣,前面是Linux格式的,無(wú)所謂啦,直接復(fù)制文件路徑粘貼即可。我之前好像是用Windows格式遇到過(guò)錯(cuò)才改為L(zhǎng)inux格式,不過(guò)這次試又好了。。。
? ? ? ?其中容器ID或容器名可通過(guò)docker ps -a(查看所有容器)查看,或借助DockerDesktop提供的圖形界面。上圖中的docker start gracious_antonelli重新啟動(dòng)了容器,gracious_antonelli是容器名,docker exec -it?gracious_antonelli交互式進(jìn)入容器。
3.2保存
在容器中修改好鏡像后使用exit退出容器,使用如下指令將該容器保存為一個(gè)新鏡像:
docker commit <容器名> <新鏡像名>
? ? ? ?使用新鏡像啟動(dòng)容器發(fā)現(xiàn)程序不能自動(dòng)運(yùn)行了!這是因?yàn)榍懊娼换ナ絾?dòng)容器時(shí)設(shè)置成了容器啟動(dòng)后運(yùn)行bash終端。我是這樣解決的:以該鏡像為基礎(chǔ)鏡像創(chuàng)建新鏡像(編寫(xiě)新dockerfile并創(chuàng)建鏡像)。
FROM docker_test
CMD ["python", "main.py"]
docker build -t <新鏡像名> . -f <Dockerfile.txt本機(jī)地址>
4,將鏡像上傳至DockerHub
首先要在DockerHub創(chuàng)建一個(gè)倉(cāng)庫(kù):
?
?
之后使用如下指令上傳鏡像,請(qǐng)確保你的DockerDesktop處于登錄狀態(tài):
docker tag <待上傳鏡像名> <DockerHub倉(cāng)庫(kù)名>:<tag版本名>
docker push <DockerHub倉(cāng)庫(kù)名>:<tag版本名>
?5,從DockerHub拉取鏡像
?使用如下指令拉取鏡像:
docker pull <DockerHub倉(cāng)庫(kù)名>:<tag版本名>
可以按此方法拉取DockerHub上公開(kāi)的其他鏡像進(jìn)行使用。
? ? ? ?Docker功能非常豐富,還有很多高級(jí)用法,本文只介紹了最最最基礎(chǔ)的一部分,更深入的學(xué)習(xí)請(qǐng)參考官方文檔。
最后啰嗦一嘴,小心你的C盤(pán),哈哈哈。。。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-715325.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-715325.html
到了這里,關(guān)于小白入門(mén):如何在docker中運(yùn)行python程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!