docker save/load以及export/import使用測試


對於有些環境需要離線安裝的情況,docker以及docker容器都需要能夠支持離線安裝,對於docker離線安裝,比較簡單,按照https://www.cnblogs.com/qq931399960/p/11120429.html下載docker依賴包即可。對於docker容器或者鏡像的離線安裝,下面以mysql 5.7.27版本為例進行下測試。

save/load

一、按照如下方式安裝並啟動mysql docker容器

https://www.cnblogs.com/qq931399960/p/11341875.html

二、修改mysql容器配置參數,比如將max_connections設置為2000

三、將當前mysql容器保存為一個新的鏡像(鏡像是只讀的,我們不能夠修改鏡像。如果不保存當前鏡像,而且直接save之前默認的鏡像,則參數max_connections的值不會是2000)

格式:

docker commit containerID repository:tag

四、將新保存的鏡像save到本地

格式

docker save imageID -o saveImageName.tar 或者
docker save imageID > saveImageName.tar

五、加載鏡像,當前使用了一台虛擬機進行測試,為了效果明顯,先停止並刪除已經保存到本地IMAGE ID為58197de028a9的容器和鏡像

加載鏡像格式

docker load -i saveImageName.tar 或者
docker load < saveImageName.tar

我們發現,只導入了一層數據,這是由於docker鏡像是分層的,我們系統中已經存在一個從docker.io/mysql庫中獲取到的mysql,並且我們當前導入的容器是在其基礎上生成,docker使用公共的mysql容器的分層,只加載了不同的分層。如果我們將原有的mysql鏡像都刪除,則每層都會加載,由於我們做了修改,故會新加一層,及上圖中大小12.29k的最后一個層。

可以發現,這里有12層,比之前默認下載的5.7.27版本多了一層。

六、解決鏡像REPOSITORYTAGnone問題

通過docker images可以發現IMAGE IDSIZE都與之前一致,但REPOSTIORYTAG顯示為none

解決此問題,需要使用到docker tag命令

格式

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] 或者
docker tag IMAGEID TARGET_IMAGE[:TAG]   

七、驗證

根據新導入的鏡像,啟動mysql容器

docker run --name mysqltest -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -d mysql:5.7.27

查看mysqlmax_connections配置是否為2000,為2000,則鏡像導出導入正確

docker exec -it mysqltest mysql -uroot -p;
show variables like '%max_connections%';

export/import

 停止已啟動的mysql容器並刪除,刪除所有mysql鏡像,重新安裝mysql 5.7.27版本,並設置max_connections的值為2000

一、導出容器

格式

docker export CONTAINER ID|NAME -o container_name.tar

二、導入容器(可直接導入到當前服務器,或者下載並上傳到其他服務器導入)

格式

docker import container_name.tar 或者
cat container_name.tar | docker import -repository:tag

前者導入的容器,repository和tag都為none,如果使用此方式,則需要使用tag命令修改下repository和tag,后者則對應的值分別為mysqlnew和5.7.27。導入的為容器,但導入到服務器后,變為了鏡像。

三、啟動新導入的鏡像(mysqlnew)

按照常用方式啟動(mysqltest容器名稱,及3306端口已被占用)

docker run --name mysqltestnew -p 3307:3307 -e MYSQL_ROOT_PASSWORD=12345 -d mysqlnew:5.7.27

根據錯誤提示信息,大致可以看出來是由於命令缺失,造成啟動失敗,使用如下命令查看已啟動的mysql所使用的command

docker ps --no-trunc

修改啟動命令,並重新啟動

docker run --name mysqltestnew -p 3307:3307 -e MYSQL_ROOT_PASSWORD=12345 -d mysqlnew:5.7.27 docker-entrypoint.sh mysqld

 

啟動正常,登錄到mysql客戶端,查看max_connections的值也為2000。

 

 

 save/load和export/import區別

1、前者保存的為鏡像,后者導出的為容器

2、前者導入的鏡像后需要使用tag執行repository和tag,后者可以在導入的時候指定這兩個參數

3、以mysql為例,前者啟動時不需要添加docker-entrypoint.sh mysqld,后者則需要

4、前者導入的時候,只導入所需的層,並顯示導入的進度及image id,分層導入結果很清晰,后者則只返回image id

5、前者導入的鏡像大小不變,后者導入的鏡像則丟失了一些歷史和層數據,數據包比較小

 

可通過如下官方地址了解更多命令

https://docs.docker.com/engine/reference/commandline/

 

mysql容器啟動時將數據掛載在宿主機

mysql默認數據保存地址為/var/lib/mysql,可以通過如下命令在容器啟動時,將數據掛載在宿主機,這樣重新生成新的鏡像,save到本地后,不包含data數據(在測試一遍,另外雖然能差不多肯定如果沒有掛載數據,則mysql容器中data會被save到本地,但是也需要測一下????)

docker run --name mysql_test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345 -v /docker/mysql/data:/var/lib/mysql -d mysql:5.7.27

 


免責聲明!

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



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