Docker 實戰系列(三):使用 Volume 保存容器內的數據

Docker 實戰系列(三):使用 Volume 保存容器內的數據

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRUAEvzw-1645194757438)(https://miro.medium.com/fit/c/96/96/1*ti9wWeiCLA2dhU9ewpFhtQ.jpeg)]

Larry LuFollow

Mar 9, 2018 · 4 min read

這是 Docker 實戰系列文的第三篇,如果還沒看過上一篇的可以先看看 Docker 實戰系列(二):在 DockerHub 上分享自己的 image

之前說過每個 container 都是獨立的,那如果今天我想升級 mysql 的版本,於是我把正在跑的 *mysql:5.5* 關掉,然後重新跑一個 *mysql:5.7* 的 container,那資料庫裡面的資料不就不見了嗎?

沒錯,這時候就需要 volume 了,簡單來說 Volume 就是用來保存容器內的資料的,看看下面這張圖

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NTqIphVj-1645194757441)(https://miro.medium.com/max/700/1*NyEkiVdw2MjS41EZxqjcpg.png)]

當你使用 volume 時,docker 會在你的本機上隨機新增一個資料夾(Local storage area),大部分會在 /var 底下,然後讓這個資料夾跟 container 裡面的某個資料夾互通。

因為他們是互通的,所以當你 container 裡面那個資料夾有任何變更時,本地的資料夾也會跟著變,而且很重要的一點是:*container 被刪掉時那個資料夾還會原封不動保留在那邊*

我們就可以利用這個特性保留容器裡面的資料

實際操作

1. 新增一個 volume

我們新增了一個 volume 叫做 db-data,完成之後可以看到多一個 volume,這時候 docker 已經在本機上新增一個資料夾要給 volume 用

> docker volume create --name db-data
> docker volume ls

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fdrdzUE1-1645194757441)(https://miro.medium.com/max/480/1*KZDQwsjsj_DieQQIbEb_0A.gif)]

2. 使用 volume

在啟動時加一個 -v 參數,就可以指定 volume 要跟容器內哪一個資料夾連通,這邊用的是 /db/data,實際上使用時可以換成資料庫存放資料的路徑

demo 一下:
\1. 剛開始先確認 /db/data 裡面什麼檔案都沒有
\2. 接著在容器內新增一個檔案 file3. 最後再確認檔案在不在

> docker run -v db-data:/db/data -it ubuntu ls -l /db/data
> docker run -v db-data:/db/data -it ubuntu touch /db/data/file
> docker run -v db-data:/db/data -it ubuntu ls -l /db/data

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v272Go6p-1645194757442)(https://miro.medium.com/max/480/1*9yPgmkwx0Ubz0AT_x-e7Nw.gif)]

值得留意的是*這三個指令是跑在不同的容器裡面*,所以也就證明了*當容器被關掉時,資料確實還有保存在 volume 內*,而且下個容器可以成功讀到上個容器留下的資料

Host Volume

上面那種先 create 再使用的 volume 稱作 named volume,而現在要介紹另外一種叫做 host volume,用來直接***指定某個資料夾***跟容器內的資料夾連通

來一段 demo:
\1. 檢查 ~/app 內沒有 package.json
\2. 指定本機的 ~/app 跟容器內的 /app 連通,接著在容器內跑 yarn init
\3. 跑完再回本機確認有沒有生出 package.json

> ls app
> docker run -v ~/app:/app --workdir /app node yarn init -y
> ls app

img

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gznwlI6P-1645194757443)(https://miro.medium.com/max/480/1*QME0roLI6EO9W85uS0ALSg.gif)]

上面例子中的 package.json 其實是在容器內生成的,所以有了 volume 之後就可以不用裝 yarn 卻還是可以跑 yarn init

同理,你也可以不用裝 g++ 就能編譯 C++ 原始碼、不用裝 JDK 就可以開發 Java 程式、甚至不用裝 mongodb 就可以用他來存資料,整台電腦只要裝一個 docker,真是太神了🎉🎉

總結

這篇講了兩種 volume 希望大家都有看懂,如果想更深入了解可以看看官方文件,在往後的章節為了保存資料將會很常用到他

下一篇要講的是如何將一個應用拆分成多個 container,讓他們分工合作構成你的應用程式,有興趣的人歡迎追蹤我,謝謝大家~

Larry・Blog

我是 Larry Lu,我熱愛技術、喜歡與人分享,專長是 Web 前後端還有 CI/CD,歡迎大家來跟我聊聊技術~

—post_sidebar--------------)

我是 Larry Lu,我熱愛技術、喜歡與人分享,專長是 Web 前後端還有 CI/CD,歡迎大家來跟我聊聊技術~

Follow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值