在 docker 的概念中, 有兩套導入導出的概念. 分別是
export 和 import還有save 和 load百度搜索??它們的區(qū)別, 有一篇被引用了很多次的文章雖然講的很詳細, 還加入了一些實驗驗證, 但是試驗中為了實現(xiàn)同一個效果而使用了 commit 命令更改了鏡像內(nèi)容. 理解和使用起來可能會有些偏差, 本文將以最簡單明了的方式介紹 docker 中的兩套導入導出功能
| export&import | save&load | |
|---|---|---|
| 導出對象 | 容器 | 鏡像 |
| 導入對象 | tar 包 | tar 包 |
| 導出對象 | 鏡像 | 鏡像 |
| 鏡像層數(shù) | 一層 | 多層 |
下面我們來一行一行的解釋
操作對象
操作的對象不同, export 和 import 是用來導入導出容器用的, 而 save 和 load 是用來導入導出鏡像用的.
例如: 你需要把 A 機器上的 甲 容器遷移到 B 機器, 且 甲 容器中有重要的數(shù)據(jù)需要隨之一起遷移的, 就可以使用 export 和 import 參數(shù)來導入和導出
例如: 你的服務器不能 pull 下來某個鏡像, 但是你有一臺海外的機器, 你可以在海外的那臺機器上把需要的鏡像 pull 下來, 然后把該鏡像通過 save 命令導出為一個 tar 包, 再將 tar 包拉回到本地導入
所以, 從功能定位上, 你就記住 save 和 load參數(shù)是用來遷移鏡像的這個場景就行了, 另外的 export 和 import當然就是用來遷容器的
導出對象
在導出對象這一點, export 和 save 導出的文件形式都是一樣的, 兩者都是導出為一個 tar 包
導入對象
在導入上, import 和 load 通過 tar 包導入的都是一個鏡像
導入的鏡像層數(shù)
最大的區(qū)別就在這里, 通過export 和 import導出的容器形成鏡像時, 該鏡像只有一層
通過save 和 load 導出的鏡像保留了原鏡像所有的層次結構, 導出時原鏡像有幾層, 導入的時候就還是有幾層
想導出容器, 但是還想保留層次結構怎么辦?
導出容器, 很快就想到唯一一個可以導出容器的工具 export
但是又想保留底層鏡像的層次結構, 那么 export 就不符合需求了
想想導出帶層次結構的工具就只有鏡像導出工具 save 了, 但是容器在鏡像層之上還有一層新的數(shù)據(jù)怎么一起導出去呢?
這個時候就需要引入一個新的參數(shù) commit, 用來保存容器現(xiàn)有的狀態(tài)為一個新的鏡像
比如在 A 機器上運行的 甲 容器是基于 甲方乙方 這個鏡像跑起來的, 那么我就可以通過 commit 參數(shù), 將 甲 容器的所有內(nèi)容保存為一個新的鏡像, 名字叫 私人訂制 (內(nèi)含一梗哦??) 最后我再通過鏡像導出工具 save 就可以完整的將 私人訂制鏡像(也就是 甲容器 )導出為一個 tar 包了
而且包含了 X+1 層鏡像, X 層是原鏡像 甲方乙方 的所有鏡像層數(shù), 1是容器 甲 多的那一層可寫層的鏡像
總結
總結來說我也希望大家使用 docker 能遵循 docker 的設計初衷, 運行一個無狀態(tài)的容器. 如果是無狀態(tài)的容器, 就不會產(chǎn)生 想導出容器, 但是還想保留層次結構怎么辦? 這樣的奇葩問題了.
所以最后還是要再次強調(diào):
- export 和 import 是用來導出導入容器用的, 導出的是容器的文件系統(tǒng), 導出后的鏡像只有一層
- save 和 load 是用來導出導入鏡像用的, 導出后保持著原鏡像的層次結構
這里我沒有詳細介紹這四個參數(shù)的具體用法, 因為網(wǎng)上已經(jīng)有很詳細的文章介紹啦, 一下就是百度經(jīng)常能搜到的關于 docker 導入導出的文章
https://my.oschina.net/zjzhai/blog/225112
具體用法可以參考以上文章, 但是概念理解, 我還是覺得自己寫的比較清楚??, 因為我沒有故意構造出導出容器和導出鏡像結果相同的場景
參考文檔
docker export 官方文檔https://docs.docker.com/engine/reference/commandline/export/
docker save 官方文檔https://docs.docker.com/engine/reference/commandline/save/
docker commit 官方文檔https://docs.docker.com/engine/reference/commandline/commit/