參考資料
Docker容器默認把數(shù)據(jù)存儲到容器內(nèi)部酵镜,當容器刪除的時候赡突,容器內(nèi)的數(shù)據(jù)會同步刪除涵妥。
很多情況下,我們是不希望數(shù)據(jù)被刪除的叉谜,常規(guī)的有2種方式能達到目的:
- 在刪除容器之前將數(shù)據(jù)拷貝到本地听怕。
- 通過數(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