雖然 Docker 是用於打包和管理應用程式的有用工具,但它也帶來了許多獨特的挑戰,例如處理儲存的資料。
通常,您在建立指令碼中將卷新增到容器中,但是如果您需要製作新的卷怎麼辦?
向正在執行的 Docker 容器添加捲
不幸的是,這並不像新增一個新卷那麼簡單。
容器必須在啟動時配置它們的卷,這意味著要新增新卷,您必須重新啟動容器。
雖然有一個 hacky 解決方案(更多內容見下文),但強烈建議無論如何都應該重新啟動容器。
這有幾個原因。
重新啟動容器相當容易,而且大多數程式碼更新無論如何都需要重新啟動服務。
在 Git 中跟蹤更新是另一個重要因素,尤其是當您使用 Docker Compose 時,編輯啟動指令碼比手動將卷新增到正在執行的容器要好得多。
如果您的服務足夠大,以至於您擔心可能需要幾分鐘(最多)的計劃停機時間來重新啟動容器,那麼您可能應該執行具有多個可以獨立更新的例項的擴充套件部署。
由於程式碼部署經常發生,現代自動擴充套件系統應該被設計來處理這種情況。
如果要添加捲,則需要停止正在執行的容器:
docker stop my_container
如果需要,請建立一個新卷:
docker volume create nginx-config
然後使用更新的啟動命令執行它,新增
——mount
標誌以配置源卷和目標目的地。
docker run -d \ ——name devtest \ ——mount source=nginx-config,target=/etc/nginx \ nginx:latest
如果您使用
Docker Compose
,則可以更輕鬆地自動化和跟蹤此過程,因為卷配置是透過設定檔案處理的。
您需要將卷新增到
docker-compose。yml
檔案中:
version: “3。0”services: web: image: nginx:latest ports: - “80:80” volumes: - /docker/nginx-config/:/etc/nginx/
然後,您可以重新啟動 Docker Compose 的服務。
Compose 有一個“重啟”命令,但它實際上只是重新整理正在執行的服務,無需任何配置更改。
如果要更新影象,則需要
docker-compose up
使用以下
——build
標誌
執行
:
docker-compose up -d ——build
您也可以
docker-compose down
預先
手動執行
以停止服務,但在大多數情況下沒有必要,除非您想使用
-v
標誌
執行它
以破壞現有卷。
從現有容器克隆
在幾乎所有情況下,您都不應該依賴容器的當前執行狀態。
你關心的任何東西,比如應用程式資料,都應該儲存在一個卷中,以便它可以在容器重新啟動和重建時持久化。
對於大多數人來說,這種方法可能不是一個好主意,因為它需要您每次都製作一個新影象,並且仍然需要停機。
但是,如果您確實需要向正在執行的容器添加捲,則可以使用
docker commit
基於該容器製作新映像,然後使用新卷克隆它。
從
docker ps
以下位置
獲取容器 ID
:
docker ps
然後,使用以下命令克隆它
commit
:
docker commit f88f33c918d2 imagename
然後,您可以執行新映像,用克隆的映像替換舊映像。
docker run -d \ ——name devtest \ ——mount source=nginx-config,target=/etc/nginx \ imagename
駭客解決方案
Docker 卷實際上只是 Docker 執行時用來向容器公開主機目錄的技巧,這一切都取決於配置。
因此,您實際上可以直接修改該配置,併為您的系統重新啟動整個 Docker 守護程式以應用這些更改,而無需重新啟動。
當然,這比處理容器重啟要複雜得多,因此如果您可以管理一分鐘的停機時間,我們強烈建議您改為這樣做。
您需要導航到 Docker 的儲存目錄:
cd /var/lib/docker/containers
此處將有許多與 Docker 容器 ID 對應的資料夾,您可以使用
docker ps
。
為要修改的容器開啟一個。
配置檔案是
config。v2。json
,但它採用緊湊格式且難以編輯。
您可以
jq
在命令列上
安裝
到漂亮的列印 JSON,並將其透過管道傳輸到一個新檔案進行編輯:
。jq config。v2。json > tmp。json
您需要向下滾動以找到“MountPoints”,其中包含所有卷和繫結安裝的配置。
你可以在這裡新增一個新的,它應該是以下格式:
“MountPoints”: { “/home/container”: { “Source”: “/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933”, “Destination”: “/home/container”, “RW”: true, “Name”: “”, “Driver”: “”, “Type”: “bind”, “Propagation”: “rprivate”, “Spec”: { “Type”: “bind”, “Source”: “/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933”, “Target”: “/home/container” }, “SkipMountpointCreation”: true } },
然後,一旦完成,您可以再次將 JSON 壓縮回配置檔案:
jq -c 。tmp。json > config。v2。json
jq
是一個強大的實用程式,所以如果你想完全自動化這個過程,你可以這樣做。
然後,只需重新啟動 Docker 服務即可應用更改:
sudo service docker restart
想了解更多精彩內容,快來關注
四川人在香港
舉報/反饋