天天看點

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

原文标題:Docker Basics: How to Share Data Between a Docker Container and Host,

作者:Jack Wallen

有了Docker容器,貴公司可以大規模、迅速地提供應用程式和服務。又由于部署容器化應用程式如此簡單,你可以很快上手。

你在接觸Docker後可能很快發現一點,一旦部署完畢,容器在如何儲存和包含資料方面很有限,而這種限制在于容器檔案系統中。Docker容器使用聯合檔案系統(UFS),UFS接觸的是一系列隻讀層,這些層包括最上面的最終讀寫層。容器不需要儲存資料時,該系統才完美地運作。但如果你要部署需要能夠儲存資料的服務(比如面對資料庫的應用程式),該如何是好?

歡迎使用卷

Docker卷是駐留在主機檔案系統上的目錄(或檔案集合),它不是容器的UFS的一部分。正是在這些卷中,容器才能夠儲存資料。使用docker volume指令,可以輕松管理卷以擴充容器,讓它遠遠超出其基本功能。

不妨了解如何部署一個新容器,該容器包含一個連接配接到主機上特定目錄的卷,以便容器與卷中的資料保持同步。我會在Ubuntu Server 18.04上進行示範,但隻要平台支援Docker,整個過程一樣(無論是哪個發行版)。假設你已啟動并運作Docker,并可以部署容器。

建立主機資料卷

第一步是建立一個新目錄來放置卷。為此,打開終端視窗并執行指令:

mkdir ~/container-data 

你要確定剛建立的目錄位于Docker使用者可以通路的位置(擁有讀寫權限)。

一旦建立了該目錄,就可以在裡面安裝卷了。假設你要部署一個基于官方Ubuntu映像的容器,該容器含有一個名為/data的目錄。想部署将内部的/data目錄連接配接到主機目錄〜/ container-data中卷的這樣一個容器,你要執行指令:

docker run -dit -P --name ubuntu-test -v ~/container-data:/data ubuntu 

上述指令分解如下:

  • docker run是主指令,表示我們将在新容器中運作指令。
  • -dit中d表示分離模式,it確定可以将bash或sh配置設定給僞終端。
  • -P向主機釋出容器端口。
  • -name表示其後是新容器的名稱。
  • -v表示其後是卷。
  • ubuntu是用于容器的映像。

指令完成後,你将獲得容器ID(圖A)。確定記住該ID的前四個字元,你需要它才能通路容器bash提示符。

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

圖A. 我們已部署的容器

現在你已部署了一個基于官方Ubuntu映像的容器,該容器含有/ data目錄,該目錄挂載到~/container-data中的主機卷上。

測試卷

不妨測試一下這個卷。如果你忘了容器的ID,執行指令docker ps -a以檢視(圖B)。

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

圖B:我們剛部署的容器清單

使用以下指令通路剛部署的容器:

docker attach ID 

其中ID是已部署容器的前四個字元。你現在應該發現已在容器中的bash提示符下(圖C)。

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

圖C:新容器的bash提示符

執行指令ls /,你會看到/data目錄已添加到Ubuntu容器。不妨用這個指令在該目錄中建立一個測試檔案:

touch /data/test 

建立該測試檔案後,在主機上打開另一個終端視窗,執行指令ls ~/container-data。應該會在該目錄中看到測試檔案(圖D)。

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

圖D:我們在容器内建立的測試檔案可在主機上的卷中看到

你剛通過主機上的卷部署了含有持久存儲的容器。

資料庫卷

假設你想為資料庫建立卷。為此先部署MySQL資料庫Docker容器,指令它使用名為mysql-data的持久存儲卷作。使用這個指令來執行此操作:

docker run --name mysql-test -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=passwd -d mysql:latest 

在上述指令中,-e參數選項符告知Docker其後是環境變量。

使用這個指令通路容器的bash提示符:

docker exec -it ID /bin/bash 

其中ID是剛部署容器的ID的前四個字元。

使用這個指令列出容器的/var/lib/mysql目錄的内容:

ls /var/lib/mysql 

記下這些内容,使用這個指令退出容器:

exit 

現在,使用這個指令檢查主機已挂載卷的内容:

sudo ls /var/lib/docker/volumes/mysql-data/_data 

你應該看到兩個目錄中列出來的内容一樣(圖E)。

docker 容器之間通信_如何在Docker容器和主機之間共享資料?

圖E:我們的MySQL資料與主機卷同步

現在你擁有基于MySQL的容器,它包含挂載在主機上卷中的持久存儲。

這就是Docker容器和主機之間共享資料的整個方法。有了卷,這項任務不僅很簡單,還異常靈活。

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】