教你如何從正在運(yùn)行的容器創(chuàng)建?Docker?映像
Docker 容器通常是缺乏內(nèi)部狀態(tài)的臨時(shí)應(yīng)用程序?qū)嵗?。這是處理它們的最佳實(shí)踐方法,可讓您隨時(shí)停止或重新啟動(dòng)容器。
但有時(shí)對(duì)容器文件系統(tǒng)的修改是不可避免的。也許您正在試用軟件并希望稍后返回快照。另一個(gè)用例可能是容器內(nèi)的軟件停止工作并且您希望保存一個(gè)副本以供將來(lái)調(diào)試的情況。
以下是如何從現(xiàn)有容器創(chuàng)建新的 Docker 映像。然后,您將能夠從該映像啟動(dòng)另一個(gè)容器,該容器將填充第一個(gè)容器的文件系統(tǒng)。
提交容器
該docker commit命令用于獲取容器并從中生成新圖像。它適用于已停止或正在運(yùn)行的容器。
基本語(yǔ)法如下:
docker commit example-container example-image:latest
這會(huì)從名為 的容器中創(chuàng)建一個(gè)圖像example-container。如果您愿意,還可以通過(guò) ID 識(shí)別容器。這兩條信息都可以從docker ps列出主機(jī)上所有容器的輸出中獲得。
生成的圖像被分配作為命令的第二個(gè)參數(shù)給出的標(biāo)簽。這example-image:latest在上面顯示的示例中。就像常規(guī)的圖像標(biāo)記操作一樣,如果新圖像已經(jīng)存在,它將替換標(biāo)記的引用。
現(xiàn)在你可以使用你的鏡像將文件系統(tǒng)從example-container一個(gè)新的容器實(shí)例中恢復(fù):
docker run -d example-image:latest
文件系統(tǒng)內(nèi)容將在命令執(zhí)行example-container時(shí)與容器匹配有一個(gè)重要的警告:安裝卷的內(nèi)容將不包括在內(nèi),因此它們的安裝位置在創(chuàng)建的容器映像中將是空的。要運(yùn)行具有完整卷數(shù)據(jù)的新容器,請(qǐng)?jiān)谑褂脝?dòng)第二個(gè)實(shí)例時(shí)使用標(biāo)志從第一個(gè)容器重新附加卷。docker commit-vdocker run
另一個(gè)值得注意的癥結(jié)是 Docker 如何處理正在運(yùn)行的容器的提交。在大多數(shù)情況下,這應(yīng)該可以無(wú)縫地工作,但它默認(rèn)在創(chuàng)建提交之前暫停目標(biāo)容器。鏡像創(chuàng)建完成后容器內(nèi)的所有進(jìn)程都會(huì)暫停,然后再恢復(fù)。這提高了新映像中的數(shù)據(jù)一致性,但暫時(shí)無(wú)法訪問(wèn)容器。–pause false您可以通過(guò)包含在您的docker commit命令中來(lái)禁用此行為。
添加提交消息
該docker commit命令以與 Git 等版本控制軟件類(lèi)似的方式支持提交消息。從容器創(chuàng)建映像時(shí)添加消息可讓您記錄更改的內(nèi)容以及提交背后的原因。
使用–messageor-m標(biāo)志來(lái)應(yīng)用提交消息:
docker commit -m "Example commit" example-container example-image:latest
您也可以使用專(zhuān)用標(biāo)志添加作者信息。將通用First Name email@example.com格式的字符串提供給–authoror-a標(biāo)志。它將與提交消息一起保存。
docker commit -a "Example Author <example@example.com>" -m "Example commit" example-container example-image:latest
docker history當(dāng)您使用該命令查看圖像中的圖層時(shí),會(huì)顯示提交消息。它們將顯示在COMMENT最右側(cè)的列中。
訪問(wèn)此信息的另一種方法是與從圖像的 JSON 表示中提取作者身份和評(píng)論值docker inspect一起使用:grep
docker inspect <image-id> | grep 'Created\|Author\|Comment'
更改 Dockerfile 指令
提交一個(gè)鏡像讓你有機(jī)會(huì)改變它的一些 Dockerfile 指令。您可以在新圖像中覆蓋以下值:
- CMD
- ENTRYPOINT
- ENV
- EXPOSE
- LABEL
- ONBUILD
- USER
- VOLUME
- WORKDIR
要設(shè)置指令,請(qǐng)使用–changeor-c標(biāo)志:
docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest
您可以根據(jù)需要多次重復(fù)該標(biāo)志以應(yīng)用所有預(yù)期的更改。
僅支持影響最頂層文件系統(tǒng)層的指令。您無(wú)法通過(guò) 和 等指令無(wú)縫擴(kuò)展已提交的圖像與新RUN層COPY。但是,如果需要,您可以獲取提交的結(jié)果并編寫(xiě)一個(gè)新的 Dockerfile 來(lái)添加新內(nèi)容:
# Created via `docker commit` FROM example-image:latest RUN apt install example-package
如果您確實(shí)在提交時(shí)更改了 Dockerfile 指令,則值得添加一條提交消息來(lái)解釋您正在修改的內(nèi)容以及原因。這將幫助任何其他有權(quán)訪問(wèn)圖像的人了解與創(chuàng)建圖像的容器相比的任何行為差異。
概括
Docker 鏡像通常由 Dockerfiles 構(gòu)建并用于啟動(dòng)一次性容器。對(duì)容器文件系統(tǒng)狀態(tài)的更改是通過(guò)重建鏡像、銷(xiāo)毀現(xiàn)有容器和啟動(dòng)新容器來(lái)實(shí)現(xiàn)的。在理想世界中,容器沒(méi)有任何內(nèi)部狀態(tài),但在實(shí)踐中并非總是如此。
提交容器為您提供了一種在未來(lái)恢復(fù)其當(dāng)前文件系統(tǒng)的方法。提交對(duì)于創(chuàng)建麻煩容器的副本很有用,因此您可以在單獨(dú)的環(huán)境中進(jìn)行調(diào)試,同時(shí)保持對(duì)先前生成的日志和臨時(shí)文件的訪問(wèn)。
盡管容器提交通常感覺(jué)類(lèi)似于 VM 快照,但它們并不完全相同。VM 控制虛擬硬件,并且該硬件的狀態(tài)將出現(xiàn)在快照中。Docker 容器只是主機(jī)上運(yùn)行的一組進(jìn)程;提交是一個(gè)新的 Docker 映像,它代表容器的文件系統(tǒng),但必然缺少有關(guān)進(jìn)程、內(nèi)核和硬件狀態(tài)的任何數(shù)據(jù)。
到此這篇關(guān)于如何從正在運(yùn)行的容器創(chuàng)建 Docker 映像的文章就介紹到這了,更多相關(guān)容器創(chuàng)建 Docker 映像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker rocketmq部署的實(shí)現(xiàn)示例
最近學(xué)習(xí)使用 rocketmq,需要搭建 rocketmq 服務(wù)端,本文主要記錄 rocketmq 搭建過(guò)程以及這個(gè)過(guò)程踩到的一些坑,感興趣的可以了解一下2021-12-12一步步教你用docker部署postgreSQL數(shù)據(jù)庫(kù)
這篇文章主要給大家介紹了關(guān)于如何使用docker部署postgreSQL數(shù)據(jù)庫(kù)的相關(guān)資料,PostgreSQL是一款功能豐富的關(guān)系型數(shù)據(jù)庫(kù),類(lèi)似于MySQL,它也是受歡迎程度非常高的,需要的朋友可以參考下2023-11-11在Linux?Docker中部署RStudio?Server實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)的操作
下面介紹在Linux?docker中安裝RStudio?Server并結(jié)合cpolar內(nèi)網(wǎng)穿透工具,實(shí)現(xiàn)遠(yuǎn)程訪問(wèn),docker方式安裝可以避免很多問(wèn)題,一鍵安裝,如設(shè)備沒(méi)有安裝docker,需提前安裝docker,對(duì)?Docker部署RStudio?Server相關(guān)知識(shí)感興趣的朋友一起看看吧2023-12-12詳解Docker中VLAN網(wǎng)絡(luò)模式的配置
在Docker應(yīng)用到生產(chǎn)環(huán)境的時(shí)候包括了原生Bridge NAT模式、LinuxBridge VLAN模式以及利用第三方的網(wǎng)絡(luò)方案這三種,這篇文章給大家詳細(xì)介紹了Docker中VLAN網(wǎng)絡(luò)模式的配置,有需要的朋友們下面來(lái)一起看看吧。2016-10-10docker啟動(dòng)容器服務(wù)后訪問(wèn)失敗的解決方案
初學(xué)Docker容器的基本操作,拉取了tomcat鏡像,輸入運(yùn)行容器命令運(yùn)行容器一系列操作都沒(méi)有問(wèn)題,但是在瀏覽器訪問(wèn)端口時(shí)卻訪問(wèn)不到,下面這篇文章主要給大家介紹了關(guān)于docker啟動(dòng)容器服務(wù)后訪問(wèn)失敗的解決方案,需要的朋友可以參考下2023-05-05Docker compose up -d與Docker restart的區(qū)別
本文主要介紹了Docker compose up -d與Docker restart的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07