Docker數據持久化與容器遷移

上節講到當容器運行期間產生的數據是不會在寫鏡像裏面的,從新用此鏡像啓動新的容器就會初始化鏡像,會加一個全新的讀寫入層來保存數據。若是想作到數據持久化,Docker提供數據卷(Data volume)或者數據容器捲來解決問題,另外還能夠經過commit提交一個新的鏡像來保存產生的數據。那麼,來一一看下各自的使用方法。web

1、數據卷docker

數據卷特性:ubuntu

  • 能夠繞過UFS文件系統,爲一個或多個容器提供訪問。bash

  • 徹底獨立於容器的生存週期,所以不會在刪除容器時刪除其掛在的數據卷。性能

數據卷特色:測試

  • 數據卷在容器啓動初始化時,若是容器使用的鏡像在掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中。blog

  • 數據卷能夠在容器直接共享和重用。ci

  • 能夠直接對數據卷裏的內容進行修改。get

  • 數據卷的變化不會影響鏡像的更新。博客

  • 卷會一直存在,即便掛載數據卷的容器已經刪除。

1.數據卷使用

建立並掛載數據卷:

$ sudo docker run -itd --name ubuntu_test1 -v /container_data:/data ubuntu

注:container_data爲宿主機目錄,/data是容器中目錄,目錄不存在會自動建立

$ sudo docker inspect ubuntu_test1

"Mounts": [

{

"Source": "/container_data",

"Destination": "/data",

"Mode": "",

"RW": true

}

],

能夠看到已經掛載成功,而且容器對這個目錄具備讀寫權限。

測試:

$ cd container_data  

$ sudo touch test.txt

$  sudo docker exec ubuntu_test1 ls /data

test.txt

在宿主機目錄建立的文件,一樣在容器內看到。

2.刪除容器,數據會一同刪除嗎?

$ sudo docker stop ubuntu_test1

$ sudo docker rm ubuntu_test1 

$ ls container_data

test.txt

看到宿主機上數據卷目錄裏的文件並無發生變化,說明刪除容器不會影響數據卷。

3.從新啓動一個容器,一樣掛載這個數據卷試試

$ sudo docker run -itd --name ubuntu_test2 -v /container_data:/data ubuntu   

$  sudo docker exec ubuntu_test1 ls /data

test.txt

文件依然存在,說明初始化時將數據拷貝到了容器中。

3.再啓動一個容器,還將數據卷掛載到這裏

$ sudo docker run -itd --name ubuntu_test3 -v /container_data:/data ubuntu 

$  sudo docker exec ubuntu_test1 ls /data

test.txt

一樣能夠看到數據,說明數據卷能夠共享多個容器使用。

2、 容器 數據卷

將一個正常的容器做爲數據卷,讓其餘容器經過掛載這個容器實現數據共享。

注意:數據卷容器會下降I/O性能。

1.容器數據卷使用

建立一個dvdata的數據卷容器:

$ sudo docker run -itd -v /data --name dvdata ubuntu 

注:/data是數據卷容器內共享的目錄

在其餘容器中掛載dvdata容器的數據卷:

$ sudo docker run -itd --name web1 --volumes-from dbdata ubuntu

$  sudo docker run -itd --name web2 --volumes-from dbdata ubuntu

分別進入web一、web2容器中,會有一個/data目錄,在web1裏的/data目錄建立文件,web2也能看的到。

總結: 若是刪除dvdata、web一、web2,時,數據卷並不會被自動刪除。若是想刪除需在刪除最後一個掛載着它的容器時使用docker rm -v 命令來指定刪除關聯的容器。

博客地址: http://lizhenliang.blog.51cto.com

3、commit命令使用

commit命令做用是將已存在容器中的鏡像和修改內容提交爲一個新的鏡像,經過這個方式一樣能保存讀寫層內容。

1.啓動一個新容器,並在容器/opt目錄下建立test.txt文件

$ sudo docker run -itd --name web ubuntu

$ sudo docker exec web touch /opt/test.txt

$ sudo docker exec web ls /opt

test.txt

2.提交一個新的鏡像

$ sudo docker commit web web:v2

$ sudo docker images

3.成功提交一個新的鏡像,用這個新的鏡像啓動一個容器,看是否建立的文件存在

$ sudo docker run -itd --name web_v2 web:v2 

$ sudo docker exec web_v2 ls /opt 

test.txt

總結: commit命令一樣能實現保存讀寫層數據,但不適於作數據持久化

4、數據卷容器備份和還原

備份:

$ sudo docker run --volumes-from dvdata -v /container_backup:/backup ubuntu tar cvf /backup/backup.tar /data

說明:先建立一個臨時容器,並掛載dvdata容器數據卷,再掛載數據卷/container_backup目錄到容器/bakcup,在容器中執行備份/data目錄到/backup,也就是備份到宿主機/container_backup目錄。

恢復:

#先建立一個數據卷容器

$ sudo docker run -v /data --name dvdata2 ubuntu                      

注意:這個數據卷目錄名要與備份的同樣

#再將備份文件恢復到這個數據卷容器

$ sudo docker run --volumes-from dvdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar

#最後啓動一個容器掛載驗證/data目錄數據恢復成功

$ sudo docker run -itd --volumes-from dvdata2 --name web_recover ubuntu

5、遷移容器和鏡像

export與import命令使用:

#export導出容器會丟失歷史記錄和元數據,相似與快照 

先建立測試容器:

$ sudo docker exec web touch /opt/test.txt

$ sudo docker exec web ls /opt

test.txt

執行導出:

$ sudo docker export web > web.tar

執行導入:

$ cat web.tar | sudo docker import - web:v2

$ sudo docker images

$ sudo docker run -itd --name web_v2 web:v2 /bin/bash

#啓動這個鏡像要加/bin/bash,不然報錯Error response from daemon: No command specified

$ sudo docker exec web_v2 ls /opt

test.txt

總結: 經過export命令也能夠將容器裏的數據保存,並能夠遷移到別的docker主機 

save與load命令使用:

#通常用於遷移鏡像到別處

導出:

$ sudo docker save web > web.tar

導入:

$ sudo docker load < ubuntu.tar

注:不會丟棄歷史記錄和元數據,並能夠回滾版本。啓動不用加/bin/bash

來自: http://lizhenliang.blog.51cto.com/7876557/1730892

相關文章
相關標籤/搜索