是否可以將單個 docker 卷共享給具有/var/lib/docker目的地的多個 docker 容器?
一個最小的可重現示例如下所示:
$ docker volume create --name lib
$ docker run --privileged -v lib:/var/lib/docker --name c1 -d docker:dind
$ docker run --privileged -v lib:/var/lib/docker --name c2 -d docker:dind
我想同時處理docker內部c1和c2容器。但是,如果您稍等片刻,您會發現這是不可能的,并且第二個容器 ( c2) 會停止。我檢查了錯誤日志:
$ docker logs -f c2
.
.
.
failed to start containerd: timeout waiting for containerd to start
而且,我不能制作多卷;因為存盤空間有限,而且圖片的大小很重。
更新: 也許我正面臨著 XY 問題!其實我想分享我的圖片。我希望我的主機內的所有 Docker 鏡像,進入所有 DinD 容器,容器也應該能夠創建一個新的 Docker 鏡像,并且這個新鏡像應該可以同時從其他容器訪問。
uj5u.com熱心網友回復:
在問題的標題上,是的,多個容器可以掛載同一個卷。但是,您的容器都是 docker 引擎,第二個引擎無法啟動,因為/var/lib/docker目錄中已經有一個正在運行的 docker 引擎。這不是一個卷安裝問題,而是一個 docker 引擎設計挑戰。
鑒于您的要求,來自主機引擎的容器映像資料庫與各種 DinD 實體共享,同時不共享主機本身的docker.sockdocker引擎(通過 a或 mTLS),我認為沒有好的答案。你有兩個選擇:
運行您自己的本地注冊服務器。這是為了防止層被發送到您的網路之外,甚至可以在同一臺主機上。但是,將為每個引擎復制層,并且您需要在該注冊表上管理 GC 策略。這為您提供了所需的隔離,而無需對影像層進行所需的重復資料洗掉。
docker.sock在主機和受信任的容器之間共享。然后容器可以直接訪問主機引擎,有效地在主機上root(除非您已將引擎設定為無根),因此僅在您信任它的環境中執行此操作。這將為您提供層重復資料洗掉,但沒有任何隔離。
之所以困難,是因為 docker 旨在管理它自己的副本/var/lib/docker,因此可以在記憶體中跟蹤所有狀態,并定期將其作為 json 元資料檔案推送到磁盤上以處理重啟。互斥體在一個行程中,它不需要擔心多個作者修改層,或者在撰寫者仍在創建層時運行讀取器。
uj5u.com熱心網友回復:
看看這個檔案:https : //docs.docker.com/storage/bind-mounts/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/374773.html
標籤:码头工人
上一篇:如何在JUnit測驗容器中的MySQLContainer中匯入sql轉儲檔案
下一篇:react最新筆記
