首先,我們來分別說明一下docker save和docker export:
docker save
docker的命令行接口設(shè)計得很優(yōu)雅,很多命令的幫助直接在后面加–help就可以查看。
docker save的幫助如下:
>docker?save?--help Usage:??docker?save?[OPTIONS]?IMAGE?[IMAGE...] Save?one?or?more?images?to?a?tar?archive?(streamed?to?STDOUT?by?default) Options: ??????--help????????????Print?usage ??-o,?--output?string???Write?to?a?file,?instead?of?STDOUT
從命令行幫助可以看出,docker save是用來將一個或多個image打包保存的工具。
例如我們想將鏡像庫中的postgres和mongo打包,那么可以執(zhí)行:
docker?save?-o?images.tar?postgres:9.6?mongo:3.4
打包之后的images.tar包含postgres:9.6和mongo:3.4這兩個鏡像。
雖然命令行參數(shù)要求指定image,實(shí)際上也可以對container進(jìn)行打包,例如:
>docker?ps CONTAINER?ID????????IMAGE???????????????COMMAND??????????????????CREATED?????????????STATUS??????????????PORTS???????????????NAMES 3623943d369f????????postgres:9.6????????"docker-entrypoint..."???3?hours?ago?????????Up?3?hours??????????5432/tcp????????????postgres >docker?save?-o?b.tar?postgres >docker?save?-o?c.tar?postgres:9.6 >ls?-al -rwxrwxrwx?1?root?root?277886464?8月??26?14:40?b.tar -rwxrwxrwx?1?root?root?277886464?8月??26?14:41?c.tar
通過以上命令可以看到,b.tar和c.tar是完全一模一樣的。這說明,docker save如果指定的是container,docker save將保存的是容器背后的image。
將打包后的鏡像載入進(jìn)來使用docker load,例如:
docker?load?-i?images.tar
上述命令將會把postgres:9.6和mongo:3.4載入進(jìn)來,如果本地鏡像庫已經(jīng)存在這兩個鏡像,將會被覆蓋。
docker save的應(yīng)用場景是,如果你的應(yīng)用是使用docker-compose.yml編排的多個鏡像組合,但你要部署的客戶服務(wù)器并不能連外網(wǎng)。這時,你可以使用docker save將用到的鏡像打個包,然后拷貝到客戶服務(wù)器上使用docker load載入。
docker export
照例查看下docker export的幫助:
>docker?export?--help Usage:??docker?export?[OPTIONS]?CONTAINER Export?a?container's?filesystem?as?a?tar?archive Options: ??????--help????????????Print?usage ??-o,?--output?string???Write?to?a?file,?instead?of?STDOUT
從幫助可以看出,docker export是用來將container的文件系統(tǒng)進(jìn)行打包的。例如:
docker?export?-o?postgres-export.tar?postgres
docker export需要指定container,不能像docker save那樣指定image或container都可以。
將打包的container載入進(jìn)來使用docker import,例如:
docker?import?postgres-export.tar?postgres:latest
從上面的命令可以看出,docker import將container導(dǎo)入后會成為一個image,而不是恢復(fù)為一個container。
另外一點(diǎn)是,docker import可以指定IMAGE[:TAG],說明我們可以為鏡像指定新名稱。如果本地鏡像庫中已經(jīng)存在同名的鏡像,則原有鏡像的名稱將會被剝奪,賦給新的鏡像。原有鏡像將成為孤魂野鬼,只能通過IMAGE ID進(jìn)行操作。
docker export的應(yīng)用場景主要用來制作基礎(chǔ)鏡像,比如你從一個ubuntu鏡像啟動一個容器,然后安裝一些軟件和進(jìn)行一些設(shè)置后,使用docker export保存為一個基礎(chǔ)鏡像。然后,把這個鏡像分發(fā)給其他人使用,比如作為基礎(chǔ)的開發(fā)環(huán)境。
docker save和docker export的區(qū)別
-
docker save保存的是鏡像(image),docker export保存的是容器(container);
-
docker load用來載入鏡像包,docker import用來載入容器包,但兩者都會恢復(fù)為鏡像;
-
docker load不能對載入的鏡像重命名,而docker import可以為鏡像指定新名稱。
推薦教程:docker