每天資訊如何將卷新增到現有的 Docker 容器

菜單

如何將卷新增到現有的 Docker 容器

如何將卷新增到現有的 Docker 容器

雖然 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

如何將卷新增到現有的 Docker 容器

然後,使用以下命令克隆它

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

想了解更多精彩內容,快來關注

四川人在香港

舉報/反饋