CSI

CSI: Container Storage Interface

CSI提供容器的数据持久化服务.

容器管理数据的两种方式:

数据卷(Volumes)

挂载主机目录(bind mounts)

临时文件系统(tmpfs)

数据存储原理

如果host上目录不存在,docker会自动创建

如果container上目录不存在,docker会自动创建

如果container目录存在且有内容,会被host上的目录覆盖掉,但不会被删除.

Volumes

volumes是被设计用来持久化数据的,它的生命周期独立于容器.数据卷通过docker volume命令管理的,位于/var/lib/docker/volumes/下面.

Docker不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。

创建:

1
2
$ docker volume create <volume-name>
$ docker volume rm <volume-name>

使用:

1
2
$ docker run -v/--volume myvolume:/var/lib/app ...
$ docker run --mount source=myvolume,target=/var/lib/app ...

Bind mount

bind mount就是直接将host路径挂在到docker.

使用:

1
2
$ docker run -v/--volume /opt/app:/var/lib/app:ro ...
$ docker run --mount type=bind,source=/opt/app,target=/var/lib/app,readonly ...

tmpfs

tmpfs是临时文件系统,也叫内存文件系统,就是将数据存在内存上。

tmpfs只能用于linux, 多个容器也不能共享,容器停止数据就销毁。

使用–mount可以指定参数,使用–tmpfs不能指定参数。

使用:

1
2
$ docker run --mount type=tmpfs,destination=/tmp/app,tmpfs_size=10G tmpfs_mode=1777 ...
$ docker run --tmpfs  ...

Docker管理volume

查看:

1
docker volume ls # 查看所有卷

创建volume:

1
2
3
4
docker volume create my-volume 
# mountpoint: /var/lib/docker/volumes/my-volume/_data.
docker run -v/--volume my-volume:/container/path 
# src=/var/lib/docker/volumes/my-volume/_data, dest=/container/path

指定路径作为volume:

1
2
docker run -v /host/path:/container/path ...
# src=/host/path, dest=/container/path

默认随机路径,数据不能持久化:

1
2
3
# src=/var/lib/docker/volumes/... /_data (on host)
docker run -v /path ....
docker run --mount ...