我剛開始使用 docker,我對卷有點困惑。假設我創建了一個容器,其中包含一個卷、一個來自我的計算機的檔案夾和一個來自容器的檔案夾。稍后在我的 pc 檔案夾中創建一個新的 sqlite 資料庫(所以它也在容器中創建,對吧?)。當容器死亡并且您從同一影像創建一個新容器時,資料庫仍將存在。到目前為止我還好嗎?但是影像已經用這個新資料庫更新了或者發生了什么?如果不是,在這些情況下重建影像并構建容器是否更好?(或者我應該什么時候重建影像?當我更改環境變數時?)非常感謝,我希望你能幫助我!
uj5u.com熱心網友回復:
也許更簡單的情況是資料庫位于單獨的容器中。考慮這個docker-compose.yml檔案:
version: '3.8'
services:
app:
build: .
ports: ['8000:80']
environment: { PGHOST: db, ... }
db:
image: 'postgres:15.1'
environment: { ... }
volumes:
- 'dbdata:/var/lib/postgresql/data'
volumes:
dbdata:
首先,請注意app容器上沒有安裝任何東西。如果代碼更改,則必須重建映像,如果映像更改,則必須重新創建容器。(與 C 、Go、Rust、Java 或 Elixir 等編譯語言相比:如果您更改代碼,通常必須重新編譯可執行檔案,然后啟動新行程。)
希望db容器和dbdata命名卷的基本生命周期是清楚的。
現在假設發布了 PostgreSQL 15.2,并且您進行了image:相應的更改。官方鏡像構建無法知道你的具體資料,也無法包含在鏡像中。相反,現有卷將安裝到運行新映像的新容器中。
[如果可能的話,我會推薦這樣的設定,將資料存盤在與應用程式容器分開的資料庫中。如果您想要運行應用程式的多個副本,或者如果您正在考慮在專用硬體或托管公共云產品上運行資料庫,這將很有幫助。]
您應該能夠將其概括為您在問題中描述的設定。如果你有更多喜歡:
version: '3.8'
services:
app:
build: .
ports: ['8000:80']
volumes:
- ./data:/app/data # containing the SQLite file
系結掛載的/app/data目錄實際上在容器之外有它的存盤空間。如果容器被洗掉并重新創建,資料仍然存在。如果代碼發生變化,您確實需要重建鏡像,但資料根本沒有存盤在鏡像中(雖然它可以從容器中訪問,但它并沒有像這樣存盤在容器檔案系統中)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/537837.html
標籤:数据库码头工人docker-compose集装箱码头图像
