容器與鏡像遷移
注:
用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用 docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標籤等元數據信息。
export與import命令:
注意:
1.會丟棄歷史記錄和元數據。
2.啓動export與import命令導出導入的鏡像必須加/bin/bash或者其他/bin/sh,否則會報錯。
docker: Error response from daemon: No command specified.
export:
導出容器會丟失歷史記錄和元數據,類似與快照。
命令格式:
docker export [容器ID|Name] > xxx.tar
或
docker export -o xxx.tar [容器ID|Name]
應用場景:
主要用來製作基礎鏡像,比如從一個ubuntu鏡像啓動一個容器,然後安裝一些軟件和進行一些設置後,使用docker export保存爲一個基礎鏡像。然後,把這個鏡像分發給其他人使用,比如作爲基礎的開發環境。
import:
導入容器快照到本地鏡像庫。
命令格式:
docker import xxx.tar newname:tag
如:
docker import redis.tar myredis:v1
1.創建容器web並新增數據
[root@localhost ~]# docker run -itd --name web nginx
9a17f7c9f00a3711018581a1523ecd7a06c40d1408ae5678e034be1a1e4e0cd8
[root@localhost ~]# docker exec -it web touch /mnt/test.txt
[root@localhost ~]# docker exec -it web ls /mnt/
test.txt
2.導出容器快照
[root@localhost ~]# docker export web > web.tar
[root@localhost ~]# ll -h web.tar
-rw-r--r-- 1 root root 123M 5月 13 04:34 web.tar
3.導入容器快照到本機鏡像庫
[root@localhost ~]# docker import web.tar web:v1
sha256:134f9251e15e56060d564c23cec4be0048434fb90b19188ea64bf77af77b85ff
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
web v1 134f9251e15e 10 minutes ago 125MB
4.啓動使用import導入鏡像庫的web:v1鏡像,並查看數據
注意:
啓動export與import命令導出導入的鏡像必須加/bin/bash或者其他/bin/sh,否則會報錯。
docker: Error response from daemon: No command specified.
[root@localhost ~]# docker run -itd --name web2 web:v1 /bin/bash
ef07135bcda92c8660392ce29e24c7c8de82f3369fb024ae772c34cd74b9258d
[root@localhost ~]# docker exec -it web2 ls /mnt/
test.txt
總結:
通過export命令也可以將容器裏的數據保存,並可以遷移到別的docker主機。
commit命令:
將已存在容器中的鏡像和修改內容提交爲一個新的鏡像,通過這個方式同樣能保存讀寫層內容。
命令格式:
docker commit [容器名稱|ID] 生成新的鏡像名字
選項說明:
-a:提交的鏡像作者
-c:使用dockerfile指令來創建鏡像
-m:提交時的說明文字
-p:在commit的時候,將正在運行的容器暫停
應用場景:
主要作用是將配置好的一些容器生成新的鏡像,可以得到複用(再次使用不需要再配置)。
1.啓動一個nginx容器,並且在容器的/mnt目錄下創建一個文件
[root@localhost ~]# docker run -itd --name nginxweb -p 80:80 nginx
fda3ca1b33ba4c9dc6a1ca27c7242bbbdc2a08f4e6e7642d3ec5de62e1e8f78c
[root@localhost ~]# docker exec -it nginxweb touch /mnt/test.txt
[root@localhost ~]# docker exec -it nginxweb ls /mnt/
test.txt
2.將nginxweb容器commit成一個新的鏡像
[root@localhost ~]# docker commit nginxweb nginx_test:v1
sha256:a06b16b343036bcbf424c499022ca635bf90740aa7d76acbe0c271a731aba2ef
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx_test v1 a06b16b34303 4 seconds ago 127MB
3.使用nginxweb生成的新鏡像nginx_test啓動一個nginx_v1容器,並查看新容器中的數據
[root@localhost ~]# docker stop nginxweb //爲了方便先停止nginxweb容器,因爲80端口已被佔用
nginxweb
[root@localhost ~]# docker run -itd --name nginx_v1 -p 80:80 nginx_test:v1
df074341d7a39b072966672ef9bb8769142b67395488e30e81711d0c75f2a821
[root@localhost ~]# docker exec -it nginx_v1 ls /mnt/
test.txt ---》可以看到新容器nginx_v1中有之前nginxweb的數據
注意:
commit 命令雖然能實現保存讀寫層數據,但不適於做數據持久化。
save與load命令:
注意:
1.不會丟棄歷史記錄和元數據,並可以回滾版本。
2.啓動不用加/bin/bash。
save:
將指定鏡像保存成tar文件。
命令格式:
docker save 鏡像名 > xxx.tar
或
docker save -o xxx.tar 鏡像名
應用場景:
如果你的應用是使用docker-compose.yml編排的多個鏡像組合,但你要部署的客戶服務器並不能連外網。這時,你可以使用docker save將用到的鏡像打個包,然後拷貝到客戶服務器上使用docker load載入(一般用於鏡像遷移到別處)。
load:
導入使用docker save命令導出的鏡像。在這裏插入代碼片
命令格式:
docker load -i xxx.tar
或
docker load < xxx.tar
容器備份遷移案例:
運行一段時間後的容器,其中包含了新的數據,如果想把這些內容數據一併遷移到新的主機上,可以按照以下步驟進行:
1.提交容器生成新的鏡像
[root@localhost ~]# docker ps //查看正在運行的容器web
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a17f7c9f00a nginx "nginx -g 'daemon of…" 19 hours ago Up 19 hours 80/tcp web
[root@localhost ~]# docker commit -p web webdata:v1 //-p暫停web容器並提交爲新鏡像webdata:v1
sha256:b25ea02c5f1f4efe4c35d6503a277d968d5dfdf0cfd69092b3e99202dd687723
[root@localhost ~]# docker images //查看提交的新鏡像webdata
REPOSITORY TAG IMAGE ID CREATED SIZE
webdata v1 b25ea02c5f1f 3 seconds ago 127MB
2.將鏡像保存成一個tar壓縮包
[root@localhost ~]# docker save webdata:v1 > webdata.tar
[root@localhost ~]# ll -h webdata.tar
-rw-r--r-- 1 root root 125M 5月 13 23:47 webdata.tar
3.將tar壓縮包複製到另一臺主機
[root@localhost ~]# scp webdata.tar [email protected]:/root/test
4.在另一臺主機上加載鏡像的tar壓縮包
[root@localhost ~]# cd test/
[root@localhost test]# ll
總用量 127572
-rw-r--r-- 1 root root 130631168 5月 13 23:49 webdata.tar
[root@localhost test]# docker load -i webdata.tar
d9d778e6751c: Loading layer [==================================================>] 10.24kB/10.24kB
Loaded image: webdata:v1
[root@localhost test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
webdata v1 b25ea02c5f1f 12 minutes ago 127MB
5.使用這個加載的鏡像運行容器
[root@localhost test]# docker run -itd --name web webdata:v1
51d9ed10961b9620ea6456f5bd75dbd43168b73c7bd184dcccdd25fcf956d9e5
[root@localhost test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51d9ed10961b webdata:v1 "nginx -g 'daemon of…" 35 seconds ago Up 33 seconds 80/tcp web
[root@localhost test]# docker exec -it web ls /mnt/
test.txt
注意:
如果有docker鏡像倉庫的權限,也可以直接將第1步生成的鏡像push到docker倉庫,然後在另一臺主機上pull鏡像並運行爲容器即可。
docker save和docker export的區別
docker save
保存的是鏡像(image),docker export保存的是容器(container);
docker load
用來載入鏡像包,docker import用來載入容器包,但兩者都會恢復爲鏡像;
docker load
不能對載入的鏡像重命名,而docker import可以爲鏡像指定新名稱。
docker export
的包會比save的包要小,原因是save的是一個分層的文件系統,export導出的只是一個linux系統的文件目錄。