06_Docker數(shù)據(jù)卷(Volume)

參考資料

Docker容器默認把數(shù)據(jù)存儲到容器內(nèi)部酵镜,當容器刪除的時候赡突,容器內(nèi)的數(shù)據(jù)會同步刪除涵妥。

很多情況下,我們是不希望數(shù)據(jù)被刪除的叉谜,常規(guī)的有2種方式能達到目的:

  1. 在刪除容器之前將數(shù)據(jù)拷貝到本地听怕。
  2. 通過數(shù)據(jù)卷把宿主機文件夾映射到容器內(nèi)部框弛,這就是數(shù)據(jù)卷。

Docker數(shù)據(jù)卷種類和特點

Docker數(shù)據(jù)卷(Volume)有兩種:

  • 數(shù)據(jù)卷
  • 數(shù)據(jù)卷容器

數(shù)據(jù)卷是特殊設計的目錄十饥,獨立在容器的生命周期外,可以繞過聯(lián)合文件系統(tǒng)(UnionFS)祖乳,可以為一個或多個容器提供服務逗堵。

Docker數(shù)據(jù)卷的特點:

  • 可以在容器和宿主機之間或容器與容器之間共享和重用;
  • 在容器和宿主機之間雙向同步眷昆;
  • 數(shù)據(jù)卷大小不會附加到容器上蜒秤;
  • 數(shù)據(jù)卷的變化,不會影響鏡像的更新隙赁;
  • 會一直存在垦藏,直到?jīng)]有任何容器使用它,才能使用命令docker volume rm [volumes名字]刪除伞访。

數(shù)據(jù)卷大小不會附加到容器上掂骏,這就類似軟鏈接『裰溃可以啟動兩個Tomcat弟灼,并把其中一個Tomcat的logs目錄掛載進去,分別通過docker export導出冒黑,發(fā)現(xiàn)掛載logs目錄的導出文件中l(wèi)ogs目錄沒文件田绑,未掛載logs目錄的,導出文件中有文件抡爹。

Docker數(shù)據(jù)卷

掛載

Docker使用-v指令掛載數(shù)據(jù)卷掩驱,掛載多個時,使用多個-v指令。

Docker數(shù)據(jù)卷掛載常規(guī)的有3種方式:

  • 指定目錄掛載
  • 匿名掛載
  • 具名掛載

指定目錄掛載

在掛載數(shù)據(jù)卷時欧穴,指定宿主機目錄:容器目錄民逼。Docker不會自動在安裝目錄下創(chuàng)建數(shù)據(jù)卷。

  • 語法
# -v 為掛載目錄選項
docker run -v 宿主機目錄:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 啟動tomcat涮帘,并給tomcat掛載日志目錄
# -d 后臺運行
# --name tomcat 指定別名
# -P 隨機指定端口拼苍,啟動后可通過docker ps命令查看映射的端口
# -v 宿主機目錄:容器目錄 掛載目錄到容器
docker run -d --name tomcat -P -v /home/docker/volumes/tomcat/logs:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

注意:指定目錄掛載,不能使用./相對路徑调缨,可以使用~/相對路徑疮鲫。

  • ./ 表示當前路徑下的目錄;
  • ~/ 表示用戶主目錄弦叶,也就是登錄系統(tǒng)后直接進入的目錄俊犯。
  • 分析

Tomcat啟動后,就可以在/home/docker/volumes/tomcat/logs目錄中看到有日志文件生成湾蔓。

進入容器瘫析,也能看到日志文件,說明掛載成功默责。

# 進入容器內(nèi)部
# -it 交互模型運行
# /bin/bash 以/bin/bash交互
docker exec -it tomcat /bin/bash

此時在宿主機或容器中修改文件贬循,另外一邊都能看到,說明是雙向同步的桃序。

使用docker inspect查看容器元數(shù)據(jù)杖虾,在Mounts節(jié)點下可以看到掛載的數(shù)據(jù)卷。

# 查看容器元數(shù)據(jù)


# 輸出
...
"Mounts": [
      {
           "Type": "bind",
           "Source": "/home/docker/volumes/tomcat/logs",
           "Destination": "/usr/local/tomcat/logs",
           "Mode": "",
           "RW": true,
           "Propagation": "rprivate"
      }
],
...

使用docker volume ls命令查看Docker所有掛載的數(shù)據(jù)卷媒熊,發(fā)現(xiàn)并沒有找到這個掛載的數(shù)據(jù)卷奇适。說明指定目錄掛載方式并不會把數(shù)據(jù)卷信息存儲到Docker中,也就是并不能通過具名或匿名掛載方式復用該數(shù)據(jù)卷芦鳍。

# 查看所有掛載的數(shù)據(jù)卷
docker volume ls

# 輸出
DRIVER              VOLUME NAME
local               0ea11ee5a377263e6a62a61afdd554f12f3f61e0e69fb603794363637668f270
local               28ad647f7dc23b3a04c96f8ba8eeca08c0766a1b2669bc42162e43ddcd585164
local               85a5ba99cf1ca1a52e745685bede94be81f6d79e44ef108192d2d27817460331

要想多個Tomcat共用這個數(shù)據(jù)卷嚷往,那么就只能重新輸入完整的宿主機文件路徑來掛載。

# 復用數(shù)據(jù)卷
# -v 后面跟的是完整的宿主機文件路徑:容器目錄
docker run -d --name tomcat1 -P -v /home/docker/volumes/tomcat/logs:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

匿名掛載

在掛載數(shù)據(jù)卷時柠衅,只指定容器內(nèi)部的目錄皮仁。Docker會自動將數(shù)據(jù)卷用一串很長的字符命名。

  • 語法
docker run -v 容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 啟動tomcat菲宴,并給tomcat掛載日志目錄
# -v后只指定容器內(nèi)部目錄
docker run -d --name tomcat -P -v /usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk
  • 分析

使用docker volume ls命令查看贷祈,發(fā)現(xiàn)多了一個數(shù)據(jù)卷,數(shù)據(jù)卷名稱是一串很長的字符喝峦。

# 查看所有數(shù)據(jù)卷
docker volume ls

# 輸出
DRIVER              VOLUME NAME
local               0ea11ee5a377263e6a62a61afdd554f12f3f61e0e69fb603794363637668f270
local               2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4
local               28ad647f7dc23b3a04c96f8ba8eeca08c0766a1b2669bc42162e43ddcd585164
local               85a5ba99cf1ca1a52e745685bede94be81f6d79e44ef108192d2d27817460331

使用docker volume inspect 數(shù)據(jù)卷ID命令查看數(shù)據(jù)卷詳情势誊,發(fā)現(xiàn)數(shù)據(jù)卷在Docker目錄下。

# 查看數(shù)據(jù)卷元數(shù)據(jù)
docker volume inspect 2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4

# 輸出
[
    {
        "CreatedAt": "2020-08-07T12:05:52+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4/_data",
        "Name": "2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4",
        "Options": null,
        "Scope": "local"
    }
]

使用ls命令查看目錄內(nèi)容谣蠢,發(fā)現(xiàn)里面有Tomcat的日志文件粟耻,說明掛載成功了查近。

# 查看目錄內(nèi)容
ls /var/lib/docker/volumes/2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4/_data

# 輸出
catalina.2020-08-07.log  host-manager.2020-08-07.log  localhost.2020-08-07.log  localhost_access_log.2020-08-07.txt  manager.2020-08-07.log

使用docker volume rm 數(shù)據(jù)卷ID 刪除,發(fā)現(xiàn)刪不掉挤忙。

# 刪除數(shù)據(jù)卷
docker volume rm 2afdddef007505f06bc4d83bc157c2b6250661c560c7650b9bd1b2f988bd43d4

停止并刪除容器后嗦嗡,發(fā)現(xiàn)可以刪除成功,說明饭玲,只要數(shù)據(jù)卷還在被使用(或引用)就不能刪除

具名掛載

在掛載數(shù)據(jù)卷時叁执,指定數(shù)據(jù)卷名稱:容器內(nèi)部的目錄茄厘。Docker會按照指定的數(shù)據(jù)卷名稱命名。

語法

docker run -v 數(shù)據(jù)卷名稱:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
# 或
docker volume create 數(shù)據(jù)卷名稱
docker run -v 數(shù)據(jù)卷名稱:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]

示例

# 啟動tomcat谈宛,并給tomcat掛載日志目錄
# -v后指定數(shù)據(jù)卷名稱:容器內(nèi)部目錄
docker run -d --name tomcat -P -v testvolume:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

具名掛載和指定目錄掛載對比

  • 具名掛載:

    • 數(shù)據(jù)卷命名規(guī)則:[a-zA-Z0-9][a-zA-Z0-9_.-]次哈,只能以字母或數(shù)據(jù)開頭,不能包含/~/吆录。
    • 具名掛載會在Docker目錄下生成自定義名稱的數(shù)據(jù)卷窑滞,可以使用docker volume ls查看。
  • 指定目錄掛載:

    • 數(shù)據(jù)卷是一個完整的路徑恢筝,也就是以/~/開頭的哀卫。
    • 指定目錄掛載不會在Docker目錄下生成數(shù)據(jù)卷。

掛載方式對比

掛載方式 生成數(shù)據(jù)卷 命名規(guī)則 默認名稱
指定目錄掛載 × - -
匿名掛載 - 隨機字符串
具名掛載 [a-zA-Z0-9][a-zA-Z0-9_.-] 指定的名稱

Docker數(shù)據(jù)卷容器

如果一個非常復雜的容器撬槽,需要掛載很多個數(shù)據(jù)卷此改。如果這個容器要同時啟動多個,一個個輸入很長的掛載命令很容易出錯侄柔」部校或者多個容器之間需要共享數(shù)據(jù),此時就推薦使用數(shù)據(jù)卷容器了暂题。

數(shù)據(jù)卷容器

數(shù)據(jù)卷容器就是掛載了數(shù)據(jù)卷的容器移剪,數(shù)據(jù)卷容器可以被別的容器掛載。

數(shù)據(jù)卷容器的出現(xiàn)是為了解決容器之間數(shù)據(jù)共享問題薪者。

數(shù)據(jù)卷容器的優(yōu)勢:

  • 可以被多個容器簡單的復用纵苛;
  • 與數(shù)據(jù)卷容器是否啟動無關(guān)。

數(shù)據(jù)卷容器使用

  • 語法
docker run --volumes-from 數(shù)據(jù)卷容器 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例

首先根據(jù)上面的示例啸胧,準備一個數(shù)據(jù)卷容器赶站。

# 創(chuàng)建一個tomcat容器,并掛載數(shù)據(jù)卷
docker run -d --name tomcat -P -v testvolume:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

使用--volumes-from 數(shù)據(jù)卷容器指令掛載這個數(shù)據(jù)卷容器纺念。

# 啟動tomcat贝椿,并給tomcat掛載數(shù)據(jù)卷容器
# 使用--volumes-from,掛載數(shù)據(jù)卷容器
docker run -d --name tomcat_link -P --volumes-from tomcat tomcat:8.5.57-jdk8-openjdk

掛載多個數(shù)據(jù)卷容器時陷谱,使用多個--volumes-from 數(shù)據(jù)卷容器指令掛載烙博。

然后停用tomcat容器瑟蜈,tomcat_link容器還是能正常使用數(shù)據(jù)卷,說明數(shù)據(jù)卷容器是否啟動渣窜,對使用者來說不影響铺根。

命令集

掛載

指定目錄掛載

  • 語法
# -v 為掛載目錄選項
docker run -v 宿主機目錄:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 啟動tomcat,并給tomcat掛載日志目錄
# -d 后臺運行
# --name tomcat 指定別名
# -P 隨機指定端口乔宿,啟動后可通過docker ps命令查看映射的端口
# -v 宿主機目錄:容器目錄 掛載目錄到容器
docker run -d --name tomcat -P -v /home/docker/volumes/tomcat/logs:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

匿名掛載

  • 語法
docker run -v 容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 啟動tomcat位迂,并給tomcat掛載日志目錄
# -v后只指定容器內(nèi)部目錄
docker run -d --name tomcat -P -v /usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

具名掛載

  • 語法
docker run -v 數(shù)據(jù)卷名稱:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
# 或
docker volume create 數(shù)據(jù)卷名稱
docker run -v 數(shù)據(jù)卷名稱:容器目錄 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 啟動tomcat,并給tomcat掛載日志目錄
# -v后指定數(shù)據(jù)卷名稱:容器內(nèi)部目錄
docker run -d --name tomcat -P -v testvolume:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

數(shù)據(jù)卷容器掛載

  • 語法
docker run --volumes-from 數(shù)據(jù)卷容器 [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 示例
# 創(chuàng)建一個tomcat容器详瑞,并掛載數(shù)據(jù)卷
docker run -d --name tomcat -P -v testvolume:/usr/local/tomcat/logs tomcat:8.5.57-jdk8-openjdk

# 啟動tomcat掂林,并給tomcat掛載數(shù)據(jù)卷容器
# 使用--volumes-from,掛載數(shù)據(jù)卷容器
docker run -d --name tomcat_link -P --volumes-from tomcat tomcat:8.5.57-jdk8-openjdk

說明:被掛載的Tomcat容器為正常的數(shù)據(jù)卷容器坝橡。

數(shù)據(jù)卷操作

創(chuàng)建數(shù)據(jù)卷:docker volume create

  • 語法
docker volume create [OPTIONS] [VOLUME]
  • 示例
# 創(chuàng)建一個匿名數(shù)據(jù)卷
docker volume create

# 創(chuàng)建一個testvolume數(shù)據(jù)卷
docker volume create testvolume

查看所有數(shù)據(jù)卷:docker volume ls

  • 語法
docker volume ls [OPTIONS]
  • 示例
# 查看所有數(shù)據(jù)卷
docker volume ls

查看指定數(shù)據(jù)卷元數(shù)據(jù):docker volume inspect

  • 語法
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
  • 示例
# 查看testvolume數(shù)據(jù)卷元數(shù)據(jù)
docker volume inspect testvolume

刪除數(shù)據(jù)卷:docker volume rm/prune

  • 語法
# 刪除一個或多個數(shù)據(jù)卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]

# 刪除所有未使用的數(shù)據(jù)卷
docker volume prune [OPTIONS]
  • 示例
# 刪除testvolume數(shù)據(jù)卷
docker volume rm testvolume

# 刪除所有未使用的數(shù)據(jù)卷
docker volume prune
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泻帮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子计寇,更是在濱河造成了極大的恐慌锣杂,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件番宁,死亡現(xiàn)場離奇詭異元莫,居然都是意外死亡,警方通過查閱死者的電腦和手機蝶押,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門柒竞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人播聪,你說我怎么就攤上這事朽基。” “怎么了离陶?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵稼虎,是天一觀的道長。 經(jīng)常有香客問我招刨,道長霎俩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任沉眶,我火速辦了婚禮打却,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谎倔。我一直安慰自己柳击,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布片习。 她就那樣靜靜地躺著捌肴,像睡著了一般蹬叭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上状知,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天秽五,我揣著相機與錄音,去河邊找鬼饥悴。 笑死坦喘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的西设。 我是一名探鬼主播起宽,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼济榨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绿映,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤擒滑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叉弦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丐一,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年淹冰,在試婚紗的時候發(fā)現(xiàn)自己被綠了库车。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡樱拴,死狀恐怖柠衍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晶乔,我是刑警寧澤珍坊,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站正罢,受9級特大地震影響阵漏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翻具,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一履怯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裆泳,春花似錦叹洲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仅叫。三九已至,卻和暖如春糙捺,著一層夾襖步出監(jiān)牢的瞬間诫咱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工洪灯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坎缭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓签钩,卻偏偏與公主長得像掏呼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子铅檩,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容