docker save鏡像時(shí)進(jìn)行g(shù)zip壓縮方式
可以在 docker save 過程中進(jìn)行壓縮。你有幾種方法可以實(shí)現(xiàn),從最簡(jiǎn)單到最高壓縮比,具體如下:
方法一:使用管道直接壓縮(最推薦、最常用)
這是最經(jīng)典和高效的方法。它將 docker save 輸出的 tar 流直接通過管道傳遞給壓縮工具,無需產(chǎn)生巨大的中間臨時(shí)文件。
命令格式:
docker save <鏡像名或ID> | gzip > <輸出文件名.tar.gz>
實(shí)際操作示例:
# 壓縮單個(gè)鏡像 docker save my-app:latest | gzip > my-app-latest.tar.gz # 壓縮多個(gè)鏡像(Docker允許save多個(gè)鏡像到一個(gè)文件) docker save my-app:latest redis:alpine | gzip > my-app-and-redis.tar.gz
解壓并加載:
要加載這個(gè)被壓縮的鏡像,你需要先解壓,或者使用管道反向操作:
# 方法A:先解壓,再加載(兩步) gunzip -c my-app-latest.tar.gz | docker load # 方法B:使用管道一步到位(更優(yōu)雅) zcat my-app-latest.tar.gz | docker load # 或者 gunzip < my-app-latest.tar.gz | docker load
方法二:使用不同的壓縮算法以獲得更高壓縮比(速度更慢)
如果你的網(wǎng)絡(luò)帶寬是瓶頸,并且你愿意用更長(zhǎng)的壓縮時(shí)間來?yè)Q取更小的文件體積,可以使用比 gzip 更高效的壓縮工具,如 pigz (并行g(shù)zip) 或 xz。
- 使用
pigz(多線程gzip,速度快):
docker save my-app:latest | pigz --best > my-app-latest.tar.gz
- 使用
xz(極高壓縮比,速度慢):
docker save my-app:latest | xz -z --threads=0 -9 > my-app-latest.tar.xz
-z: 進(jìn)行壓縮。--threads=0: 使用所有可用的CPU核心。-9: 使用最高壓縮等級(jí)。- 解壓并加載 xz 文件:
xz -d -c my-app-latest.tar.xz | docker load # 或者 unxz < my-app-latest.tar.xz | docker load
方法三:先保存再手動(dòng)壓縮(不推薦)
這種方法會(huì)產(chǎn)生一個(gè)巨大的臨時(shí) tar 文件,通常只在你需要保留未壓縮的 tar 包時(shí)才使用。
# 1. 先保存為未壓縮的tar docker save -o my-app-latest.tar my-app:latest # 2. 再用任何工具壓縮它 gzip my-app-latest.tar # 會(huì)生成 my-app-latest.tar.gz
不推薦的原因:
- 浪費(fèi)磁盤空間: 會(huì)在磁盤上產(chǎn)生一個(gè)巨大的臨時(shí)文件(可能幾十GB),可能會(huì)占滿磁盤空間。
- 速度慢: 需要等待
docker save完全寫完,然后再啟動(dòng)壓縮過程,總耗時(shí)更長(zhǎng)。
方法一通過管道流式處理,避免了這些問題。
總結(jié)與建議
| 方法 | 命令 | 優(yōu)點(diǎn) | 缺點(diǎn) | 推薦度 |
|---|---|---|---|---|
| 管道 + gzip | `docker save … | gzip > file.tar.gz` | 速度快,通用性好,節(jié)省磁盤空間 | 壓縮比不是最高 |
| 管道 + pigz | `docker save … | pigz > file.tar.gz` | 多線程,比gzip快 | 需要額外安裝pigz |
| 管道 + xz | `docker save … | xz > file.tar.xz` | 壓縮比最高,文件最小 | 速度非常慢,耗CPU |
| 先save后壓縮 | docker save -o ... && gzip ... | 可保留中間tar文件 | 耗磁盤空間,速度慢 | ?(不推薦) |
給你的建議:
- 日常使用:直接采用
docker save | gzip,這是最均衡的選擇。 - 傳輸給他人或上傳:如果鏡像非常大,并且你不介意等待,使用
docker save | xz來獲得最小的文件。 - 絕對(duì)要避免:直接使用
docker save -o而不加壓縮,除非你有特殊需求。
所以,下次保存鏡像時(shí),請(qǐng)務(wù)必使用管道壓縮,這能為你節(jié)省大量的時(shí)間和磁盤空間。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析docker妙用SpringBoot構(gòu)建微服務(wù)實(shí)戰(zhàn)記錄
Spring Boot 是 Spring 開源組織的子項(xiàng)目,是 Spring 組件一站式解決方案,本文通過詳細(xì)案例給大家解析docker妙用SpringBoot構(gòu)建微服務(wù)實(shí)戰(zhàn)記錄,感興趣的朋友跟隨小編一起看看吧2021-11-11
Docker部署Tomcat及Web應(yīng)用的實(shí)現(xiàn)
這篇文章主要介紹了Docker部署Tomcat及Web應(yīng)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Docker鏡像如何移動(dòng)或復(fù)制到另一臺(tái)服務(wù)器
文章介紹了如何在不同服務(wù)器之間移動(dòng)或復(fù)制Docker鏡像,包括使用dockersave和dockerload、DockerRegistry、以及dockerexport和dockerimport命令的方法2025-02-02
為運(yùn)行中的docker容器設(shè)置時(shí)區(qū)
本文主要介紹了為運(yùn)行中的docker容器設(shè)置時(shí)區(qū),主要介紹了2種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05

