Docker Data Volume 詳解及示例
- 1、Docker Data Volume
-
- 1.1 概念介紹
- 1.2 Docker Volume 管理機制
- 1.3 Docker Volume Types
- 1.4 Docker Volume Command Help
- 1.5 Docker Run Volume Command
- 1.6 Sharing volumes Types
- 2、示例 1
-
- 2.1 建立 Docker
- 2.2 檢視現在主機上的 Docker Volume
- 2.3 檢視 Docker busyboxvolume 的 Volumes 挂載位置
-
- 2.3.1 第一種方式
- 2.3.2 第二種方式
- 2.4 進入到宿主的此目錄
- 2.5 進入到 Docker busyboxvolume 的 /mydata 目錄
- 2.6 删除 Docker busyboxvolume
- 2.7 主控端上此目錄下的檔案還存在,
- 3、示例 2 --- 新建立 Docker Volume 綁定指定的主控端目錄,并在兩個 Docker 實作 Volume 共享
-
- 3.1 主控端上建立相關目錄,并建立相關測試文檔
- 3.2 建立 Docker mybox1 ,并檢視相關測試檔案
- 3.2 建立 Docker mybox2 ,使用 Docker mybox1 的 Volume 并檢視相關測試檔案
1、Docker Data Volume
1.1 概念介紹
- Docker鏡像由多個隻讀層疊加而成,啟動容器時,Docker會加載隻讀鏡像層并在鏡像棧頂部添加一個讀寫層
- 如果運作中的容器修改了現有的一個已經存在的檔案,那該檔案将會從讀寫層下面的隻讀層複制到讀寫層,該檔案的隻讀版本仍然存在,隻是已經被讀寫層中該檔案的副本所隐藏,此即“寫時複制(COW)”機制
- 關閉并重新開機容器,其資料不受影響;但删除Docker容器,則其更改将會全部丢失
- 存在的問題:
# 存儲于聯合檔案系統中,不易于主控端通路; # 容器間資料共享不便 # 删除容器其資料會丢失
-
解決方案:“卷(volume)”
“卷”是容器上的一個或多個“目錄”,此類目錄可繞過聯合檔案系統,與主控端上的某目錄“綁定(關聯)”
- Data volumes provide several useful features for persistent or shared data
# Volume于容器初始化之時即會建立,由base image提供的卷中的資料會于此期間完成複制 # Data volumes can be shared and reused among containers # Changes to a data volume are made directly # Changes to a data volume will not be included when you update an image # Data volumes persist even if the container itself is deleted
- Volume的初衷是獨立于容器的生命周期實作資料持久化,是以删除容器之時既不會删除卷,也不會對哪怕未被引用的卷做垃圾回收操作
- 卷為docker提供了獨立于容器的資料管理機制
1.2 Docker Volume 管理機制
卷為docker提供了獨立于容器的資料管理機制:
- 可以把“鏡像”想像成靜态檔案,例如“程式”,把卷類比為動态内容,例如“資料”;于是,鏡像可以重用,而卷可以共享
- 卷實作了“程式(鏡像)”和“資料(卷)”分離,以及“程式(鏡像)”和“制作鏡像的主機”分離,使用者制作鏡像時無須再考慮鏡像運作的容器所在的主機的環境
1.3 Docker Volume Types
Docker有兩種類型的卷,每種類型都在容器中存在一個挂載點,但其在主控端上的位置有所不同:
# Bind mount volume
# a volume that points to a user-specified location on the host file system
# Docker-managed volume
# the Docker daemon creates managed volumes in a portion of the host’s file system that’s owned byDocker
1.4 Docker Volume Command Help
[[email protected]-6 ~]# docker container run --help | grep volume
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
[[email protected]-6 ~]# docker volume --help
[[email protected]-6 ~]# docker container volume --help
1.5 Docker Run Volume Command
# 為 docker run 指令使用 -v 選項即可使用 Volume
# Docker-managed volume
# docker run -it -name bbox1–v /data busybox
# docker inspect -f {{.Mounts}} bbox1
# 檢視bbox1容器的卷、卷辨別符及挂載的主機目錄
# Bind-mount Volume
# docker run -it -v HOSTDIR:VOLUMEDIR --name bbox2 busybox
# docker inspect -f {{.Mounts}} bbox2
1.6 Sharing volumes Types
There are two ways to share volumes between containers.
# 多個容器的卷使用同一個主機目錄,例如
# docker run–it --name c1 -v /docker/volumes/v1:/data busybox
# docker run–it --name c2 -v /docker/volumes/v1:/data busybox
# 複制使用其它容器的卷,為 docker run命 令使用 --volumes-from 選項
# docker run -it --name bbox1 -v /docker/volumes/v1:/data busybox
# docker run -it --name bbox2 --volumes-from bbox1 busybox
2、示例 1
2.1 建立 Docker
[[email protected]-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox
/ # ls # 根目錄下自動建立相關目錄
bin dev etc home mydata proc root sys tmp usr var
/ # cd /mydata/
/mydata # ls
total 0
2.2 檢視現在主機上的 Docker Volume
[[email protected]-6 ~]# docker volume ls
DRIVER VOLUME NAME
local 11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872
local 54373374ed1b7312481af30c8338abca41c22c2900c7d643dd5e522e27e984b2
2.3 檢視 Docker busyboxvolume 的 Volumes 挂載位置
2.3.1 第一種方式
[[email protected]-6 ~]# docker container inspect busyboxvolume
"Mounts": [
{
"Type": "volume",
"Name": "11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872",
"Source": "/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data",
"Destination": "/mydata",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
2.3.2 第二種方式
[[email protected]-6 ~]# docker container inspect -f {{.Mounts.Source}} busyboxvolume
2.4 進入到宿主的此目錄
[[email protected]-6 ~]# cd /var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# ll
total 0
[[email protected]-6 _data]# pwd
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# vim test.txt
[[email protected]-6 _data]# cat test.txt
How are you?
2.5 進入到 Docker busyboxvolume 的 /mydata 目錄
[[email protected]-6 ~]# docker run --name busyboxvolume -it -v /mydata busybox
/ # ls
bin dev etc home mydata proc root sys tmp usr var
/ # cd /mydata/
/mydata # ls
test.txt
/mydata # cat test.txt
How are you?
2.6 删除 Docker busyboxvolume
[email protected]-6 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7abbd3c486a8 busybox "sh" 2 minutes ago Exited (0) 54 seconds ago busyboxvolume
[[email protected]-6 ~]# docker rm busyboxvolume
busyboxvolume
[[email protected]-6 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2.7 主控端上此目錄下的檔案還存在,
不會随着 Docker 的删除還被删除,但是在建立 Docker 時,使用 -rm 選項,會被删除。
[email protected]-6 ~]# cd -
/var/lib/docker/volumes/11168a21d8a53c5b65c65b06587668d03e059020b525073d826fa1ee4230c872/_data
[[email protected]-6 _data]# ll
total 4
-rw-r--r-- 1 root root 13 Nov 23 16:09 test.txt
[[email protected]-6 _data]# cat test.txt
How are you?
3、示例 2 — 新建立 Docker Volume 綁定指定的主控端目錄,并在兩個 Docker 實作 Volume 共享
3.1 主控端上建立相關目錄,并建立相關測試文檔
[[email protected]-6 ~]# mkdir /data/volumes/v1 -pv
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/volumes’
mkdir: created directory ‘/data/volumes/v1’
[[email protected]-6 ~]# cd /data/volumes/v1/
[[email protected]-6 v1]# cat test.txt
Hello!!!
3.2 建立 Docker mybox1 ,并檢視相關測試檔案
[[email protected]-6 ~]# docker run --name mybox1 -it -v /data/volumes/v1:/my/data busybox
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt
Hello!!!
3.2 建立 Docker mybox2 ,使用 Docker mybox1 的 Volume 并檢視相關測試檔案
[[email protected]-6 ~]# docker run --name mybox2 -it --volumes-from mybox1 busybox
/ # ls
bin dev etc home my proc root sys tmp usr var
/ # cd /my/data/
/my/data # ls
test.txt
/my/data # cat test.txt
Hello!!!
[[email protected]-6 ~]# docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
169a543f5345 busybox "sh" About an hour ago Up About an hour mybox2
f250ffc6d357 busybox "sh" About an hour ago Up About an hour mybox1