本文將說明如何透過Docker Volume持久儲存容器資料,並以Docker Network解釋容器網路運作。透過實驗示範,採用內建的DNS伺服器便能解析容器IP位址,整個容器架構只需命名好容器,就可移植到其他Docker伺服器,並結合Docker Volume將WordPress資料庫持久儲存。
上一篇文章介紹了Docker容器技術生態系的相關工具,以及Docker生命週期相關指令,並且點出企業導入容器技術的應用情境,結合自動化生產線,讓部分重複性開發工作以持續整合(Continuous Integration,CI)和持續交付(Continuous Delivery,CD),建置部署容器映像檔。
這次將介紹Docker Volume對容器資料做持久儲存,以及Docker Network解釋容器網路運作。
Docker Volume儲存容器資料
由於容器與虛擬機一樣,刪除容器(使用docker rm CONTAINER_ID指令)之後,所有容器內相關資料皆會一併刪除,因為容器是沙箱式隔離,透過Linux Control Group機制,將作業系統上資源(如CPU、記憶體、磁碟等)分離並可加以限制,如同虛擬化技術針對每一台虛擬機皆可獨立配置系統資源。
之前介紹過「docker run」執行容器指令,其詳細說明可參閱官方文件(https://docs.docker.com/engine/reference/run/),其中「-v」就是掛載Volume到容器中,將本地端目錄連通到容器內,與之前一樣,使用Ubuntu映像檔作為範例,步驟如下:
首先執行「docker run -ti --name u1 -v $(pwd)/backup:/data ubuntu」,「pwd」是Linux當下目錄的指令,亦可用絕對路徑,例如「/home/philipz/backup」,冒號的前面是本地端目錄,後面是容器內目錄(只能用絕對路徑)。
在容器內輸入「ls -l /」,可以看到data目錄,再執行「cd /data」切換到data目錄下。在此目錄內新增檔案,輸入「echo "test!" > test.txt」,請確認新增了test.txt檔案。
輸入「exit」,離開容器,而本機端當下目錄會有backup目錄,執行「cd backup」切換到backup目錄,會看到test.txt檔案,執行「cat test.txt」印出檔案內容,就會出現「test!」。即便執行「docker rm u1」刪除容器,資料仍會存在。
上面是直接使用docker run儲存資料的方式,而docker volume除了提供相同功能外,還可透過安裝Plugin,將資料儲存到NFS、Ceph或VMware vSphere的虛擬硬碟上。
表1 docker volume指令使用說明
關於docker volume指令清單,請見表1,而Volume使用方式如下:
首先輸入「docker volume create backup」建立名為backup的Volume,然後輸入「docker volume ls」查看現有Volume清單,可看到DRIVER:local VOLUME NAME:backup。
至於這個backup volume存放在本地端的何處,透過「docker volume inspect backup」就可看到詳細資訊,如圖1所示,其中Mountpoint顯示存放在「/var/lib/docker/volumes/backup/_data」,而且Docker容器皆是存放在「/var/lib/docker」目錄底下。
|
▲圖1 Volume查詢結果。 |
接著執行「docker run -ti --name u1 --rm -v backup:/data ubuntu」,注意加上了「--rm」,登出容器後就會直接刪除。輸入「cd /data」,再次切換到data目錄下,執行「echo "test!" > test.txt」,在目錄內新增檔案。新增完就輸入「exit」,離開容器。
此時,可輸入「docker ps -a」確認u1容器已經刪除,再次執行「docker run -ti --name u2 --rm -v backup:/data ubuntu」,切換到data目錄下便可看到test.txt檔案,表示此目錄資料皆會持久保存,即使容器徹底刪除掉。
除了上述預設儲存於本地端,第三方外部廠商亦提供Plugin程式,可增加儲存於遠端其他設備的功能,由於虛擬化技術廣為人知,因此介紹vSphere Docker Volume Service(https://github.com/vmware/docker-volume-vsphere),藉由此外掛,便可將容器資料存放到VMware vShpere ESX上的虛擬硬碟,詳細步驟如下: