1. 程式人生 > >Docker持久化 save和export的區別

Docker持久化 save和export的區別

前記:

1、save&load用於持久化image;export&import用於持久化container;
2、持久化後都生成.tar檔案,並且load和import都可以匯入和載入,效果一樣,最終得到的是一個image而非container;
3、save image會把映象變更的歷史和layer存下來,用於回滾;export container會把歷史和layer丟棄,無法回滾;

===================================
Docker是如何工作的(簡單說明)
Docker是基於映象的。映象類似於已經包含了檔案、配置和安裝好的程式的虛擬機器映象。同樣的,你可以像啟動虛擬機器一樣啟動多個映象例項。執行中的映象稱為容器。你可以修改容器(比如刪除一個檔案),但這些修改不會影響到映象。不過,你使用`docker commit <container-id> <image-name>

命令可以把一個正在執行的容器變成一個新的映象。
舉個例子:

# 像Docker官方的hello world例子一樣,拉取一個叫busybox的映象
    sudo docker pull busybox
    # 檢視本地已經有哪些映象
    # 我們可以看到busybox
    sudo docker images
    # 現在讓我們來修改下busybox映象的容器
    # 這次,我們建立一個資料夾
    sudo docker run busybox mkdir /home/test
    # 讓我們再看看我們有哪些映象了。
    # 注意每條命令執行後容器都會停止
# 可以看到有一個busybox容器 sudo docker ps -a # 現在,可以提交修改了。 # 提交後會看到一個新的映象busybox-1 # <CONTAINER ID> 是剛剛修改容器後得到的ID sudo docker commit <CONTAINER ID> busybox-1 # 再看看我們有哪些映象。 # 我們現在同時有busybox和busybox-1映象了。 sudo docker images # 我們執行以下命令,看看這兩個映象有什麼不同 sudo
docker run busybox [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found' sudo docker run busybox-1 [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'

現在,我們有兩個不同的映象了(busybox和busybox-1),還有一個通過修改busybox容器得來的容器(多了一個/home/test資料夾)。下面來看看,是如何持久化這些修改的。

匯出(Export)

Export命令用於持久化容器(不是映象)。所以,我們就需要通過以下方法得到容器ID:
sudo docker ps -a
接著執行匯出:
sudo docker export <CONTAINER ID> > /home/export.tar

最後的結果是一個2.7MB大小的Tar檔案(比使用save命令稍微小些)。

儲存(Save)

Save命令用於持久化映象(不是容器)。所以,我們就需要通過以下方法得到映象名稱:
sudo docker images

接著執行儲存:
sudo docker save busybox-1 > /home/save.tar

最後的結果是一個2.8MB大小的Tar檔案(比使用export命令稍微大些)。

它們之間的不同

現在我們建立了兩個Tar檔案,讓我們來看看它們是什麼。首先做一下小清理——把所有的容器和映象都刪除:

    # 檢視所有的容器
    sudo docker ps -a

    # 刪除它們
    sudo docker rm <CONTAINER ID>

    # 檢視所有的映象
    sudo docker images

    # 刪除它們
    sudo docker rmi busybox-1
    sudo docker rmi busybox

譯註:可以使用docker rm $(docker ps -q -a)一次性刪除所有的容器,docker rmi $(docker images -q)一次性刪除所有的映象。

現在開始匯入剛剛匯出的容器:

匯入export.tar檔案

cat /home/export.tar | sudo docker import - busybox-1-export:latest
  # 檢視映象
sudo docker images
  # 檢查是否匯入成功,就是啟動一個新容器,檢查裡面是否存在/home/test目錄(是存在的)
sudo docker run busybox-1-export [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'

使用類似的步驟匯入映象:

# 匯入save.tar檔案
    docker load < /home/save.tar

# 檢視映象
    sudo docker images

# 檢查是否匯入成功,就是啟動一個新容器,檢查裡面是否存在/home/test目錄(是存在的)
    sudo docker run busybox-1 [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'

我們發現匯出後的版本會比原來的版本稍微小一些。那是因為匯出後,會丟失歷史和元資料。

顯示映象的所有層(layer)

sudo docker images --tree

執行命令,顯示下面的內容。
正如你看到的,匯出後再匯入(exported-imported)的映象會丟失所有的歷史,而儲存後再載入(saveed-loaded)的映象沒有丟失歷史和層(layer)。
這意味著使用匯出後再匯入的方式,你將無法回滾到之前的層(layer),同時,使用儲存後再載入的方式持久化整個映象,就可以做到層回滾(可以執行docker tag <LAYER ID> <IMAGE NAME>來回滾之前的層)。

$ sudo docker images --tree
    ├─f502877df6a1 Virtual Size: 2.489 MB Tags: busybox-1-export:latest
    └─511136ea3c5a Virtual Size: 0 B
      └─bf747efa0e2f Virtual Size: 0 B
        └─48e5f45168b9 Virtual Size: 2.489 MB
          └─769b9341d937 Virtual Size: 2.489 MB
            └─227516d93162 Virtual Size: 2.489 MB Tags: busybox-1:latest

相關推薦

Docker持久化 saveexport區別

前記: 1、save&load用於持久化image;export&import用於持久化container; 2、持久化後都生成.tar檔案,並且load和import都可以匯入和載入,效果一樣,最終得到的是一個image而非containe

export default export 區別

能夠 imp 多個 pos export 加載模塊 body exp 加載 1.export與export default均可用於導出常量、函數、文件、模塊等 2.你可以在其它文件或模塊中通過import+(常量 | 函數 | 文件 | 模塊)名的方式,將其導入,以便能夠對

sourceexport區別

背景:當我們啟動linux後,將啟動一個使用者shell,在這個shell中,可以使用shell命令或宣告變數,也可以建立並執行shell指令碼程式,執行shell指令碼時,系統將建立一個子shell用來執行,每個shell都是由某個shell(稱為父shell)派生的 #a.sh #! /b

ES6:export default export 區別

export default 和 export 區別: 1.export與export default均可用於匯出常量、函式、檔案、模組等 2.你可以在其它檔案或模組中通過import+(常量 | 函式 | 檔案 | 模組)名的方式,將其匯入,以便能夠對其進行使用 3.在一個檔案或模組中,export、i

Vue中 export default export 區別

exp 普通 技術 port 關系 amd ring 大括號 沒有 1.export與export default均可用於導出常量、函數、文件、模塊等2.在一個文件或模塊中,export、import可以有多個,export default僅有一個3.通過export方式導

shell中sourceexport區別

source命令用法: source FileName 作用:在當前bash環境下讀取並執行FileName中的命令。該命令通常用命令“.”來替代。  source命令(從 C Shell 而來)是bash shell的內建命令。點命令,就是個點符號,(從Bourne S

docker save load export import的區別

export export命令用於持久化容器(不是映象)。所以,我們就需要通過以下方法得到容器ID: sudo docker ps -a 接著執行匯出: sudo docker export <CONTAINER ID> > /home

exportexport default import 區別 以及用法

彈出 但是 clas 能夠 引用 port 模塊 返回值 兩個 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和import export用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口 imp

export,importexport default的區別

模塊 post 註意 strong 情況 fun blog 指定 再看 首先要知道export,import ,export default是什麽 ES6模塊主要有兩個功能:export和importexport用於對外輸出本模塊(一個文件可以理解為一個模塊)變量的接口im

Es6新增的模組化exportexport default的主要區別

1.在一個檔案或模組中,export,import可以有多個,而export default只能有一個。 2.通過export匯出模組式,匯入此模組要加{},export default 則不需要。 詳細例子如下:  1、export  //demo

docker使用之saveload命令以及一些其它命令

在上一篇部落格中介紹了編寫簡單的dockerfile的方法,可以通過編寫dockerfile,然後利用dockerfile建立容器的方法,將一個工程建立為docker容器,然後通過docker run命令執行已建立的容器。 那麼,如果本地或當前虛擬機器上已存在一個docker容器,我想要

exportexport dafault以及exportsmoudle.exports的區別

1、import引入依賴包不需要相對路徑,引入其他變數、函式等需要相對路徑 例如:引入依賴包 import axios from 'axios'; 引入函式 import appservice from './appservice'; 2、使用export丟擲的變數,引入時名稱是丟擲的名稱

docker 原理 docker容器映象區別

docker容器和映象區別   這篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和映象(image)之間的區別,並深入探討容器和執行中的容器之間的區別。  當我對Docker技術還是一知半解的時候,我發現

npm install -save -save-dev 區別

轉載:https://www.limitcode.com/detail/59a15b1a69e95702e0780249.html 回顧 npm install 命令 最近在寫Node程式的時候,突然對 npm install 的-save和-save-dev 這兩個引數的使用比較混亂。其實博主在這之前對

npm --save--save-dev區別

1、npm install 就是安裝模組,npm run dev 就是執行npm script中的命令。當我們執行npm命令的時候,它到哪裡去找,這就要說到每個node專案中都有的核心檔案package.json 檔案。2、專案剛剛開始時,就要建立package.json這個檔案,可以進入專案目錄手動建立,就

s5 Docker持久化儲存資料共享

資料庫容器的資料如何才能不會丟失?Docker的持久化儲存技術。Docker的資料共享技術能極大提高開發人員的開發效率,邊寫程式碼,邊看執行結果。 資料持久化之Data Volume   Docker持久化資料的方案 ·基於本地檔案系統的Volume。可以在執行Docker create

export, import export default的區別

ES6的兩個功能: export 和 import export 對外輸出模組 import 引入(載入)進來一個模組 一、export => import 單個變數 export var name = "lishi" 在其他檔案裡引用 import {na

exports、module.exportsexportexport default區別

      在 Node 環境中,一個.js檔案就稱之為一個模組(module),每個檔案就是一個模組,有自己的作用域,在一個檔案裡面定義的變數、函式、類,都是私有的,對其他檔案不可見,而 Node 應用由模組組成,採用 CommonJS 模組規範

Docker中映象容器的區別

一、Docker映象 要理解Docker映象和Docker容器之間的區別,確實不容易。 假設Linux核心是第0層,那麼無論怎麼執行Docker,他都是運行於核心層之上的。這個Docker映象,是一個只讀的映象,位於第一層,他不能被修改或不能儲存狀態。 一

【後臺技術開發】Docker的映象容器的區別(10張圖讓你深入理解Docke的r容器映象)

這篇文章希望能夠幫助讀者深入理解Docker的命令,還有容器(container)和映象(image)之間的區別,並深入探討容器和執行中的容器之間的區別。 當我對Docker技術還是一知半解的時候,我發現理解Docker的命令非常困難。於是,我花了幾周的時間來學習Docker的工作原理,更確切地說,是關於