自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Docker的使用筆記

云計(jì)算 云原生
Docker被廣泛使用,因?yàn)樗?jiǎn)化了應(yīng)用程序的部署過(guò)程,并為開(kāi)發(fā)人員提供了可移植性、一致性和效率。

作者:jakieli

一、為什么使用Docker

我們的業(yè)務(wù)需要使用公司內(nèi)部的一個(gè)平臺(tái)做報(bào)表展示,公司內(nèi)部的一個(gè)平臺(tái)支持的數(shù)據(jù)庫(kù)都是正式環(huán)境或者IDC環(huán)境,這使得我們的業(yè)務(wù)邏輯也需要部署到正式環(huán)境或者IDC環(huán)境。自從自研資源上云后,鵝廠內(nèi)部使用IDC資源時(shí)不再推薦使用方單獨(dú)申請(qǐng)IDC資源,而是推薦使用容器服務(wù)進(jìn)行資源的申請(qǐng)和使用。具體來(lái)說(shuō),就是我們需要把我們的業(yè)務(wù)先在測(cè)試環(huán)境上使用docker做成鏡像,再把鏡像上傳到鏡像倉(cāng)庫(kù),再?gòu)娜萜鞣?wù)中把我們的鏡像給啟動(dòng)起來(lái)。因此,我們就有了使用docker的訴求。

二、Docker是什么

Docker是一個(gè)開(kāi)源平臺(tái),它允許用戶(hù)快速構(gòu)建、測(cè)試和部署應(yīng)用程序。Docker通過(guò)將軟件及其依賴(lài)項(xiàng)打包到輕量級(jí)、可移植的容器中來(lái)實(shí)現(xiàn)這一目標(biāo)。這些容器是獨(dú)立的、可執(zhí)行的軟件包,它們包含了運(yùn)行應(yīng)用程序所需的所有內(nèi)容,包括代碼、運(yùn)行時(shí)、庫(kù)、環(huán)境變量和系統(tǒng)工具。

Docker的一個(gè)重要特點(diǎn)是它可以屏蔽環(huán)境差異。這意味著,只要應(yīng)用程序及其依賴(lài)項(xiàng)被打包到Docker容器中,那么無(wú)論應(yīng)用程序運(yùn)行在哪個(gè)環(huán)境中,它的行為都是一致的。這消除了“在我的環(huán)境上可以運(yùn)行”的問(wèn)題,并實(shí)現(xiàn)了“build once, run everywhere”的目標(biāo)。

Docker的另一個(gè)優(yōu)勢(shì)是快速部署。由于容器啟動(dòng)速度非???,并且只要確保一個(gè)容器中的程序正確運(yùn)行,就可以確信無(wú)論在生產(chǎn)環(huán)境部署多少個(gè)容器都能正確運(yùn)行,因此Docker非常適合用于快速部署應(yīng)用程序。

Docker的關(guān)鍵組件包括Dockerfile文件、Docker映像和Docker容器。Dockerfile文件是一個(gè)包含命令的腳本,用于組裝Docker映像并定義其中的內(nèi)容。Docker映像是一個(gè)只讀的模板,用于創(chuàng)建Docker容器。Docker容器是從Docker映像啟動(dòng)的運(yùn)行實(shí)例。

Docker被廣泛使用,因?yàn)樗?jiǎn)化了應(yīng)用程序的部署過(guò)程,并為開(kāi)發(fā)人員提供了可移植性、一致性和效率。Docker的創(chuàng)新性在于它將程序的所有依賴(lài)項(xiàng)一起打包,從而簡(jiǎn)化了運(yùn)行環(huán)境管理的繁瑣步驟。

三、怎么使用Docker

1. Docker的安裝

在不同操作系統(tǒng)上,docker的安裝命令不同,我們這次以Ubuntu系統(tǒng)為例來(lái)說(shuō)明如何安裝docker。下面的各個(gè)步驟都是來(lái)源于混元大語(yǔ)言模型的返回:

在Ubuntu系統(tǒng)上安裝Docker,你可以按照以下步驟操作:

(1) 更新軟件包索引:

sudo apt-get update

(2) 安裝依賴(lài)項(xiàng):

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

(3) 添加Docker官方GPG密鑰:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

(4) 設(shè)置Docker穩(wěn)定版本的存儲(chǔ)庫(kù):

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

(5) 更新軟件包索引:

sudo apt-get update

(6) 安裝Docker:

sudo apt-get install docker-ce docker-ce-cli containerd.io

(7) 驗(yàn)證Docker是否已成功安裝:

sudo docker --version

按照混元大模型給出來(lái)的步驟執(zhí)行安裝,問(wèn)題出現(xiàn)在了第4-6步。環(huán)境中的lsb_release執(zhí)行報(bào)錯(cuò):

Traceback (most recent call last):
  File "/usr/bin/lsb_release", line 25, in <module>
    import lsb_release
ModuleNotFoundError: No module named 'lsb_release'

這個(gè)錯(cuò)誤解決了半天也沒(méi)有搞定,最后通過(guò)繞道而搞定。按照道理,第四步的目的是指定當(dāng)前系統(tǒng)的穩(wěn)定docker版本,這里可以通過(guò)下面的命令替代:

codename=$(cat /etc/os-release | grep "VERSION_CODENAME" | cut -d "=" -f 2)

把codename的值替換到第4步中的$(lsb_release -cs),再執(zhí)行第6步就能成功了。如果還是執(zhí)行失敗的話,可以新建個(gè)文件:/etc/apt/sources.list.d/docker.list,并且把第4步的前半部分,即:

deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu bionic stable

寫(xiě)入到文件中,其中“bionic”就是前面提到的codename。注意,這個(gè)命令要寫(xiě)對(duì),一定要以deb開(kāi)頭,在stable前一定要有codename值。

2. 生成鏡像

(1) 創(chuàng)建Dockerfile

生成鏡像的第一步是創(chuàng)建一個(gè)Dockerfile。在我這里,參考著官方文檔,使用混元平臺(tái)生成了一個(gè)大致可用的Dockerfile,我跟混元的對(duì)話如下(當(dāng)然第一次沒(méi)把需求提的這么清楚,經(jīng)過(guò)多輪對(duì)話我的要求優(yōu)化為):

寫(xiě)一個(gè)Dockerfile,滿(mǎn)足下面的要求:
0、創(chuàng)建一個(gè)Ubuntu鏡像
1、在docker中安裝python3
2、使用requirements.txt安裝依賴(lài)
3、把a(bǔ)ccuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三個(gè)文件夾拷貝到docker中
4、寫(xiě)一個(gè)start.sh,在腳本中分別使用python來(lái)啟動(dòng)accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三個(gè)文件夾中的main.py,每個(gè)python腳本的執(zhí)行記錄都寫(xiě)到日志文件中,且每個(gè)程序保持在后臺(tái)運(yùn)行
5、使用start.sh作為docker的啟動(dòng)命令

混元的返回是:

# 0. 創(chuàng)建一個(gè)Ubuntu鏡像
FROM ubuntu:latest

# 設(shè)置工作目錄
WORKDIR /app

# 1. 在docker中安裝python3
RUN apt-get update && \
    apt-get install -y python3 python3-pip

# 2. 使用requirements.txt安裝依賴(lài)
COPY requirements.txt .
RUN pip3 install -r requirements.txt

# 3. 把a(bǔ)ccuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三個(gè)文件夾拷貝到docker中
COPY accuracy_recall_for_ehp cos_log_download_process test_rule_checker /app/

# 4. 寫(xiě)一個(gè)start.sh,在腳本中分別使用python來(lái)啟動(dòng)accuracy_recall_for_ehp、cos_log_download_process和test_rule_checker三個(gè)文件夾中的main.py,每個(gè)python腳本的執(zhí)行記錄都寫(xiě)到日志文件中,且每個(gè)程序保持在后臺(tái)運(yùn)行
RUN echo '#!/bin/bash' > start.sh && \
    echo 'python3 /app/accuracy_recall_for_ehp/main.py > /app/accuracy_recall_for_ehp.log 2>&1 &' >> start.sh && \
    echo 'python3 /app/cos_log_download_process/main.py > /app/cos_log_download_process.log 2>&1 &' >> start.sh && \
    echo 'python3 /app/test_rule_checker/main.py > /app/test_rule_checker.log 2>&1 &' >> start.sh && \
    chmod +x start.sh

# 5. 使用start.sh作為docker的啟動(dòng)命令
CMD ["/app/start.sh"]

經(jīng)過(guò)測(cè)試,這個(gè)Dockerfile他是可用的。從一個(gè)側(cè)面也說(shuō)明了大語(yǔ)言模型對(duì)我們工作效率的提升還是比較有效的。

(2) 鏡像倉(cāng)庫(kù)

在正式創(chuàng)建Docker鏡像前,我們先來(lái)說(shuō)下鏡像倉(cāng)庫(kù)。

① 鏡像倉(cāng)庫(kù)是什么

鏡像倉(cāng)庫(kù)是一種存儲(chǔ)、分發(fā)和檢索軟件鏡像(即Docker鏡像)的集中化服務(wù)。以下是為什么需要使用鏡像倉(cāng)庫(kù)的一些原因:

  • 便捷性:鏡像倉(cāng)庫(kù)允許用戶(hù)在不構(gòu)建本地鏡像的情況下,快速獲取并運(yùn)行預(yù)構(gòu)建的鏡像。這樣可以節(jié)省時(shí)間和資源,提高開(kāi)發(fā)效率。
  • 版本控制:鏡像倉(cāng)庫(kù)可以幫助用戶(hù)跟蹤和回溯軟件的版本歷史,并且可以輕松地將軟件回滾到以前的版本。這對(duì)于在生產(chǎn)環(huán)境中進(jìn)行故障排查和修復(fù)問(wèn)題時(shí)非常有用。
  • 安全性:鏡像倉(cāng)庫(kù)可以幫助用戶(hù)集中管理和控制對(duì)鏡像的訪問(wèn)權(quán)限。這可以防止未經(jīng)授權(quán)的訪問(wèn)和潛在的惡意攻擊。
  • 協(xié)作:鏡像倉(cāng)庫(kù)支持多人合作開(kāi)發(fā)同一個(gè)項(xiàng)目。通過(guò)將鏡像存儲(chǔ)在倉(cāng)庫(kù)中,團(tuán)隊(duì)成員可以輕松地共享和同步軟件鏡像,從而提高團(tuán)隊(duì)協(xié)作效率。
  • 可擴(kuò)展性:鏡像倉(cāng)庫(kù)可以輕松地支持大量用戶(hù)和鏡像。這對(duì)于大型組織和企業(yè)在全球范圍內(nèi)分發(fā)和部署軟件鏡像非常有用。

綜上所述,鏡像倉(cāng)庫(kù)可以幫助用戶(hù)更快速、安全、便捷地管理和分發(fā)軟件鏡像,從而提高開(kāi)發(fā)效率和團(tuán)隊(duì)協(xié)作水平。

② 常用的鏡像倉(cāng)庫(kù)

常用的Docker倉(cāng)庫(kù)包括以下幾種:

  • Docker Hub:Docker官方提供的公共倉(cāng)庫(kù),包含了大量的官方和社區(qū)維護(hù)的鏡像,用戶(hù)可以通過(guò)docker pul命令從Docker Hub獲取鏡像。
  • 私有倉(cāng)庫(kù):可以在本地或私有網(wǎng)絡(luò)中搭建的私有Docker倉(cāng)庫(kù),用于存儲(chǔ)和管理自定義的鏡像。常見(jiàn)的私有倉(cāng)庫(kù)包括Docker Registry、Harbor等。
  • 第三方倉(cāng)庫(kù):除了Docker Hub和私有倉(cāng)庫(kù),還有一些第三方的Docker倉(cāng)庫(kù),提供了特定領(lǐng)域或特定用途的鏡像。例如,Gogle Cloud Container Registry、AWS Elastic Container Registry等。
  • 其他公共倉(cāng)庫(kù):除了Docker Hub,還有一些其他的公共倉(cāng)庫(kù),例如Quay.io、Azure Container Registry等,它們提供了各種不同的鏡像和服務(wù)。

這些倉(cāng)庫(kù)為用戶(hù)提供了方便、安全、高效的Docker鏡像存儲(chǔ)和分發(fā)解決方案,幫助用戶(hù)更好地管理和部署應(yīng)用程序。

(3) 使用Dockerfile創(chuàng)建鏡像

在生成了Dockerfile之后,就是使用Dockerfile來(lái)生成鏡像了。如果只是在本地測(cè)試,那么使用docker build命令就可以了:

sudo docker build -t my-image .

如果我們想要把鏡像存入到鏡像倉(cāng)庫(kù)中,我們?cè)趧?chuàng)建鏡像時(shí),就需要使用把鏡像的名字生成的“講究”、漂亮一些。具體來(lái)說(shuō),如果我們想把鏡像存入到鏡像倉(cāng)庫(kù)中以備后續(xù)在容器服務(wù)中使用的話,我們?yōu)殓R像起名字時(shí)要把我們后續(xù)需要使用的鏡像倉(cāng)庫(kù)地址以、個(gè)人文件夾寫(xiě)入到鏡像名字中。建議先創(chuàng)建一個(gè)個(gè)人的鏡像來(lái)做測(cè)試。在創(chuàng)建好自己的倉(cāng)庫(kù)地址后,在build鏡像時(shí)需要指定倉(cāng)庫(kù)的地址為鏡像的名稱(chēng),即:

sudo docker build -t myusername/myimage:latest .

其中,latest為倉(cāng)庫(kù)的tag。在創(chuàng)建好鏡像后,可以通過(guò)下面的命令來(lái)查看鏡像是否創(chuàng)建成功(結(jié)果就不貼了,是否成功一目了然):

sudo docker images

3. 啟動(dòng)鏡像

在創(chuàng)建好鏡像后,可以通過(guò)下面的命令來(lái)啟動(dòng)鏡像:

sudo docker run -d -p 80:80 --name test-container myusername/myimage

其中test-container為鏡像啟動(dòng)后的容器名稱(chēng)。在啟動(dòng)后,可以通過(guò)下面的命令來(lái)判斷當(dāng)前容器的運(yùn)行情況:

sudo docker ps -a

返回的格式如下:

建議使用ps -a而不是ps,使用ps -a能夠看到全量的包括歷史上運(yùn)行已經(jīng)停止了的容器的情況。

(1) 容器運(yùn)行狀態(tài)

上面提到了使用ps -a命令能看到容器當(dāng)前的運(yùn)行情況,其中STATUS這一列說(shuō)明了不同容器當(dāng)前的運(yùn)行狀態(tài)。STATUS可能的值包括:Up、Exited、Created、Restarting、Removing和Dead。這些值的具體含義如下:

  • Up: 容器正在運(yùn)行。
  • Exited: 容器已退出,通常表示容器內(nèi)的主進(jìn)程已完成并正常退出。
  • Created: 容器已創(chuàng)建,但尚未啟動(dòng)。
  • Restarting: 容器正在重啟。
  • Removing: 容器正在被刪除。
  • Dead: 容器已死亡,通常表示容器內(nèi)的主進(jìn)程已崩潰或被終止。

① inspect命令

上面的值可能會(huì)因?yàn)镈ocker版本和操作系統(tǒng)的不同而有所不同。要獲取更詳細(xì)的信息,你可以使用docker inspect命令查看容器的詳細(xì)信息。例如:

docker inspect 9c436ea546b9

inspect命令的返回值是個(gè)json文件,包含對(duì)象的所有屬性和配置,一些常見(jiàn)的字段包括:“Id”、“Name”、“State”、“Mounts”、“NetworkSettings”等值。這里就不展開(kāi)說(shuō)明,感興趣的小伙伴們可以自己試試。

② Exited原因解析

繼續(xù)說(shuō)回STATUS中的Exited狀態(tài),這個(gè)狀態(tài)的不同值能反應(yīng)容器退出的原因,當(dāng)Docker ps命令的STATUS列顯示為Exited時(shí),表示容器已經(jīng)退出。Exited后面的數(shù)字表示容器退出時(shí)的狀態(tài)碼。狀態(tài)碼0表示容器正常退出,而非0的狀態(tài)碼表示容器異常退出。

非0的狀態(tài)碼通常表示容器在執(zhí)行過(guò)程中遇到了錯(cuò)誤,以下是一些常見(jiàn)的非0狀態(tài)碼及其含義:

  • 1:一般性未知錯(cuò)誤
  • 2:不適用的shell或者語(yǔ)法錯(cuò)誤
  • 126:命令不可執(zhí)行
  • 127:未找到命令
  • 128:無(wú)效的退出參數(shù)
  • 128+n:通過(guò)信號(hào)n終止的程序
  • 130:通過(guò)Ctrl+C終止的程序
  • 255:退出狀態(tài)碼超出有效范圍

需要注意的是,這些狀態(tài)碼并不是唯一的,具體的狀態(tài)碼可能會(huì)因應(yīng)用程序的不同而有所不同。

③ logs命令

在實(shí)際使用中,建議查看容器的日志以獲取更多關(guān)于錯(cuò)誤的詳細(xì)信息。如果容器運(yùn)行起來(lái)后就處于Exited狀態(tài),我們除了可以通過(guò)inspect命令來(lái)查看當(dāng)前退出可能的原因外,我們也可以通過(guò)docker logs命令來(lái)查看容器運(yùn)行起來(lái)時(shí)的日志,具體的命令如下:

sudo docker logs 9c436ea546b9

其中“9c436ea546b9”為Container_Id。在實(shí)際應(yīng)用中,我使用logs命令發(fā)現(xiàn)了我的進(jìn)程異常退出的原因:

ubuntu@VM-77-147-ubuntu:~$ sudo docker logs 5ade7c784050
start.sh: line 7: ture: command not found

腳本寫(xiě)錯(cuò)了,把true寫(xiě)成了ture(這是在混元返回的基礎(chǔ)上自己寫(xiě)的少量代碼之一,這也說(shuō)明了人沒(méi)那么靠譜?)。LOL。

另外,建議在啟動(dòng)腳本中,啟動(dòng)應(yīng)用時(shí),以nohup啟動(dòng)并將程序的運(yùn)行日志重定向到文件中。如果腳本中只是啟動(dòng)一個(gè)守護(hù)進(jìn)程,可以在啟動(dòng)腳本后面增加一個(gè)循環(huán)語(yǔ)句或者wait命令,讓鏡像能持續(xù)的運(yùn)行。

4. 進(jìn)入容器

可以使用下面的命令進(jìn)入到容器中:

sudo docker exec -it “CONTAINER ID” /bin/sh

其中CONTAINER ID為上面docker ps命令返回的第一列。進(jìn)入到容器后,可以像在本地的系統(tǒng)一樣進(jìn)行調(diào)試,可以通過(guò)啟動(dòng)腳本或者其他命令來(lái)查看我們想要執(zhí)行的命令是否正確。

5. 關(guān)閉容器

一般來(lái)說(shuō),在本地調(diào)試時(shí),可以通過(guò)下面的命令來(lái)進(jìn)行關(guān)閉容器:

sudo docker stop “CONTAINER ID”

其中CONTAINER ID為上面docker ps命令返回的第一列。在使用stop命令后,可以再次調(diào)用ps -a命令查看當(dāng)前的docker進(jìn)程情況

6. 推送鏡像

在本地測(cè)試通過(guò)后,可以通過(guò)下面的命令將生成的鏡像推送到鏡像倉(cāng)庫(kù)中:

sudo docker push myusername/myimage:latest

這時(shí)在3.2.3中提到的-t的創(chuàng)建鏡像時(shí)指定名稱(chēng)就起作用了,在這里指定好鏡像的命令,進(jìn)行推送。推送成功后,倉(cāng)庫(kù)中就能見(jiàn)到myusername目錄下的標(biāo)簽是latest的鏡像了。

7. 更新鏡像

在測(cè)試的過(guò)程中遇到了一些環(huán)境問(wèn)題(這里舉例說(shuō)明如何更新鏡像,后來(lái)環(huán)境問(wèn)題通過(guò)其他方式解決了),比如我們需要使用Python 3.12,而現(xiàn)在Python的官網(wǎng)上并未正式的支持Python3.12,我們不能通過(guò)apt-install的方式進(jìn)行安裝,并且使用下面的命令在執(zhí)行時(shí)也失敗了:

sudo add-apt-repository ppa:deadsnakes/ppa

ppa安裝失敗?;艘恍┕Ψ驔](méi)有解決掉。這時(shí)候想到了一個(gè)可以繞道的辦法,像在本地安裝Python3.12這樣,下載Python3.12的安裝文件夾,把這個(gè)文件夾拷貝到鏡像中,使用3.4中提到的方法進(jìn)入到容器中,再進(jìn)入到Python3.12的路徑下通過(guò)./configure,mak -j和make altintall的方式進(jìn)行安裝。安裝成功后的結(jié)果:

這時(shí)退出容器,通過(guò)docker的commit方法把剛才的操作給存起來(lái),我們從docker --help能看到docker commit的釋義:

 commit      Create a new image from a container's changes

從這個(gè)能看出來(lái),commit的作用是把現(xiàn)在容器中的變化給存儲(chǔ)起來(lái)。具體的命令是:

sudo docker commit 10074a786927 myusername/myimage:v2

其中“10074a786927”是前面提到的“CONTAINER ID”。提交成功后,再push到鏡像倉(cāng)庫(kù)中。

8. 刪除容器

在3.3中提到了如何啟動(dòng)容器,在3.4中提到了如何進(jìn)入到容器中。除了這兩點(diǎn)外,我們還可以使用docker ps -a命令查看當(dāng)前的容器運(yùn)行情況,在命令的返回結(jié)果中我們能看到容器的名字,如果我們想要?jiǎng)h除某些容器,可以使用下面的命令來(lái)刪除:

sudo docker rm my_container

其中my_container是容器的名字。

9. 刪除鏡像

在前面3.2.3中我們看到可以使用docker images來(lái)查看當(dāng)前的鏡像的狀態(tài),如果我們有些鏡像不用了,需要?jiǎng)h除掉這些鏡像,我們可以使用下面的命令來(lái)進(jìn)行刪除:

sudo docker rmi image_id

其中image_id是鏡像的id。

四、鏡像部署

在把鏡像上傳到倉(cāng)庫(kù)后,就可以在自己的容器配置平臺(tái)進(jìn)行鏡像部署了。由于大家的鏡像部署環(huán)境和平臺(tái)都不相同,大家可以參考自己的平臺(tái)配置指引進(jìn)行部署,這里就不給大家舉例子了。

責(zé)任編輯:趙寧寧 來(lái)源: 騰訊技術(shù)工程
相關(guān)推薦

2010-05-31 17:06:35

MySQL游標(biāo)

2010-06-01 18:47:11

Rsync 使用

2021-12-27 16:24:11

鴻蒙HarmonyOS應(yīng)用

2009-11-30 11:18:46

2024-03-19 17:35:49

商務(wù)辦公

2015-01-26 10:22:38

OpenFlow

2011-12-05 14:28:07

商用筆記本

2009-06-11 11:46:00

netbeans6.0

2017-04-24 11:03:40

商用筆記本職場(chǎng)

2022-03-30 18:22:41

戴爾

2011-05-03 10:06:35

2012-10-16 14:35:42

想Y480N

2015-02-05 20:26:21

惠普商用筆記本

2012-07-02 15:14:54

聯(lián)想昭陽(yáng)K49商務(wù)筆記本

2012-11-22 11:02:40

筆記本

2018-02-01 16:03:29

ThinkPad A2

2022-01-12 17:05:42

戴爾

2012-10-16 14:35:42

惠普ENVY

2015-03-04 17:32:25

2022-03-25 11:53:06

戴爾
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)