<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在本文內容中,我們將討論 Docker 中管理資料的幾種方式,涉及將資料從 Docker 主機掛載到容器中的不同方法。
通過之前的學習,我們學習了有關於容器和映象的一些知識。對於資料來說,我們可以將其儲存在容器中,但是會存在一些缺點:
針對上述的缺點而言,有些資料資訊,例如我們的資料庫檔案,我們不應該將其儲存在映象或者容器的可寫層中。Docker 提供三種不同的方式將資料從 Docker 主機掛載到容器中,分別為卷(volumes
),繫結掛載(bind mounts
),臨時檔案系統(tmpfs
)。很多時候,volumes 總是正確的選擇。
volumes
卷儲存在 Docker 管理的主機檔案系統的一部分中(/var/lib/docker/volumes/
)中,完全由 Docker 管理。bind mounts
繫結掛載,可以將主機上的檔案或目錄掛載到容器中。tmpfs
僅儲存在主機系統的記憶體中,而不會寫入主機的檔案系統。無論使用上述的哪一種方式,資料在容器內看上去都是一樣的。它被認為容器檔案系統中的目錄或單個檔案。
對於三種不同的儲存資料的方式來說,卷是唯一完全由 Docker 管理的。它更容易備份或遷移,並且我們可以使用 Docker CLI
命令來管理卷。
列出本地可用的卷列表可以使用如下命令:
docker volume ls
執行之後,你可能會看到一些環境中預置映象對應的卷,或者顯示為空。
建立卷
建立卷我們可以直接使用如下命令:
docker volume create
上述命令會建立一個資料卷,並且會隨機生成一個名稱。建立之後我們可以檢視卷列表:
docker volume ls
這種由系統隨機生成名稱的建立卷的方式被稱為 匿名卷,直接使用該卷需要指定卷名,即自動生成的 ID,所以建立卷時一般手動指定其 name,例如我們建立一個名為 volume1 的卷。
docker volume create volume1
掛載卷
建立卷之後,我們可以用捲來啟動一個容器,這裡首先需要學習 docker container run 命令的兩個引數:
-v
或 --volume
由三個由冒號(:)分隔的欄位組成,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]
。
HOST-DIR
代表主機上的目錄或資料卷的名字。省略該部分時,會自動建立一個匿名卷。如果是指定主機上的目錄,需要使用絕對路徑。CONTAINER-DIR
代表將要掛載到容器中的目錄或檔案,即表現為容器中的某個目錄或檔案。OPTIONS
代表設定,例如設定為唯讀許可權(ro
),此卷僅能被該容器使用(Z
),或者可以被多個容器使用(z
)。多個設定項由逗號分隔。例如,我們使用 -v volume1:/volume1:ro,z
。代表的是意思是將卷 volume1
掛載到容器中的 /volume1
目錄。ro,z
代表該卷被設定為唯讀(ro
),並且可以多個容器使用該卷(z
)。
--mount
由多個鍵值對組成,鍵值對之間由逗號分隔。例如:type=volume,source=volume1,destination=/volume1,ro=true
。
type
,指定型別,可以指定為 bind
,volume
,tmpfs
。source
,當型別為 volume
時,指定卷名稱,匿名卷時省略該欄位。bind
,指定路徑。可以使用縮寫 src
。destination
,掛載到容器中的路徑。可以使用縮寫 dst
或 target
。ro
為設定項,多個設定項直接由逗號分隔一般使用 true 或 false
。針對上述建立的卷 volume1
,用其來執行一個容器就可以使用如下命令:
docker container run -it --name niuma001 -v volume1:/volume1 --rm ubuntu /bin/bash
或者我們也可以使用 --mount
,其語法格式如下:
docker container run -it --name niuma002 --mount type=volume,src=volume1,target=/volume1 --rm ubuntu /bin/bash
從命令中,可以很明顯的得出,--mount
的可讀性更好。所以,推薦大家使用 --mount
。
在 docker container run
中我們使用了引數 --rm
,它的作用在容器退出時刪除容器。這裡我們建立的映象只是希望它短期執行,其使用者資料並無保留的必要,因而可以在容器啟動時設定 --rm
選項,這樣在容器退出時就能夠自動清理容器內部的檔案系統。
值得注意的是,後臺執行的容器無法使用 -d
與 --rm
選項。
上述操作,我們分別執行了兩個容器,並分別掛載了一個卷,還可多次使用該引數掛載多個卷或目錄。並且對於這兩個容器來說,由於我們使用的是同一個卷,所以他們將共用該資料卷,但是對於多個容器共用資料卷時,需要注意並行性。大家可以分別連線到兩個容器中,運算元據,驗證其是同步的,這裡就不再詳細演示了。
對於資料捲來說,其優點在於方便管理。而對於繫結掛載 bind-mounts
來說,通過將主機上的目錄繫結到容器中,容器就可以操作和修改主機上該目錄的內容。這既是其優點也是其缺點。
例如,我們將 /home/xiaoniuma
目錄掛載到容器中的 `/home/xiaoniuma 目錄下,使用的命令如下:
docker container run -it -v /home/xiaoniuma:/home/xiaoniuma --name xiaoniuma003 --rm ubuntu /bin/bash
而如果使用的是 --mount,相應的語句如下:
docker container run -it --mount type=bind,src=/home/xiaoniuma,target=/home/xiaoniuma --name xiaoniuma004 --rm ubuntu /bin/bash
如果繫結掛載時指定的容器目錄是非空的,則該目錄中的內容將會被覆蓋。並且如果主機上的目錄不存在,會自動建立該目錄。
上述兩個操作針對的是目錄,而對於掛載檔案來說,可能會出現一些特殊情況,涉及到繫結掛載和使用卷的區別。下面我們重現這一操作:
1.首先在當前目錄,即 /home/xiaoniuma 目錄下,建立一個 test.txt 檔案。並向其中寫入文字內容 “test1”:
echo "test1" > test.txt
2.接著建立一個容器 xiaoniuma005,將 test.txt 檔案掛載到容器中的 /test.txt 檔案,並檢視容器中 /test.txt 檔案的內容:
docker container run -it -v /home/xiaoniuma/test.txt:/test.txt --name xiaoniuma005 ubuntu /bin/bash
3.這時新開啟一個終端,通過 echo
命令向 /home/xiaoniuma/test.txt
檔案追加內容 “test2”,並在容器中檢視 /test.txt
檔案的內容:
echo "test2" >> test.txt
4.這時無論是在容器中還是主機上都能檢視到該檔案的內容。接下來在主機上檢視 test.txt
的 inode 號。
使用 VIM 編輯該檔案,新增 “test3”,並檢視該檔案的內容:
如上圖所示,在主機上使用 VIM 編輯後,通過 VIM 做出的修改不能在容器中檢視到。這是因為 VIM 編輯儲存檔案的時候,會將檔案內容寫入到一個新的檔案中,儲存好後,刪除掉原來的檔案,並將新檔案重新命名,從而完成儲存的操作。但是我們標識檔案是通過 inode
,因此 Docker 繫結的主機檔案,依舊是 VIM 編輯之前的 inode
,即舊檔案。所以容器中看到的,依然是舊的內容。
對於資料捲來說,由 Docker 完全管理,而繫結掛載,則需要我們自己去維護。我們需要自己手動去處理這些問題,這些問題並不僅僅是上面演示的內容,還可能有使用者許可權,SELINUX
等問題。
最後簡單說一下臨時檔案系統 tmpfs
。它只儲存在主機的記憶體中。當容器停止時,相應的資料就會被移除。
docker run -it --mount type=tmpfs,target=/test --name xiaoniuma008 --rm ubuntu bash
如果容器之間需要共用一些持續更新的資料,最簡單的方式就是使用使用者資料卷容器。其他容器通過掛載這個容器實現資料共用,這個掛載資料卷的容器就叫做資料卷容器。資料卷容器就是一種普通容器,它專門提供資料卷供其它容器掛載使用。
首先,我們建立一個資料卷和資料卷容器,執行的命令如下:
# 建立一個名為 vdata 的資料卷 docker volume create vdata # 建立一個掛載了 vdata 的容器,這個容器就是資料卷容器 docker container run -it -v vdata:/vdata --name XiaoniumaVolume ubuntu /bin/bash # 在 /vdata 目錄下建立一個文字檔案 echo "I am XiaoniumaVolume" > /vdata/f.txt
接下來我們分別開啟新的終端輸入以下命令,建立兩個容器,在執行 docker container run
時,我們新增引數 --volumes-from
繼承資料卷容器 XiaoniumaVolume
掛載的資料卷。進入容器後分別建立檔案
# 建立容器 test1 docker container run -it --volumes-from XiaoniumaVolume --name test1 ubuntu /bin/bash # 檢視 vdata 目錄是否存在 ls -dl /vdata/ # 建立一個檔案,並寫入內容 echo "I am test1" > /vdata/test1.txt
同樣的,我們執行上述操作,建立容器 test2。
# 建立容器 test2 docker container run -it --volumes-from XiaoniumaVolume --name test2 ubuntu /bin/bash # 檢視 vdata 目錄是否存在 ls -dl /vdata/ # 建立一個檔案,並寫入內容 echo "I am test2" > /vdata/test2.txt
我們進入到 XiaoniumaVolume 容器所在的終端,在掛載的資料中檢視檔案的內容:
# 檢視資料卷中的內容 ls -al /vdata/
從上圖的結果中我們可以看到,資料卷在三個容器之間是共用的。
資料存在於資料卷中,如果我們想要備份它,可以採用建立備份容器的方式。
docker container run --volumes-from XiaoniumaVolume -v /home/xiaoniuma/backup:/backup ubuntu tar cvf /backup/backup.tar /vdata/
--volumes-from XiaoniumaVolume
使得備份容器繼承容器 XiaoniumaVolumeVolume
的資料卷。-v /home/xiaoniuma/backup:/backup
把 /home/xiaoniuma/backup
目錄採用繫結掛載的方式,掛載到容器的 /backup
目錄上。tar cvf /backup/backup.tar /vdata
容器中執行了這麼一條壓縮歸檔命令,將 /vdata
中的全部資料打包到了 /backup/backup.tar
,而剛剛的資料繫結,使得整個壓縮包存在於主機中,從而達到了資料備份的效果。如上圖所示,資料卷中的所有資料都被打包到了 /home/xiaoniuma/backup 目錄中。
與資料備份相同的方式,我們可以使用如下命令建立恢復容器,來還原資料卷中的資料。
docker container run --volumes-from XiaoniumaVolume -v /home/xiaoniuma/backup:/backup ubuntu tar xvf /backup/backup.tar -C /
這裡解壓的路徑為 / 即 /vdata 的上一級目錄。由於與資料備份非常相似,這裡不再給出結果分析。
本文主要使用三種不同的方式將資料從 Docker 主機掛載到容器中,分別為卷(volumes
),繫結掛載(bind mounts
),臨時檔案系統(tmpfs
)。還介紹了資料卷容器、資料卷的備份與恢復。
下文講解Docker網路管理。
到此這篇關於Docker 儲存管理的文章就介紹到這了,更多相關Docker 儲存管理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45