如何在Docker容器和主機之間共享數(shù)據(jù)?
譯文【51CTO.com快譯】有了Docker容器,貴公司可以大規(guī)模、迅速地提供應(yīng)用程序和服務(wù)。又由于部署容器化應(yīng)用程序如此簡單,你可以很快上手。
你在接觸Docker后可能很快發(fā)現(xiàn)一點,一旦部署完畢,容器在如何保存和包含數(shù)據(jù)方面很有限,而這種限制在于容器文件系統(tǒng)中。Docker容器使用聯(lián)合文件系統(tǒng)(UFS),UFS接觸的是一系列只讀層,這些層包括最上面的最終讀寫層。容器不需要保存數(shù)據(jù)時,該系統(tǒng)才***地運行。但如果你要部署需要能夠保存數(shù)據(jù)的服務(wù)(比如面對數(shù)據(jù)庫的應(yīng)用程序),該如何是好?
歡迎使用卷
Docker卷是駐留在主機文件系統(tǒng)上的目錄(或文件集合),它不是容器的UFS的一部分。正是在這些卷中,容器才能夠保存數(shù)據(jù)。使用docker volume命令,可以輕松管理卷以擴展容器,讓它遠(yuǎn)遠(yuǎn)超出其基本功能。
不妨了解如何部署一個新容器,該容器包含一個連接到主機上特定目錄的卷,以便容器與卷中的數(shù)據(jù)保持同步。我會在Ubuntu Server 18.04上進(jìn)行演示,但只要平臺支持Docker,整個過程一樣(無論是哪個發(fā)行版)。假設(shè)你已啟動并運行Docker,并可以部署容器。
創(chuàng)建主機數(shù)據(jù)卷
***步是創(chuàng)建一個新目錄來放置卷。為此,打開終端窗口并執(zhí)行命令:
- mkdir ~/container-data
你要確保剛創(chuàng)建的目錄位于Docker用戶可以訪問的位置(擁有讀寫權(quán)限)。
一旦創(chuàng)建了該目錄,就可以在里面安裝卷了。假設(shè)你要部署一個基于官方Ubuntu映像的容器,該容器含有一個名為/data的目錄。想部署將內(nèi)部的/data目錄連接到主機目錄〜/ container-data中卷的這樣一個容器,你要執(zhí)行命令:
- docker run -dit -P --name ubuntu-test -v ~/container-data:/data ubuntu
上述命令分解如下:
- docker run是主命令,表示我們將在新容器中運行命令。
- -dit中d表示分離模式,it確保可以將bash或sh分配給偽終端。
- -P向主機發(fā)布容器端口。
- -name表示其后是新容器的名稱。
- -v表示其后是卷。
- ubuntu是用于容器的映像。
命令完成后,你將獲得容器ID(圖A)。確保記住該ID的前四個字符,你需要它才能訪問容器bash提示符。
圖A. 我們已部署的容器
現(xiàn)在你已部署了一個基于官方Ubuntu映像的容器,該容器含有/ data目錄,該目錄掛載到~/container-data中的主機卷上。
測試卷
不妨測試一下這個卷。如果你忘了容器的ID,執(zhí)行命令docker ps -a以查看(圖B)。
圖B:我們剛部署的容器列表
使用以下命令訪問剛部署的容器:
- docker attach ID
其中ID是已部署容器的前四個字符。你現(xiàn)在應(yīng)該發(fā)現(xiàn)已在容器中的bash提示符下(圖C)。
圖C:新容器的bash提示符
執(zhí)行命令ls /,你會看到/data目錄已添加到Ubuntu容器。不妨用這個命令在該目錄中創(chuàng)建一個測試文件:
- touch /data/test
創(chuàng)建該測試文件后,在主機上打開另一個終端窗口,執(zhí)行命令ls ~/container-data。應(yīng)該會在該目錄中看到測試文件(圖D)。
圖D:我們在容器內(nèi)創(chuàng)建的測試文件可在主機上的卷中看到
你剛通過主機上的卷部署了含有持久存儲的容器。
數(shù)據(jù)庫卷
假設(shè)你想為數(shù)據(jù)庫創(chuàng)建卷。為此先部署MySQL數(shù)據(jù)庫Docker容器,指令它使用名為mysql-data的持久存儲卷作。使用這個命令來執(zhí)行此操作:
- docker run --name mysql-test -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passwd -d mysql:latest
在上述命令中,-e參數(shù)選項符告知Docker其后是環(huán)境變量。
使用這個命令訪問容器的bash提示符:
- docker exec -it ID /bin/bash
其中ID是剛部署容器的ID的前四個字符。
使用這個命令列出容器的/var/lib/mysql目錄的內(nèi)容:
- ls /var/lib/mysql
記下這些內(nèi)容,使用這個命令退出容器:
- exit
現(xiàn)在,使用這個命令檢查主機已掛載卷的內(nèi)容:
- sudo ls /var/lib/docker/volumes/mysql-data/_data
你應(yīng)該看到兩個目錄中列出來的內(nèi)容一樣(圖E)。
圖E:我們的MySQL數(shù)據(jù)與主機卷同步
現(xiàn)在你擁有基于MySQL的容器,它包含掛載在主機上卷中的持久存儲。
這就是Docker容器和主機之間共享數(shù)據(jù)的整個方法。有了卷,這項任務(wù)不僅很簡單,還異常靈活。
原文標(biāo)題:Docker Basics: How to Share Data Between a Docker Container and Host,作者:Jack Wallen
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】