刪除docker容器中內(nèi)容后打包鏡像不變小問題及解決
問題
之前一直有這個問題困擾我,不知道大家有沒有遇到過,當(dāng)我們在容器中部署某個軟件時如果軟件的壓縮包比較大那我們可能需要把壓縮包刪除后再去做鏡像,此時你會發(fā)現(xiàn)鏡像還是兩個壓縮包左右的大小,甚至刪除后鏡像可能會更大,這個問題就很容易導(dǎo)致鏡像越來越大無法維護(hù),最近找到了一個解決方法,在這里分享一下
分析
這個跟docker的原理有關(guān)系,因?yàn)殓R像是按照層存儲,這樣做最大好處很直觀,版本更新時只需要下載軟件的下一層相當(dāng)于是軟件的增量包大概是這個意思,而如果你不分層就需要下載軟件的全量包這樣的話十分麻煩。
用戶既可以使用 docker load 來導(dǎo)入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導(dǎo)入一個容器快照到本地鏡像庫。
這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時的快照狀態(tài)),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時可以重新指定標(biāo)簽等元數(shù)據(jù)信息。
解決
知道了原因的話那解決也會相對簡單一些,既然docker load會保存文件的歷史記錄和原數(shù)據(jù),那我們使用docker import導(dǎo)入容器的快照就可以了。
大概就是恢復(fù)到打包容器時候的樣子,是一個快照,沒有歷史記錄。
導(dǎo)出容器
如果要導(dǎo)出本地某個容器,可以使用 docker export 命令
格式如下:
docker export ContainerId > containerPackage.tar
ContainerId 代表容器id,containerPackage.tar壓縮包名稱這個無所謂
查看容器id:
導(dǎo)出容器快照為tar文件
這樣將導(dǎo)出容器快照到本地文件,等待完成,查看文件
導(dǎo)入容器快照
使用 docker import 從容器快照文件中再導(dǎo)入為鏡像
格式如下:
cat edas.tar | docker import - luntek/centos_edatest:1.0
edas.tar為容器快照,luntek應(yīng)該是倉庫名稱,centos_edatest是項(xiàng)目名稱
上傳鏡像
docker push luntek/images_name:tag
如果docker鏡像太大上傳的過程中可能會報錯Retrying in 10 second
解決:
編輯/etc/selinux/config文件,關(guān)閉SELINUX,將值設(shè)置為disabled
vi /etc/selinux/config
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Maven打包構(gòu)建Docker鏡像并推送到倉庫
這篇文章主要介紹了使用Maven打包構(gòu)建Docker鏡像并推送到倉庫問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解
這篇文章主要介紹了關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解,Docker在創(chuàng)建容器時有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要去指定,其他三種模式需要在創(chuàng)建容器時使用–net去指定,需要的朋友可以參考下2023-07-07Rancher+Docker+SpringBoot實(shí)現(xiàn)微服務(wù)部署、擴(kuò)容、環(huán)境監(jiān)控
Rancher?是一套容器管理平臺,可以在生產(chǎn)環(huán)境中快捷的部署和管理容器,方便的對容器進(jìn)行cpu內(nèi)存環(huán)境監(jiān)控、日志監(jiān)控、擴(kuò)容縮容,自動重啟,這篇文章主要介紹了Rancher+Docker+SpringBoot實(shí)現(xiàn)微服務(wù)部署、擴(kuò)容、環(huán)境監(jiān)控,需要的朋友可以參考下2022-04-04docker實(shí)踐之docker-compose部署mysql方式
這篇文章主要介紹了docker實(shí)踐之docker-compose部署mysql方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08詳解docker鏡像centos7配置Java運(yùn)行環(huán)境
基于docker官網(wǎng)centos7鏡像配置java運(yùn)行環(huán)境,自己安裝jdk和tomcat,解決docker容器與宿主機(jī)時間不一致問題2017-05-05