Docker鏡像指南之從核心命令到離線遷移實(shí)戰(zhàn)
Docker鏡像是什么?
Docker鏡像本質(zhì)是一個(gè)只讀文件。它包含了創(chuàng)建Docker容器所需的全部文件和配置信息,除應(yīng)用程序本身(例如一個(gè)編譯好的Jar包),還包含了應(yīng)用程序運(yùn)行所需的所有依賴項(xiàng)(如操作系統(tǒng)、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、庫文件等)。
核心特性與詳細(xì)解釋
分層結(jié)構(gòu)
- 鏡像是由一系列只讀層(Layers) 堆疊而成的。
- 每一層代表鏡像Dockerfile中的一條指令(例如:RUN apt-get update, COPY . /app)。
- 這種結(jié)構(gòu)帶來了巨大的好處:
- 共享和復(fù)用:如果兩個(gè)鏡像基于同一個(gè)基礎(chǔ)層(如Ubuntu),那么它們可以共享這一層,節(jié)省磁盤空間和下載時(shí)間。
- 高效構(gòu)建:當(dāng)你修改Dockerfile并重新構(gòu)建鏡像時(shí),Docker只會(huì)重新構(gòu)建那些發(fā)生改變的層及其之后的層,大大加快了構(gòu)建速度。
只讀性(Read-Only)
- 鏡像本身是只讀的。當(dāng)你從一個(gè)鏡像啟動(dòng)一個(gè)容器時(shí),Docker會(huì)在鏡像的所有層之上添加一個(gè)可寫的容器層(Container Layer)。
- 所有對(duì)運(yùn)行中容器的修改(如創(chuàng)建新文件、修改文件、安裝軟件)都發(fā)生在這個(gè)可寫層上。這使得容器可以隨意更改,而不會(huì)影響到底層的基礎(chǔ)鏡像。
- 當(dāng)某個(gè)容器需要修改這個(gè)共享層里的文件時(shí),寫時(shí)復(fù)制機(jī)制會(huì)觸發(fā),為該容器單獨(dú)復(fù)制一份文件到其可寫層進(jìn)行修改,而其他容器仍然讀取原始文件。
內(nèi)容可尋址(Content-Addressable)
- 每個(gè)鏡像都有一個(gè)唯一的標(biāo)識(shí)符,稱為鏡像ID(一個(gè)SHA256哈希值)。這個(gè)ID是根據(jù)鏡像每一層的內(nèi)容計(jì)算出來的。
- 這意味著只要鏡像的內(nèi)容完全相同,它們的ID就一定會(huì)相同。這保證了鏡像的唯一性和完整性。
基于聯(lián)合文件系統(tǒng)(Union File Systems)
- 分層和只讀的特性是通過聯(lián)合文件系統(tǒng)(如Overlay2、AUFS) 來實(shí)現(xiàn)的。這種文件系統(tǒng)能夠?qū)⒍鄠€(gè)不同的目錄(層)透明地疊加在一起,形成一個(gè)統(tǒng)一的視圖,呈現(xiàn)給容器。
為什么要使用鏡像?
最核心的理由是:鏡像提供了一種標(biāo)準(zhǔn)化的、輕量級(jí)的、不可變的交付物,它保證了應(yīng)用在任何環(huán)境中都能以完全一致的方式運(yùn)行,從而實(shí)現(xiàn)了“構(gòu)建一次,隨處運(yùn)行”。
下面我們從幾個(gè)關(guān)鍵角度來詳細(xì)拆解為什么要使用鏡像:
- 解決環(huán)境一致性難題(“在我這兒是好的!”)
這是使用鏡像最首要、最直接的原因。
傳統(tǒng)痛點(diǎn):
- 開發(fā)環(huán)境:代碼跑通了。
- 測(cè)試環(huán)境:測(cè)試說有問題,依賴的庫版本不對(duì)。
- 生產(chǎn)環(huán)境:運(yùn)維部署失敗,系統(tǒng)配置有差異。
這就是經(jīng)典的“ works on my machine ”問題。
鏡像的解決方案:
- 鏡像將應(yīng)用代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、系統(tǒng)庫、配置全部打包在一起,形成一個(gè)完整的、獨(dú)立的軟件包。
- 這個(gè)包在開發(fā)、測(cè)試、生產(chǎn)任何環(huán)節(jié)都完全一致。
- 結(jié)果:只要在開發(fā)機(jī)能運(yùn)行成功,那么在任何裝有Docker的機(jī)器上(測(cè)試、預(yù)生產(chǎn)、生產(chǎn)),它都能以完全相同的方式運(yùn)行,徹底消除了環(huán)境差異帶來的問題。
- 實(shí)現(xiàn)極致的標(biāo)準(zhǔn)化和交付簡化
鏡像成為一種通用的、標(biāo)準(zhǔn)的軟件交付物。
- 傳統(tǒng)方式:交付物可能是一份代碼、一個(gè)War/Jar包,再加上一長串的、復(fù)雜的、可能還不全的“環(huán)境配置說明文檔”。
- 鏡像方式:交付物就是一個(gè)鏡像文件(或一個(gè)鏡像名稱和標(biāo)簽)。部署命令簡單到極致:docker run our-app:latest。
這個(gè)命令包含了下載、解壓、配置、運(yùn)行所有步驟。它極大地簡化了部署流程,降低了運(yùn)維成本和對(duì)運(yùn)維人員技能的要求。
鏡像相關(guān)的命令
關(guān)于login,pull,push等命令的解析請(qǐng)參考:Docker核心概念與鏡像倉庫操作指南
docker rmi
功能:刪除鏡像。
語法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
別名:docker image rm,docker image remove
關(guān)鍵參數(shù):
-f:強(qiáng)制刪除;--no-prune:不移除該鏡像的過程鏡像,默認(rèn)移除。
示例:
- 準(zhǔn)備鏡像:
docker pull busybox:1.36.0docker pull busybox:1.35.0
- 查看鏡像:
docker images busybox - 刪除鏡像
- 方法一:通過ID刪除
- 方法二:通過tag刪除

注意:被引用的鏡像無法被刪除,需要先關(guān)閉相應(yīng)的容器。
示例:
- 重新拉取鏡像:
docker pull busybox:1.36.0 busybox:1.36.0 - 啟動(dòng)容器:
docker run -it --name mybox busybox:1.36.0 sh - 刪除鏡像:
docker rmi busybox:1.36.0 - 刪除容器:
docker rm mybox - 再次刪除鏡像:
docker rmi busybox:1.36.0 - 查看鏡像信息:
docker images busybox

注意:鏡像有多個(gè)標(biāo)簽時(shí),指定鏡像標(biāo)簽所刪除的只是標(biāo)簽,鏡像并沒刪除,在使用該鏡像的容器在運(yùn)行,只是不能再用標(biāo)簽管理,只能使用ID
docker save
功能:將指定鏡像保存成 tar 歸檔文件。
語法:
docker save [OPTIONS] IMAGE [IMAGE...]
別名:docker image save
關(guān)鍵參數(shù):
-o:輸出到的文件。
示例:

docker load
功能:導(dǎo)入使用 docker save 命令導(dǎo)出的鏡像。
語法:
docker load [OPTIONS]
別名:docker image load
關(guān)鍵參數(shù):
--input, -i:指定導(dǎo)入的文件,代替 STDIN。--quiet, -q:精簡輸出信息。
示例:
- 刪除原有鏡像
- 導(dǎo)入鏡像

docker history
功能:展示的是鏡像的構(gòu)建歷史記錄
語法:
docker history [OPTIONS] IMAGE
別名:docker image history
關(guān)鍵參數(shù):
-H, --human:大小和日期采用人容易讀的格式展現(xiàn)--no-trunc:顯示全部信息,不要隔斷-q, --quiet:只顯示鏡像 ID 信息
示例:

docker image prune
功能:刪除不使用的鏡像。
語法:docker image prune [OPTIONS]
關(guān)鍵參數(shù):
-a, --all:刪除全部不使用的鏡像;--filter filter:指定過濾條件;-f, --force:不提示是否刪除。
離線遷移鏡像
離線遷移鏡像指的是在沒有網(wǎng)絡(luò)連接或無法直接訪問鏡像倉庫(如Docker Hub、Harbor)的環(huán)境下,將Docker鏡像從一臺(tái)機(jī)器轉(zhuǎn)移到另一臺(tái)機(jī)器的過程。
它不通過網(wǎng)絡(luò)拉?。╠ocker pull),而是先將鏡像打包成一個(gè)離線文件(如.tar歸檔文件),然后通過物理媒介(如U盤、移動(dòng)硬盤)或內(nèi)部文件傳輸方式,將這個(gè)文件復(fù)制到目標(biāo)機(jī)器上,最后再加載到目標(biāo)機(jī)器的Docker環(huán)境中。
這里使用scp把鏡像從一個(gè)服務(wù)器拷貝到另一個(gè)服務(wù)器,這個(gè)過程的鏡像數(shù)據(jù)流是在兩個(gè)服務(wù)器之間直接通過SSH協(xié)議傳輸?shù)?,完全走的是?nèi)部的網(wǎng)絡(luò)通道,與外部互聯(lián)網(wǎng)隔離。
- 導(dǎo)出鏡像:
docker save -o mybox2.0 busybox:1.35.0 - 拷貝到另一臺(tái)服務(wù)器:
scp docker mybox2.0 root@服務(wù)器IP:要拷貝到的目錄 - 另一臺(tái)服務(wù)器把鏡像導(dǎo)出:
docker load -i mybox2.0
到此這篇關(guān)于Docker鏡像指南之從核心命令到離線遷移實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Docker鏡像離線遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker通過sbom獲取組件版本和漏洞編號(hào)的方法
本文主要介紹了docker通過sbom獲取組件版本和漏洞編號(hào)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
Docker Gitlab+Jenkins+Harbor構(gòu)建持久化平臺(tái)操作
這篇文章主要介紹了Docker Gitlab+Jenkins+Harbor構(gòu)建持久化平臺(tái)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Docker數(shù)據(jù)存儲(chǔ)之tmpfs mounts詳解
今天小編就為大家分享一篇關(guān)于Docker數(shù)據(jù)存儲(chǔ)之tmpfs mounts詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
Docker rocketmq部署的實(shí)現(xiàn)示例
最近學(xué)習(xí)使用 rocketmq,需要搭建 rocketmq 服務(wù)端,本文主要記錄 rocketmq 搭建過程以及這個(gè)過程踩到的一些坑,感興趣的可以了解一下2021-12-12
docker安裝RocketMQ的實(shí)現(xiàn)步驟
本文主要介紹了docker安裝RocketMQ的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

