export和import
export、import命令是一對,save、load命令是一對。
export:導出容器快照為鏡像。
import:導入容器快照到本地鏡像庫。
save:將指定鏡像保存成tar文件。
load:導入使用docker save命令導出的鏡像。
commit:將已存在容器中的鏡像和修改內容提交為一個新的鏡像,通過這個方式同樣能保存讀寫層內容。
下面進行演示:
export和import:
命令格式:
docker export -o xxx.tar [容器ID|Name]
docker import xxx.tar newname:tag
先運行一個容器:
docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx
執行:
docker export -o nginx.tar mynginx
docker import nginx.tar mynginx:v1
docker images
先關閉原來的nginx容器,再去運行import生成的鏡像:
docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1
這時候,我們發現docker run
直接報錯,說我們沒有定義執行命令。
這時候,對於import生成的鏡像,我們需要手動指定執行命令。
那么我怎么知道原鏡像的執行命令呢?
兩種辦法:
-
先執行
docker inspect nginx
,查看鏡像的元信息,這里面定義了詳細啟動命令結合紅框不難得出運行命令是:
/docker-entrypoint.sh nginx -g 'daemon off;'
-
docker start mynginx docker ps --no-trunc
重新執行:
docker stop mynginx
docker run --name mynginx.v1 -v /opt/html:/usr/share/nginx/html -p 80:80 -d mynginx:v1 /docker-entrypoint.sh nginx -g 'daemon off;'
所以docker export和import比較坑,import生成的鏡像不能直接run,需要知道之前容器的啟動命令。
那出了不能直接run,還有其他區別嗎?
使用docker inspect,查看原鏡像:文件系統分了很多層。
再看import生成的鏡像:個鏡像只剩了一層,其他的層級全沒有了,整個鏡像體積較之前也小了一些

應用場景:
主要用來制作基礎鏡像,比如從一個ubuntu鏡像啟動一個容器,然后安裝一些軟件和進行一些設置后,使用docker export保存為一個基礎鏡像。然后,把這個鏡像分發給其他人使用,比如作為基礎的開發環境。
save和load
save:
將指定鏡像保存成tar文件。
命令:docker save -o xxx.tar 鏡像名
load:
導入使用docker save命令導出的鏡像。
命令:docker load -i xxx.tar
這兩個命令比較簡單,也沒有什么坑,不着重介紹。
應用場景:
用於鏡像遷移到別處。
commit
將已存在容器中的鏡像和修改內容提交為一個新的鏡像,通過這個方式同樣能保存讀寫層內容。
命令格式:
docker commit [容器名稱|ID] 生成新的鏡像名字
選項說明:
-a:提交的鏡像作者
-c:使用dockerfile指令來創建鏡像
-m:提交時的說明文字
-p:在commit的時候,將正在運行的容器暫停
測試:
docker run --name mynginx -v /opt/html:/usr/share/nginx/html -p 80:80 -d nginx
docker commit mynginx mynginx:v2
docker inspect mynginx:v2
發現比原來的鏡像多了一層。
應用場景:
主要作用是將配置好的一些容器生成新的鏡像,可以得到復用(再次使用不需要再配置)。
通過commit+save+load可以實現:我先在A機器上配置好了一個鏡像,然后通過commit生成了鏡像,使用save命令生成該鏡像對應的tar包,然后移動到B機器上,然后在B機器上執行load命令,加載tar包到本地鏡像倉庫。當然你可以說那我有私人鏡像倉庫,就不用這么麻煩了,但是不是所有機器都在一個局域網內,那么這時候這幾個命令就可以大展身手了。
參考:https://blog.csdn.net/qq_44895681/article/details/106100061