iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 4

Day4 了解Volumes及Bind Mounts

昨天順利地將我們的APP推至image並且學會了更新的技巧了。
但是每次更新的時候todo-list的資料也跟著消失不見了,該怎麼辦呢。
這時候肯定就會想到需要一個儲存資料的方法,那個方法就是 ── Volumes

Volumes

Volumes是由container建立,用於保存數據,就是這麼簡單,Volumes有幾個特點。

  • Volumes易於備份跟遷移。

    因為是單獨的container想怎麼用就怎麼用

  • 新的Volumes可以透過container預先填入內容。

    待補

  • Volumes driver可以將你的Volumes儲存至遠端主機及雲服務,可以加密Volumes的內容或是使用其他功能。

    待補

  • Volumes可以在多個container間安全地共享。

    待補

  • Volumes在windows或是linux都可以使用。
  • 可以透過docker CLI或是docker API管理Volumes。

建立Volumes

要建立Volumes的話需要直接搭配volume指令就能建立,如下則是建立一個名為todo-db的Volumes。

docker volume create todo-db

接下來就是要連接APP與Volumes,因此記得要先停止APP才能成功連接Volumes。
停止APP之後執行以下指令就能連接APP與Volumes。

docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started

跟一般執行APP的指令很像,但是多了-v的標誌代表要指定Volumes

接下來就可以在APP中加入幾個todo事件,或是勾選完成。
之後便可以將APP的image停止並移除,重新建置再依照上面的指令執行。
執行完成後就會發現剛剛所做的操作以及資料都還留著呢,就是這麼的方便。

Bind Mounts

Bind Mounts跟Volumes不一樣的地方在於,Volumes會在docker的儲存目錄中建立一個新的目錄,並且由Docker管理使用;而Bind Mounts則是將主機(host)的目錄安裝置container中,所以目錄是由主機上的固定的路徑來使用,雖然Bind Mounts效能比較好,但是需要在特定目錄結構的主機文件系統中才能使用且無法使用Docker CLI來進行管理。

在開始使用Bind Mounts之前需要建立開發模式的container。

docker run -dp 3000:3000 \
    -w /app -v "$(pwd):/app" \
    node:12-alpine \
    sh -c "yarn install && yarn run dev"

-w /app 代表設置命令的工作目錄或是當前目錄

-v "$(pwd):/app" 代表將當前目錄綁定至container中的/app目錄中

剩下的就跟Dockerfile中的一樣,指定環境以及指令的順序。

接下來就可以執行logs命令查看檔案變化。

docker logs -f <container-id>

接下來將檔案修改並儲存,例如修改src/static/js/app.js中109的

-                         {submitting ? 'Adding...' : 'Add Item'}
+                         {submitting ? 'Adding...' : 'Add'}

儲存之後除了在logs印出的資訊裡也可以在local:3000的頁面幾乎是立即看到變化,因為不需要安裝所有構建工具和環境,對於本地開發測試來說非常方便且實用。

明天就接著學習如何使用Multi-Container Apps。

參考文獻:
Docker官方文件


上一篇
Day3 開始體驗Docker吧(二)
下一篇
Day5 container混戰拉!
系列文
自我學習Docker的30天奇幻旅程24

尚未有邦友留言

立即登入留言