一、Docker打包容器并跨服務(wù)器傳輸重建加載load鏡像Unable to find image :latest
????使用docker就是因?yàn)閐ocker可以快速進(jìn)行多服務(wù)器部署,所以需要對(duì)部署好的環(huán)境進(jìn)行打包復(fù)制并快速在其它的服務(wù)器上進(jìn)行重建。
? ? 其實(shí)使用起來非常簡(jiǎn)單,使用docker export從運(yùn)行的容器中導(dǎo)出文件,,使用import命令生成鏡像批量傳至目標(biāo)服務(wù)器然后在目標(biāo)服務(wù)器上進(jìn)行l(wèi)oad加載鏡像即可,過程如下:
#查看容器并備份容器
user@u25:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4da5b8faf1a0 nginx "nginx -g 'daemon of…" 45 hours ago Up 18 hours 0.0.0.0:80->80/tcp nginx
2af5436df1e2 deluxo/php7.1-fpm "docker-php-entrypoi…" 2 days ago Up 17 hours 0.0.0.0:9000->9000/tcp php
user@u25:~# docker export 2af5436df1e2 >php_kermit.tar
user@u25:~# docker export 4da5b8faf1a0 > nginx_kermit.tar
user@u25:~# ll -h |grep _kermit
-rw-r--r-- 1 root root 123M Nov 8 11:49 nginx_kermit.tar
-rw-r--r-- 1 root root 794M Nov 8 11:50 php_kermit.tar
#生成鏡像文件
user@u25:~# cat nginx_kermit.tar php_kermit.tar | docker import - kermit_nginx_php:demo
sha256:9fe17159411e655a200dec3a0c989451f3c268cea5f02c6797d2fb1f716ec49f
#備份鏡像
user@u25:~# docker save kermit_nginx_php > kermit_nginx_php_save.tar
user@u25:~# ll -h | grep kermit
-rw-r--r-- 1 root root 916M Nov 8 12:37 kermit_nginx_php_save.tar
-rw-r--r-- 1 root root 123M Nov 8 11:49 nginx_kermit.tar
-rw-r--r-- 1 root root 794M Nov 8 11:50 php_kermit.tar
#通過scp命令傳輸?shù)搅硪慌_(tái)服務(wù)器:
kermit@n28:~$ scp kermit_nginx_php_save.tar root@111.14.36.97:/root/
kermit_nginx_php_save.tar 100% 916MB 181.8MB/s 00:05
#在另一臺(tái)服務(wù)器上安裝docker,并導(dǎo)入鏡像
kermit@u27:~# docker load <kermit_nginx_php_save.tar
6cba44dfc730: Loading layer [==================================================>] 960MB/960MB
Loaded image: kermit_nginx_php:demo
#這里顯示的就是一個(gè)鏡像,看來一次只能打包一個(gè)容器成鏡像
kermit@u27:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kermit_nginx_php demo 9fe17159411e About an hour ago 125MB
????從上面顯示來看,最后顯示的是一個(gè)鏡像,說明在原docker服務(wù)上面打包時(shí)一次只能打包一個(gè)容器成鏡像,不能支持多個(gè)容器一起打包成一個(gè)。
? ? 我在使用上面的方式load鏡像之后啟動(dòng)時(shí)報(bào)錯(cuò):Unable to find image 鏡像名稱:latest locally docker: Error response from daemon: pull access denied for 鏡像名稱, repository does not exist or may require docker login.不知道是為什么。
? ? 有可能有是我使用的兩個(gè)容器進(jìn)行的打包,后來我使用了以下的做法重新做了一套成功了。兩種方式暫時(shí)先都放這里吧,回頭再看。成功的方式使用如下:
#另一種方式:
user@u25:/data01/nginx# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4da5b8faf1a0 nginx "nginx -g 'daemon of…" 47 hours ago Up 20 hours 0.0.0.0:80->80/tcp nginx
2af5436df1e2 deluxo/php7.1-fpm "docker-php-entrypoi…" 2 days ago Up 19 hours 0.0.0.0:9000->9000/tcp php
#1. 把當(dāng)前的容器提交為一個(gè)鏡像
user@u25:/data01/nginx# docker commit nginx kermit_nginx
sha256:098b1d0148802062ac09affee44a671ff7eaf1ea88f8ef0251b9542e21e2f979
#2.將鏡像存為tar文件
user@u25:/data01/nginx# docker save kermit_nginx > kermit_nginx2.tar
user@u25:/data01/nginx#
#3.將鏡像文件通過scp傳輸?shù)侥繕?biāo)服務(wù)器
kermit@u18:~$ scp ./kermit_nginx2.tar root@111.14.36.97:/root/kermit_nginx2.tar
kermit_nginx2.tar
#4.在另一臺(tái)服務(wù)器上加載鏡像
kermit@u27:~# docker load -i kermit_nginx2.tar
b67d19e65ef6: Loading layer [==================================================>] 72.5MB/72.5MB
6eaad811af02: Loading layer [==================================================>] 57.54MB/57.54MB
a89b8f05da3a: Loading layer [==================================================>] 3.584kB/3.584kB
c8f904504379: Loading layer [==================================================>] 10.75kB/10.75kB
Loaded image: kermit_nginx:latest
#5.在此鏡像上去啟動(dòng)程序,執(zhí)行成功
????除此之外,有必要了解一下:docker save和docker export兩個(gè)方法的區(qū)別:
對(duì)于Docker Save方法,會(huì)保存該鏡像的所有歷史記錄,Docker Export不會(huì)保留歷史記錄,沒有commit歷史。
docker save保存的是鏡像(image),docker export保存的是容器(container);
docker load用來載入鏡像包,docker import用來載入容器包,兩者都會(huì)恢復(fù)為鏡像;
docker load不能對(duì)載入的鏡像重命名,而docker import可以為鏡像指定新名稱。
? ? 從這里可以對(duì)上面的兩個(gè)方法進(jìn)行對(duì)比。第一個(gè)方法先進(jìn)行export,再進(jìn)行import 然后進(jìn)行save,而第二個(gè)方法是commit之后直接save。從上面對(duì)兩方法的了解可以看到docker save和docker load是對(duì)應(yīng)的,第一個(gè)方法里的export和import感覺沒有必要,因此第二個(gè)方法看起來更合理。
二、Docker在容器未啟動(dòng)的情況下如何修改容器中的文件?
????docker容器在啟動(dòng)后進(jìn)入容器中修改了部分文件,之后重啟容器失敗,此時(shí)有點(diǎn)束手無策,因?yàn)椴粏?dòng)容器就不能exec進(jìn)入容器修改文件,但不修改正確文件又不能啟動(dòng)容器,陷入了死循環(huán)。好像沒有辦法。
????但docker不會(huì)這么笨的,另外雖然docker容器沒有啟動(dòng),但docker整個(gè)都安裝在本地磁盤上,它肯定能支持在磁盤上找到其對(duì)應(yīng)位置直接修改文件。不錯(cuò),docker就是可以直接在系統(tǒng)上修改其文件內(nèi)容。雖然docker容器無法啟動(dòng),但是docker inspect命令依然可以使用,我們利用這個(gè)命令找到它的一些執(zhí)行信息,其中就有GraphDriver的相關(guān)信息:
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/over..."
"MergedDir": "/var/lib/docker/overlay2/df23df45.../merged"
"UpperDir": "/var/lib/docker/overlay2/df23df45.../diff"
"WorkDir": "/var/lib/docker/overlay2/df23df45.../work"
},
"Name": "overlay2"
????Docker的graph driver主要用于管理和維護(hù)鏡像,包括把鏡像從倉庫下載下來,到運(yùn)行時(shí)把鏡像掛載起來可以被容器訪問等,都是graph driver做的。涉及的docker命令有Docker pull/push/export/import/load/save/build。graph driver的功能基本上是對(duì)docker的image定義的實(shí)現(xiàn),而OCI的image-spec是基于docker的image spec的,所以理論dockergraph driver做的事情,都應(yīng)該被image-spec的實(shí)現(xiàn)所覆蓋。目前docker支持的graph driver有:Overlay/Aufs/Devicemapper/Btrfs/Zfs/Vfs,這些driver各有優(yōu)劣。從上面的GraphDriver信息中可以看到當(dāng)前的docker是用Overlay2作為graph driver的。
????對(duì)于Overlay driver,其它的這里就不多涉及了,可以了解一下它的關(guān)鍵目錄:/var/lib/docker/overlay,即上面的GraphDriver信息中的MergedDir、UpperDir、WorkDir。這個(gè)目錄中存放的是鏡像的每一層layer解壓后的結(jié)果,以及基于每一個(gè)鏡像生成容器后,對(duì)鏡像合并掛載后的目錄和對(duì)應(yīng)的init目錄。這里的id就是cache-id和mount-id。我們啟動(dòng)鏡像時(shí)掛載的目錄以及鏡像中的文件都可以在這里找到。里面又分幾個(gè)子目錄,正是和GraphDriver信息中的MergedDir、UpperDir、WorkDir一一對(duì)應(yīng)。
/var/lib/docker/overlay/<id>/merged:這是所有鏡像層合并后的結(jié)果,就是容器中進(jìn)程看到的結(jié)果
/var/lib/docker/overlay/<id>/upper:這是上面的只讀層,用戶掛載的upper層目錄
/var/lib/docker/overlay/<id>/work:文件系統(tǒng)的工作基礎(chǔ)目錄。文章來源:http://www.zghlxwxcb.cn/news/detail-854019.html
????對(duì)于overlay2,其UpperDir就是我們掛載的程序目錄所在的位置,因此容器掛了無法啟動(dòng),此時(shí)我們可以進(jìn)入inspect命令結(jié)果中的UpperDir目錄 :/var/lib/docker/overlay2/df23df45.../diff 里找到程序進(jìn)行修改。文章來源地址http://www.zghlxwxcb.cn/news/detail-854019.html
到了這里,關(guān)于Docker打包容器并跨服務(wù)器傳輸重建加載load鏡像Unable to find image :latest問題解決 及 Docker在容器未啟動(dòng)的情況下如何修改容器中文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!