本系列文章根據Ajeet Singh Raina所寫的「Top 100 Docker Interview Questions」文章,翻譯轉載成一百個問題與答案,並Docker相關面試問題分成初級、中級和進階級。本文為初級的第二部分,很適合正在準備Docker相關工作的職缺面試或是想要吸收Docker相關知識的IT從業人員。
想要按部就班地了解Docker容器技術,Ajeet Singh Raina所寫的「Top 100 Docker Interview Questions」肯定是最適合的教材,這篇文章收集了許多Docker FAQs,以下為Docker一百個問答集之第二部分。
Docker基礎知識(初級)第二部分
以下是針對準備成為DevOps工程師和Docker相關工程人員之一百個面試問題中初級基礎知識的第二部分,依舊透過一問一答的方式進行解說。
Q34:請解釋一下Docker中所提供之各種不同的Volume掛載類型?
Docker共有以下三種掛載類型:
‧Volumes:Volume儲存在執行Docker的主機,其管理之檔案系統的一個目錄中(Linux內的/var/lib/docker/volumes/),非Docker相關程序不允許修改此一部分的檔案系統,所以Volume是Docker保留資料的最佳方式,例如「docker run -ti -v vol1:/app alpine sh」。
‧Bind mount:綁定掛載可儲存在Host主機系統的任何位置,甚至它們可能是重要的系統文件或目錄,Docker主機中的非Docker程序或Docker容器內的程式隨時皆可以修改檔案,例如「docker run -ti -v /home/philipz/vol1:/app alpine sh」。
‧tmpfs mount:暫存掛載僅儲存在主機系統的記憶體中,永遠不會寫入主機系統的檔案系統,例如「docker run -ti --tmpfs /app alpine sh」。
其實,掛載並不侷限只能是檔案,在Linux設計概念,所有事物皆是檔案系統,所以「/dev」底下的裝置也可掛載到容器中,因此Nvidia看上了容器的軟體包裝特性,把深度學習框架(cuDNN)和平行運算函式庫(CUDA)打包成容器映像檔,只要Host主機裝好GPU驅動程式,並將GPU裝置掛載到容器中,就可以在容器內執行需要GPU運算能力的深度學習等人工智慧相關系統(圖1)。
Nvidia甚至推出nvidia-docker的Wrapper工具(https://github.com/NVIDIA/nvidia-docker),直接幫使用者掛載GPU裝置,不需要再輸入一堆「-v /dev/nvidia0」等掛載參數,所以容器也讓這波人工智慧研究熱潮更加便捷。
Q35:如何在Docker Host主機之間共享資料?
在開發應用系統的時候,有多種達成此目的的方法,一種是為應用程式添加儲存邏輯,是將文件置放在Amazon S3等雲端對象儲存系統上,另一種方法則是建立Volume,使用可支援把文件寫入NFS或Amazon S3等外部儲存系統之驅動程式。
Volume驅動程式允許從應用程式的邏輯中去抽象化底層儲存系統,舉例來說,如果目前的服務使用具備NFS驅動程式的Volume,亦可更新底層服務以便使用其他驅動程式,例如在雲端中儲存資料,而無須修改應用程式的邏輯。
Q36:如何在Docker容器下備份、還原或搬移資料儲存Volume?
備份容器的步驟,可分成以下三步驟:
1. 首先,已有執行中的容器dbstore,且掛載了Volume,例如「docker run -d --name dbstore -e MYSQL_ROOT_PASSWORD=XXXX -v dbdata:/var/lib/mysql mysql」。
2. 接著啟動新容器,並且從dbstore容器載入Volume,例如「docker run -ti --rm --volumes-from dbstore -v $(pwd):/backup ubuntu bash」。
3. 將MySQL資料庫的dbstore volume資料用tar指令壓縮備份,如「tar cvf /backup/backup.tar /var/lib/mysql」,便可將「/var/lib/mysql」目錄備份到「/backup/backup.tar」,登出容器後,可在當下目錄看到backup.tar壓縮檔。
上述步驟2與步驟3可以合併成「docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/mysql」。
備份還原到容器,共有以下四步驟: