docker数据卷
一、为什么要用数据卷
Docker的数据持久化即使数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。
Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。
docker分层文件系统
性能差
生命周期与容器相同
docker数据卷
mount到主机中,绕开分层文件系统
和主机磁盘性能相同,容器删除后依然保留
仅限本地磁盘,不能随容器迁移
二、docker卷
docker提供了两种卷:
bind mount
docker managed volume
1.bind mount
(1)基本设置
bind mount 是将 host 上已存在的目录或文件 mount 到容器。
例如 docker host 上有目录 /data/nginx:
[root@localhost ~]# cd /data/nginx/
[root@localhost nginx]# pwd
/data/nginx
[root@localhost nginx]# ls
index.html
通过 -v 将其 mount 到 nginx容器:
-v 的格式为 host path:container path。
[root@localhost ~]# cd /data/nginx/
[root@localhost nginx]# pwd
/data/nginx
[root@localhost nginx]# ls
index.html
#没有mount之前,可以看到目录/usr/share/nginx/html下面是有两个文件的
[root@localhost nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77f85615efca nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 80/tcp affectionate_meninsky
[root@localhost nginx]# docker exec -it 77f85615efca /bin/bash
root@77f85615efca:/# ls /usr/share/nginx/html/
50x.html index.html
#挂载之后 /usr/share/nginx/html下面只有一个文件了
[root@localhost nginx]# docker run -itd --name=nginx -p 80:80 -v /data/nginx:/usr/share/nginx/html nginx
3c9be3ad8788544f5533f4e1519592f4b37d4a19f4ea584e0b2d96d76d7f510d
[root@localhost nginx]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3c9be3ad8788 nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp nginx
[root@localhost nginx]# docker exec -it nginx ls /usr/share/nginx/html
index.html
[root@localhost nginx]# cat index.html
hello nginx
[root@localhost nginx]# docker exec -it nginx cat /usr/share/nginx/html/index.html
hello nginx
(2)设置权限
默认权限是读写rw,可以在挂载时指定只读ro。 -v选项指定的路径,如果不存在,挂载时会自动创建。创建后宿主机文件会自动覆盖容器的文件。
2.docker managed volume
1.自动创建volume
docker 管理卷 是docker引擎自动为我们创建的。他在创建前会读取镜像中有没有挂载相关的参数,若有,才会自动创建。
测试:
step1:先将之前docker仓库相关的volume回收。
step2:以nginx镜像为例,它并没有关于卷的挂载,所以使用nginx镜像运行容器后,并没有自动为我们创建卷,这就是因为容器本身就没有定义卷的挂载:
反之,registry有定义卷的挂载,所以它可以自动创建卷:
docker inspect demo 中的mounts部分如下:
"Mounts": [
{
"Type": "volume",
"Name": "aa58d391a02d4afcb29d3b4b0f1fdff0e376483f0f7bec1f80026e3d57f03412",
"Source": "/var/lib/docker/volumes/aa58d391a02d4afcb29d3b4b0f1fdff0e376483f0f7bec1f80026e3d57f03412/_data",
"Destination": "/var/lib/registry",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
2.改进方式读方式
由上述代码可以看出,根据镜像中关于卷的定义,会为他自动创建一个卷(source部分),然后把他挂载到"Destination"部分,(Destination是容器内的数据路径),但是这种方式 不好读,source部分的位置是随机分配的,我们可以采用以下方式进行:
[root@server1 ~]# docker volume create vol1
vol1
[root@server1 ~]# docker volume inspect vol1
[
{
"CreatedAt": "2022-03-12T16:34:02+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vol1/_data",
"Name": "vol1",
"Options": {},
"Scope": "local"
}
]
这样一比,比之前的/var/lib/docker/vo