容器中的管理數(shù)據(jù)主要有兩種方式:
- 數(shù)據(jù)卷(Data Volumes): 容器內(nèi)數(shù)據(jù)直接映射到本地主機環(huán)境;
- 數(shù)據(jù)卷容器(Data Volume Containers): 使用特定容器維護數(shù)據(jù)卷。
1.數(shù)據(jù)卷
數(shù)據(jù)卷(Data Volumes)是一個可供容器使用的特殊目錄,它將主機操作系統(tǒng)目錄直接
映射進容器除盏,類似于Linux中的mount行為芦拿。
數(shù)據(jù)卷可以提供很多有用的特性:
- 數(shù)據(jù)卷可以在容器之間共事和重用,容器間傳遞數(shù)據(jù)將變得高效與方便帘营;
- 對數(shù)據(jù)卷內(nèi)數(shù)據(jù)的修改會立馬生效图谷,無論是容器內(nèi)操作還是本地操作翩活;
- 對數(shù)據(jù)卷的更新不會影響鏡像,解摘開應用和數(shù)據(jù)
- 卷會一直存在便贵,直到?jīng)]有容器使用菠镇,可以安全地卸載它
1.1 創(chuàng)建數(shù)據(jù)卷
創(chuàng)建命令:
docker volume create -d local test
-d的意思是:Specify volume driver name (default "local")
此時,查看/var/lib/docker/volumes 路徑下承璃,會發(fā)現(xiàn)所創(chuàng)建的數(shù)據(jù)卷位置:
[root@localhost ~]# ll /var/lib/docker/volumes/
total 24
-rw-------. 1 root root 32768 Jul 22 17:59 metadata.db
drwxr-xr-x. 3 root root 19 Jul 22 17:59 test
# metadata.db是一個volumes的元數(shù)據(jù)庫文件利耍,不用管它
查看數(shù)據(jù)卷的詳細信息:
[root@localhost ~]# docker volume inspect test
[
{
"CreatedAt": "2019-07-22T17:59:37+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
]
volume除了以上介紹的子命令外,還有l(wèi)s(列出已有數(shù)據(jù)卷)盔粹、prune(清理無用數(shù)據(jù)卷)隘梨、rm(刪除數(shù)據(jù)卷)等。
1.2 綁定數(shù)據(jù)卷
除了使用 volume 子命令來管理數(shù)據(jù)卷外舷嗡,還可以在創(chuàng)建容器時將主機本地的任意路徑掛載到容器內(nèi)作為數(shù)據(jù)卷轴猎,這種形式創(chuàng)建的數(shù)據(jù)卷稱為綁定數(shù)據(jù)卷。
在用docker [container] run命令的時候进萄,可以使用-mount選項來使用數(shù)據(jù)卷捻脖。
-mount選項支持三種類型的數(shù)據(jù)卷烦秩,包括:
- volume:普通數(shù)據(jù)卷,映射到主機/var/lib/docker/volumes路徑下郎仆;
- bind:綁定數(shù)據(jù)卷,映射到主機指定路徑下兜蠕;
- tmpfs:臨時數(shù)據(jù)卷扰肌,只存在于內(nèi)存中。
下面演示這三種操作示例:
1.2.1 volume
1.創(chuàng)建一個數(shù)據(jù)卷
docker volume create -d local test
2.啟動容器熊杨,并綁定該數(shù)據(jù)卷:
docker run -it --mount type=volume,source=test,destination=/opt centos /bin/bash
該命令可以簡寫為(老版寫法):
docker run -it -v test:/opt centos /bin/bash
3.在容器內(nèi)部創(chuàng)建一個文件曙旭,并編輯信息:
[root@3a99d6382de8 /]# cd /opt/
[root@3a99d6382de8 opt]# echo hello >> a.txt
[root@3a99d6382de8 opt]# cat a.txt
hello
4.在本地操作系統(tǒng)查看該路徑的變化:/var/lib/docker/volumes/test/_data
[root@localhost _data]# cd /var/lib/docker/volumes/test/_data/
[root@localhost _data]# ls
a.txt
[root@localhost _data]# cat a.txt
hello
5.在本地操作系統(tǒng)/var/lib/docker/volumes/test/_data路徑下創(chuàng)建一個文件,并編輯信息:
[root@localhost _data]# echo docker >> b.txt
[root@localhost _data]# cat b.txt
docker
[root@localhost _data]# ls
a.txt b.txt
6.進入到docker容器中晶府,查看/opt:
[root@3a99d6382de8 opt]# ls
a.txt b.txt
[root@3a99d6382de8 opt]# cat b.txt
docker
該示例說明了:本地操作系統(tǒng)數(shù)據(jù)卷和容器內(nèi)的數(shù)據(jù)掛載點是雙向互通聯(lián)動的桂躏,一端改動另一端也會跟著改動。
1.2.2 bind
1.啟動容器川陆,并與主機某個目錄綁定:
docker run -it --mount type=bind,source=/opt/data/test,destination=/opt centos /bin/bash
該命令可以簡寫為(老版寫法):
docker run -it -v /opt/data/test:/opt centos /bin/bash
注意:/opt/data/test
必需要先創(chuàng)建好剂习。
- 在容器/opt目錄下創(chuàng)建文件,并編輯內(nèi)容:
[root@a6f3b85a996e /]# cd /opt/
[root@a6f3b85a996e opt]# echo hello >> a.txt
[root@a6f3b85a996e opt]# cat a.txt
hello
- 在主機/opt/data/test路徑進行查看:
[root@localhost test]# cd /opt/data/test/ && ll
total 4
-rw-r--r--. 1 root root 6 Jul 22 18:35 a.txt
[root@localhost test]# cat a.txt
hello
- 在主機/opt/data/test路徑創(chuàng)建文件较沪,并編輯內(nèi)容:
[root@localhost test]# echo docker >> b.txt
[root@localhost test]# ls
a.txt b.txt
- 在容器/opt目錄下進行查看:
[root@a6f3b85a996e opt]# ls
a.txt b.txt
[root@a6f3b85a996e opt]# cat b.txt
docker
該示例說明了:本地操作系統(tǒng)數(shù)據(jù)目錄和容器內(nèi)的數(shù)據(jù)掛載點是雙向互通聯(lián)動的鳞绕,一端改動另一端也會跟著改動。
1.2.3 tmpfs
略
2.數(shù)據(jù)卷容器
如果用戶需要在多個容器之間共享一些持續(xù)更新的數(shù)據(jù)尸曼,最簡單的方式是使用數(shù)據(jù)卷容器们何。數(shù)據(jù)卷容器也是一個容器,但是它的目的是專門提供數(shù)據(jù)卷給其他容器掛載控轿。
- 創(chuàng)建一個數(shù)據(jù)卷容器冤竹,并在啟動創(chuàng)建數(shù)據(jù)卷掛載到/opt/data:
docker run -it -v /opt/data --name data-volume --hostname data-volume centos
此處的/opt/data指的是容器內(nèi)的掛載點,不是主機的茬射。
- 可以在其他容器啟動時使用--volumes-from來掛載data-volume容器中的數(shù)據(jù)卷鹦蠕,例如:
docker run -it --volumes-from data-volume --name web --hostname web centos
- 在web容器的/opt/data目錄下新建文件,并編輯內(nèi)容:
[root@web /]# cd /opt/data/
[root@web data]# echo hello >> a.txt
[root@web data]# cat a.txt
hello
- 在數(shù)據(jù)卷容器的/opt/data目錄下進行查看:
[root@data-volume data]# cd /opt/data/ && ls
a.txt
[root@data-volume data]# cat a.txt
hello
- 在數(shù)據(jù)卷容器的/opt/data目錄下新建文件躲株,并編輯內(nèi)容:
[root@data-volume data]# echo docker >> b.txt
[root@data-volume data]# ls
a.txt b.txt
- 在web容器的/opt/data目錄下進行查看:
[root@web data]# ls
a.txt b.txt
[root@web data]# cat b.txt
docker
該示例說明了:數(shù)據(jù)卷容器和使用該數(shù)據(jù)卷容器的容器的數(shù)據(jù)掛載點是雙向互通聯(lián)動的片部,一端改動另一端也會跟著改動。