【編者的話】在容器之間拷貝數據是Docker一個重要而且基本的功能。拷貝數據到其他容器是一個經常使用到的場景,如當服務器遇到不可預見的“災難”(注:斷電,宕機)時,起到備份數據的作用。本文作者詳細介紹了操作步驟。
如何在Docker容器之間拷貝數據
Docker容器可以類比成一個目錄,它可以將一個應用程序運行時所依賴的所有環境(注:此應用依賴的其他的服務或程序等)打包在一起運行;同時可以隨意的對它進行“啟動”、“停止”、“移動”或者“刪除”等操作。Docker容器在Linux的命名空間(Namespace)機制下被激活,這樣就可以使得運行在同一服務器上的不同Docker容器能在網絡(Networking)與存儲(storage)層面上被“隔離”(isolation)的運行。每個Docker容器都是在一個Docker鏡像(image)的基礎上創建而來;而一個Docker鏡像可以支持創建、運行多個Docker容器,這主要取決於服務器的硬件性能。所以,Docker容器是Docker運行時的表現形式。
什么是Docker鏡像?
Docker容器是基於一個Docker鏡像創建的,而Docker鏡像本身則可以通過Docker命令行工具或者Dockerfiles來生成。Docker鏡像既可以包含操作系統基礎設施(fundamentals)也可以包含一個預先搭建好的可以直接啟動的應用程序棧。Docker鏡像可以被看做是一個只讀的模板,這個模板中包含了很多“層”;而任何基於這個Docker鏡像的新增操作或者更新操作都會導致一個基於當前層的新的層被創建出來,這個新創建的層是直接疊加在當前層之上的而非覆蓋整個Docker鏡像(注:創建新層的過程就是創建新容器的過程)。這就是一個新的Docker容器是怎么被創建出來的。
從一個容器拷貝數據到另一個容器:
在容器之間拷貝數據是Docker一個重要而且基本的功能。拷貝數據到其他容器的功能是一個真實的用戶場景,如當服務器遇到不可預見的“災難”(注:斷電,宕機)時,起到備份數據的作用。
使用容器的數據卷:
數據卷(data volume,注:位置在/var/lib/docker/volumes)是容器可以訪問,但是位置不在root文件系統中的一個目錄。為了能讓容器之間可以共享數據,Docker讓“卷”(volume)可以繞過Docker鏡像的層疊機制。容器中所有對鏡像的改變全部都直接存儲。每個容器都有固定的運行目錄在/var/lib/docker目錄下;而每個容器卷的數據則默認單獨存儲在/var/lib/docker/volumes/目錄底下。docker run
命令的-v
選項能夠實現容器間數據卷中數據的互相拷貝。
如何在容器之間拷貝數據的一個例子
在這個例子中,我們假設基於鏡像mymod/dvc:v1創建並運行了兩個容器:dvc1與dvc2,以下是啟動這兩個鏡像的命令:
docker run –d –name dvc1 mymod/dvc:v1
docker run –d –name dvc2 mymod/dvc:v1
以下命令將創建並啟動一個新的容器(也是基於mymod/dvc: v1鏡像)但是掛載dvc1的數據卷,並使用cp命令拷貝容器dvc1中的數據到宿主機(host)上。[root@host ~]# docker run –rm –v /var/tmp:/host:rw \ –volumes- from dvc1 cp –r/var/www/html/host/dvc1_files
[注:經過測試以上命令應該改為以下形式才能運行][root@host ~]# docker run –rm –v /var/tmp:/host:rw –volumes-from dvc1 mymod/dvc: v1 cp –r /var/www/html/host/dvc1_files
新建的容器以讀-寫權限掛載宿主機的/var/temp目錄為/host目錄,然后掛載所有dvc1的數據卷,包含dvc1中的/var/www/html目錄,然后拷貝/var/www/html的文件目錄到/host/dvc1_files下,対映宿主機/var/temp目錄。
現在我們用以下命令拷貝dvc1容器的數據到其他的容器中:[root@host ~]# docker run –rm –v /var/tmp:/host:ro –volumes-from dvc2 \ cp –a –T /host/dvc1_files /var/www/html
新建的容器將宿主機的/var/tmp目錄以只讀的形式映射到dvc2容器的/host目錄中,同時加載dvc2容器的所有數據卷,然后將/host/dvc1_files(對應宿主機/var/tmp/dvc1_files)目錄的結構拷貝到dvc2容器的/var/www/html目錄下。
同樣的目標可以在Dockerfile中使用ADD命令實現。ADD有兩個參數一個是源容器一個是目的容器。ADD命令可以實現從源容器拷貝文件或者數據到目的容器的目標,而不用管各個容器的文件系統差異。
結論:-
Docker肯定會提供更好的方式來“培養”容器化服務部署,以支持更廣泛的部署平台;同時開發社區也期望Docker構建服務層級(service layer)。而Docker的做法是:開發容器核心容量,開發跨容器服務管理與通信功能。我們在這篇文章中所闡述的是數據可以在容器間被復制與冗余,這可以用來應付各種數據的損毀與恢復。Docker還提供了使用方便的容器間差異分析功能,這可以讓容器更好的支持排錯(debugging)、快速共享部署環境以達到快速的部署的目標。Docker可以將容器部署環境從開發或者QA階段直接提交到AWS部署環境。用戶可以通過Docker的數據卷在容器間共享數據;可以將宿主機的目錄直接掛載到容器中或者甚至可以從容器中導出數據存檔,所以,Docker非常方便。