Docker:commit、export、import、save、load命令的使用


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

image-20210922165220616

先關閉原來的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直接報錯,說我們沒有定義執行命令

image-20210922165507849

這時候,對於import生成的鏡像,我們需要手動指定執行命令。

那么我怎么知道原鏡像的執行命令呢?

兩種辦法:

  • 先執行docker inspect nginx,查看鏡像的元信息,這里面定義了詳細啟動命令

    image-20210922170518471

    結合紅框不難得出運行命令是:/docker-entrypoint.sh nginx -g 'daemon off;'

  • docker start mynginx
    docker ps --no-trunc
    

    image-20210922170743081

重新執行:

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,查看原鏡像:文件系統分了很多層。

image-20210922172358663

再看import生成的鏡像:個鏡像只剩了一層,其他的層級全沒有了,整個鏡像體積較之前也小了一些

image-20210922173210551

應用場景:
  主要用來制作基礎鏡像,比如從一個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

image-20210922173925240

發現比原來的鏡像多了一層。

應用場景:
 主要作用是將配置好的一些容器生成新的鏡像,可以得到復用(再次使用不需要再配置)。

通過commit+save+load可以實現:我先在A機器上配置好了一個鏡像,然后通過commit生成了鏡像,使用save命令生成該鏡像對應的tar包,然后移動到B機器上,然后在B機器上執行load命令,加載tar包到本地鏡像倉庫。當然你可以說那我有私人鏡像倉庫,就不用這么麻煩了,但是不是所有機器都在一個局域網內,那么這時候這幾個命令就可以大展身手了。

參考:https://blog.csdn.net/qq_44895681/article/details/106100061

https://zhuanlan.zhihu.com/p/152219012


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM