持久化資料庫
如果您沒有注意到,每次啟動容器時,您的待辦事項列表都是空的。這是為什麼?在本部分中,您將深入瞭解容器的工作原理。
容器的檔案系統
當容器執行時,它使用映象中的各個層作為其檔案系統。每個容器還獲得自己的“臨時空間”來建立/更新/刪除檔案。任何更改都不會在另一個容器中看到,即使它們使用的是同一個映象。
實踐中檢視
要檢視此操作,您將啟動兩個容器。在一個容器中,您將建立一個檔案。在另一個容器中,您將驗證檔案是否存在。您將看到,在一個容器中建立的檔案在另一個容器中不可用。
啟動一個 Alpine 容器並訪問其 shell。
$ docker run -ti --name=mytest alpine
在容器中,使用
hello
在其中建立一個名為greeting.txt
的檔案。/ # echo "hello" > greeting.txt
退出容器。
/ # exit
執行一個新的 Alpine 容器,並使用
cat
命令驗證檔案是否不存在。$ docker run alpine cat greeting.txt
您應該看到類似於以下內容的輸出,表明該檔案在新容器中不存在。
cat: can't open 'greeting.txt': No such file or directory
繼續使用
docker ps --all
獲取 ID,然後使用docker rm -f <container-id>
刪除容器。
容器卷
透過之前的實驗,您看到每個容器在每次啟動時都從映象定義開始。雖然容器可以建立、更新和刪除檔案,但這些更改在您刪除容器時會丟失,並且 Docker 將所有更改隔離到該容器中。使用卷,您可以改變這一切。
卷 提供將容器的特定檔案系統路徑連接回主機的能力。如果您在容器中掛載目錄,則該目錄中的更改也會在主機上看到。如果您在容器重啟時掛載了相同的目錄,您將看到相同的檔案。
卷主要有兩種型別。您最終將使用這兩種型別,但您將從卷掛載開始。
持久化待辦事項資料
預設情況下,待辦事項應用程式將資料儲存在容器檔案系統中的 /etc/todos/todo.db
中的 SQLite 資料庫中。如果您不熟悉 SQLite,不用擔心!它只是一個將所有資料儲存在一個檔案中的關係資料庫。雖然這對於大型應用程式來說不是最好的,但它適用於小型演示。您將學習如何稍後將其切換到不同的資料庫引擎。
由於資料庫只是一個檔案,如果您可以在主機上持久化該檔案並使其對下一個容器可用,它應該能夠從上一個容器停止的地方繼續。透過建立一個卷並將其附加(通常稱為“掛載”)到您儲存資料的目錄,您可以持久化資料。當您的容器寫入 todo.db
檔案時,它將資料持久化到主機上的卷中。
如前所述,您將使用卷掛載。將卷掛載視為資料的不透明桶。Docker 完全管理卷,包括磁碟上的儲存位置。您只需要記住卷的名稱。
建立卷並啟動容器
您可以使用 CLI 或 Docker Desktop 的圖形介面建立卷並啟動容器。
使用
docker volume create
命令建立卷。$ docker volume create todo-db
使用
docker rm -f <id>
再次停止並刪除待辦事項應用程式容器,因為它仍在執行,沒有使用持久卷。啟動待辦事項應用程式容器,但新增
--mount
選項以指定卷掛載。為卷指定一個名稱,並將其掛載到容器中的/etc/todos
,這將捕獲在該路徑下建立的所有檔案。$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=/etc/todos getting-started
注意
如果您使用的是 Git Bash,則必須使用不同的語法來執行此命令。
$ docker run -dp 127.0.0.1:3000:3000 --mount type=volume,src=todo-db,target=//etc/todos getting-started
有關 Git Bash 語法差異的更多詳細資訊,請參閱 使用 Git Bash。
要建立卷
- 在 Docker Desktop 中選擇**卷**。
- 在**卷**中,選擇**建立**。
- 指定
todo-db
作為卷名稱,然後選擇**建立**。
要停止並刪除應用程式容器
- 在 Docker Desktop 中選擇**容器**。
- 在容器的**操作**列中選擇**刪除**。
要使用掛載的卷啟動待辦事項應用程式容器
選擇 Docker Desktop 頂部的搜尋框。
在搜尋視窗中,選擇**映象**選項卡。
在搜尋框中,指定映象名稱
getting-started
。提示
使用搜索過濾器篩選映象,僅顯示**本地映象**。
選擇您的映象,然後選擇**執行**。
選擇**可選設定**。
在**主機埠**中,指定埠,例如
3000
。在**主機路徑**中,指定卷的名稱
todo-db
。在**容器路徑**中,指定
/etc/todos
。選擇**執行**。
驗證資料是否持久化
容器啟動後,開啟應用程式並在待辦事項列表中新增幾個專案。
停止並刪除待辦事項應用程式的容器。使用 Docker Desktop 或
docker ps
獲取 ID,然後使用docker rm -f <id>
刪除它。使用前面的步驟啟動一個新容器。
開啟應用程式。您應該看到您的專案仍在您的列表中。
完成檢視您的列表後,請繼續刪除容器。
您現在已經瞭解瞭如何持久化資料。
深入瞭解卷
很多人經常問“當我使用卷時,Docker 在哪裡儲存我的資料?”如果您想知道,可以使用 docker volume inspect
命令。
$ docker volume inspect todo-db
您應該看到類似於以下內容的輸出
[
{
"CreatedAt": "2019-09-26T02:18:36Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
"Name": "todo-db",
"Options": {},
"Scope": "local"
}
]
Mountpoint
是資料在磁碟上的實際位置。請注意,在大多數機器上,您需要具有 root 許可權才能從主機訪問此目錄。
總結
在本節中,您學習瞭如何持久化容器資料。
相關資訊
下一步
接下來,您將學習如何使用繫結掛載更有效地開發您的應用程式。