容器中的管理數據主要有兩種方式:
- 數據卷(Data Volumes): 容器內數據直接映射到本地主機環(huán)境;
- 數據卷容器(Data Volume Containers): 使用特定容器維護數據卷。
1.數據卷
數據卷(Data Volumes)是一個可供容器使用的特殊目錄,它將主機操作系統(tǒng)目錄直接
映射進容器,類似于Linux中的mount行為。
數據卷可以提供很多有用的特性:
- 數據卷可以在容器之間共事和重用,容器間傳遞數據將變得高效與方便;
- 對數據卷內數據的修改會立馬生效,無論是容器內操作還是本地操作;
- 對數據卷的更新不會影響鏡像,解摘開應用和數據
- 卷會一直存在,直到沒有容器使用,可以安全地卸載它
1.1 創(chuàng)建數據卷
創(chuàng)建命令:
docker volume create -d local test
-d的意思是:Specify volume driver name (default "local")
此時,查看/var/lib/docker/volumes 路徑下,會發(fā)現所創(chuàng)建的數據卷位置:
[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的元數據庫文件,不用管它
查看數據卷的詳細信息:
[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(列出已有數據卷)、prune(清理無用數據卷)、rm(刪除數據卷)等。
1.2 綁定數據卷
除了使用 volume 子命令來管理數據卷外,還可以在創(chuàng)建容器時將主機本地的任意路徑掛載到容器內作為數據卷,這種形式創(chuàng)建的數據卷稱為綁定數據卷。
在用docker [container] run命令的時候,可以使用-mount選項來使用數據卷。
-mount選項支持三種類型的數據卷,包括:
- volume:普通數據卷,映射到主機/var/lib/docker/volumes路徑下;
- bind:綁定數據卷,映射到主機指定路徑下;
- tmpfs:臨時數據卷,只存在于內存中。
下面演示這三種操作示例:
1.2.1 volume
1.創(chuàng)建一個數據卷
docker volume create -d local test
2.啟動容器,并綁定該數據卷:
docker run -it --mount type=volume,source=test,destination=/opt centos /bin/bash
該命令可以簡寫為(老版寫法):
docker run -it -v test:/opt centos /bin/bash
3.在容器內部創(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)數據卷和容器內的數據掛載點是雙向互通聯動的,一端改動另一端也會跟著改動。
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)建文件,并編輯內容:
[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)建文件,并編輯內容:
[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)數據目錄和容器內的數據掛載點是雙向互通聯動的,一端改動另一端也會跟著改動。
1.2.3 tmpfs
略
2.數據卷容器
如果用戶需要在多個容器之間共享一些持續(xù)更新的數據,最簡單的方式是使用數據卷容器。數據卷容器也是一個容器,但是它的目的是專門提供數據卷給其他容器掛載。
- 創(chuàng)建一個數據卷容器,并在啟動創(chuàng)建數據卷掛載到/opt/data:
docker run -it -v /opt/data --name data-volume --hostname data-volume centos
此處的/opt/data指的是容器內的掛載點,不是主機的。
- 可以在其他容器啟動時使用--volumes-from來掛載data-volume容器中的數據卷,例如:
docker run -it --volumes-from data-volume --name web --hostname web centos
- 在web容器的/opt/data目錄下新建文件,并編輯內容:
[root@web /]# cd /opt/data/
[root@web data]# echo hello >> a.txt
[root@web data]# cat a.txt
hello
- 在數據卷容器的/opt/data目錄下進行查看:
[root@data-volume data]# cd /opt/data/ && ls
a.txt
[root@data-volume data]# cat a.txt
hello
- 在數據卷容器的/opt/data目錄下新建文件,并編輯內容:
[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
該示例說明了:數據卷容器和使用該數據卷容器的容器的數據掛載點是雙向互通聯動的,一端改動另一端也會跟著改動。