Docker的save和export命令的區別

2022-01-10 奇妙的Linux世界
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> 來回滾之前的層)。

vagrant@ubuntu-13:~$ 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 問答錄(100 問),更多有關Docker相關常見問題可參考:https://blog.lab99.org/post/docker-2016-07-14-faq.html

隨著鏡像分層平面化後,docker images --tree 這個命令就取消了。幸運的是,Nate Jones 寫了一個工具,用於可視化鏡像分層依賴,叫做 dockviz:https://github.com/justone/dockviz

對於 Mac 平臺的用戶,可以很方便的使用 brew 來進行安裝:

brew install dockviz

對於其它平臺的用戶,可以直接去發布頁面下載。

安裝好後,直接執行 dockviz images --tree 即可:

├─<missing> Virtual Size: 1.1 MB

│ └─<missing> Virtual Size: 1.1 MB

│   └─176825169704 Virtual Size: 1.1 MB Tags: busybox-1:latest

├─616f38fe120d Virtual Size: 1.1 MB Tags: busybox-1-export:latest

在新版本Docker中也可以使用 docker history 命令來查看鏡像歷史。

參考文檔

http://www.google.com

https://my.oschina.net/zjzhai/blog/225112

https://blog.lab99.org/post/docker-2016-07-14-faq.html

如果你覺得內容很贊,還等什麼?快快長按打賞吧,iOS的土豪們也是可以的喲!




相關焦點

  • Win11 Docker 部署 Vue 項目
    Docker鏡像的導入導出導入導出命令介紹涉及的命令有export、import、save、loadsave    docker save [options會成功導入鏡像及相關元數據,包括tag信息export    docker export [options] container
  • Docker小白到實戰之常用命令演示,通俗易懂
    2.3 容器常用命令容器是用鏡像創建的運行實例, 它可以被啟動、開始、停止、刪除,每個容器都是相互隔離;可以把容器看做是一個極簡版的Linux環境和在其中運行程序的組合;容器和鏡像幾乎一樣,唯一的區別就是鏡像層上面加載了一個可寫層,這層稱為
  • export和export default的區別
    ES6 在語言標準的層面上,實現了模塊功能,而且實現得相當簡單,完全可以取代 CommonJS 和 AMD 規範,成為瀏覽器和伺服器通用的模塊解決方案。ES6中,在JavaScript ES6中,export與export default均可用於導出常量、函數、文件、模塊等。二、export命令模塊功能主要由兩個命令構成:export和import。
  • Docker命令大整理,附示例!
    docker中有REPOSITORY, TAG, IMAGE,CONTAINER的概念docker命令中的鏡像名,容器名 支持使用Tab鍵進行聯想1 Docker容器 docker中默認的命令是對容器進行操作 ,現在看到容器相關的命令是默認沒有container的。
  • 經驗總結 | Docker 使用筆記
    0x00 前言平時在使用 Docker 時,經常會碰到忘記相關命令的情況,因此平時忘記一個就會記錄一個,經過多年的記錄,Docker 相關的筆記已經記錄了不少。最近
  • Docker 鏡像的構建原理和四種製作鏡像方式
    Docker 鏡像的構建原理和方式Docker構建鏡像的方式有多種,先介紹下最常用的兩種通過docker commit命令,基於一個已存在的容器構建出鏡像。編寫 Dockerfile 文件,並使用docker build命令來構建鏡像。
  • Docker安裝基本命令操作,帶你了解鏡像和容器的概念!
    ① 如果有安裝過docker的小夥伴,可以執行下面命令進行刪除:[root@VM-0-3-centos /]# yum -y remove docker完整名字② 如果安裝過,那麼再將鏡像/容器刪除,命令如下:[root@VM-0-3-centos
  • docker反向查看啟動命令和dockerfile
    最近發現兩個非常好用的工具,一個是 runlike,一個是 whaler聽起
  • docker基礎命令
    在容器中運行"echo"命令,輸出"hello word"# docker run image_name echo "hello word"  2.如果不指定-y參數的話,yum 命令會進入交互模式,需要用戶輸入命令來進行確認,但在docker環境中是無法響應這種交互的。yum  命令執行完畢之後,容器就會停止,但對容器的改動不會丟失。5. 查看容器(ps)1.
  • Docker 基礎用法和命令幫助
    因為種種原因,國內下載 Docker HUB 官方的相關鏡像比較慢,可以使用docker.cn鏡像,鏡像保持和官方一致,關鍵是速度塊,推薦使用。                  2.1 docker help                  docker command                  $ sudo docker   # docker 命令幫助Commands:attach    Attach to a running container                 # 當前 shell
  • Docker常用命令,值得收藏!
    操作容器run$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]使用指定的鏡像來運行容器,並可選地在容器中運行指定的命令。啟動停止的容器(還是運行之前給定的命令)。
  • 【20210109】Docker學習筆記
    安裝Docker3.1 安裝使用yum安裝docker3.2 驗證輸入命令[root@tfdev ~]# docker -vDocker version 1.13.1, build 0be3e21/1.13.13.3 啟動關閉SELinux,這玩意和docker合不來打開selinux的配置文件
  • docker常用命令詳解
    wait|export|port|rename|stat]容器rootfs命令 — docker [commit|cp|diff]鏡像倉庫 — docker [login|pull|push|search]本地鏡像管理 — docker [build|images|rmi|tag|save|import|load]容器資源管理 — docker [volume|network]系統日誌信息 — docker
  • docker命令大全(二)
    Docker是一個虛擬環境容器,可以將你的開發環境、代碼、配置文件等一併打包到這個容器中,並發布和應用到任意平臺中。所以你需要知道一點docker的命令。這裡是關於docker的基礎命令(第二節)images docker images:列出本地鏡像語法docker images [OPTIONS
  • Docker
    docker查看幫助、查看命令幫助、docker系統信息、docker版本信息docker --helpdocker command --helpdocker infodockerbin/bash:交換shell設置鏡像標籤docker tag <IMAGE ID> <name> 指定鏡像保存為tar文件docker save -o <name.tar> <REPOSITORY>導入鏡像docker load -i <name.tar>docker import <name.tar> <REPOSITORY
  • Docker 新手入門
    安裝](https://docs.docker.com/installation/)## Docker常見命令 ###### 容器相關操作- docker create   # 創建一個容器但是不啟動它- docker run      # 創建並啟動一個容器- docker stop     #
  • Docker(五):Docker 三劍客之 Docker Machine
    使用 docker-machine 命令,你可以啟動、審查、停止和重新啟動託管的宿主機、升級 Docker 客戶端和守護程序、並配置 Docker 客戶端與你的宿主機通信。為什麼要使用它?Docker Machine 使你能夠在各種 Linux 上配置多個遠程 Docker 宿主機。
  • 你應該學會的docker使用技巧
    docker start [stop| restart] xxxdocker ps -adocker save -o ubuntu.tar.gz ubuntu:14.04  *(保存的是所有這個鏡像的版本記錄,包括一些歷史數據.)*docker export pid > .
  • Docker命令大全及Dockerfile詳解(附示例)
    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化
  • 從零開始安裝和使用docker
    安裝和啟動docker安裝docker的命令為:yum install docker-ce執行後報[root@localhost ~]# yum install docker-ceLoaded plugins: fastestmirrorLoading mirror speeds from cached hostfile