容器中的数据在未设置时, 宿主机与其他容器是不感知, 其生命周期与容器生命周期保持一致; 然而数据的持久化是常见的需求, 例如记录关键日志; Docker 中支持两种方式的数据持久化:
- 挂载数据卷(Volume)
- 挂载主机目录(Bind Mounts)
上图展示了Docker 数据管理的架构, 可供理解;
挂载数据卷
数据卷定义
数据卷
是供一个或多个容器使用的目录, 存在诸多特性: 容器间共享, 修改即可生效, 生命周期独立于容器;
数据卷命令
1 | docker volume --help |
数据卷操作
创建一个数据卷:
docker volume create
创建一个
my-vol
数据卷:docker volume create
1
2[root@VM-0-13-centos ~]# docker volume create my-vol
my-vol查看所有数据卷信息:
docker volume ls
1
2
3[root@VM-0-13-centos ~]# docker volume ls
DRIVER VOLUME NAME
local my-vol发现刚创建的数据卷已出现在列表中;
查看指定数据卷信息:
docker volume inspect
1
2
3
4
5
6
7
8
9
10
11[root@VM-0-13-centos ~]# docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
启动一个挂载数据卷的容器:
docker run --mount
docker run
命令中可选参数-mount
用于指定数据卷的挂载, 一次可以指定多个数据卷;1
2
3
4
5
6[root@VM-0-13-centos ~]# docker run -d -P \
--name webs \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:v2
c3f5eb699108de48074cb8050e9b811eb1d4a518ce35fe7fbe60040d8f82525c查看数据卷的具体信息:
docker inspect [CONTAINERNAME]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18[root@VM-0-13-centos ~]# docker inspect webs
[
....
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
....
]删除数据卷:
docker volume rm [VOLUMENAME]
数据卷
是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷
,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷
。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm -v
这个命令。无主的数据卷可能会占据很多空间,要清理请使用以下命令
挂载主机目录
挂载主机目录到指定Docker
容器目录中, 是最直接的方式;
挂载主机目录充当数据卷
使用--mount
标记可以指定一个本地主机目录到容器中:
1 | docker run -d -v -P --name web --mount source=webapp,target=/usr/share/nginx/html nginx:v2 |
查看容器详情:
1 | docker inspect web |
挂载主机文件充当数据卷
--mount
标记也可以从主机挂载单个文件到容器中
1 | [root@VM-0-13-centos ~]# docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:18.04 bash |