Docker 存储
资源组成
- 由storage管理的镜像层和容器层。
- Data Volume
storage driver
Docker 的分层结构归功于 Docker storage driver。 Docker 支持多种 storage driver,可以优先使用linux发行版默认的 storage driver。
data volume
本质上是docker host文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。
特点:
- docker volume 是目录或文件,而非未格式化的磁盘。
- 容器可以读写volume中的数据。
- volume 数据可以永久地保存,即使它的容器已被销毁。
bind mount
将host已存在的目录或文件 mount 到容器上
docker run -d -p 80:80 -v <host_path>:<container_path> <image_name>
docker managed volume
# 使用docker managed volume
docker run -d -p 80:80 -v container_path image_name
# 查看data volume
docker inspect docker_id
docker volume inspect docker_id
由docker自己分配volume目录的方式,docker 会在/var/lib/docker/volumes下生成一个目录作为mount源。
不同点 | bind mount | docker managed volume |
---|---|---|
volume目录 | 可任意指定 | var/lib/docker/volumes/… |
对已有mount point的影响 | 隐藏并替换 | docker里原由数据复制到host的volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为可读,默认为读写 | 无控制,均为读写权限 |
移植性 | 与host path绑定 | 移植性强 |
数据共享
容器和host共享数据
- bind mount 直接将共享的目录mount到容器
- docker managed volume 需要在容器启动后,将数据复制到docker生成的目录
- docker cp 可以在容器和host之间复制数据
容器之间共享数据
- bind mount 将共享的数据mount到多个容器
- volume container
volume container
# 创建docker container
docker create --name vc_name -v host_path:container_path -v ... image_name
# 使用volume container
docker run --name name -d -p 80 --volumes-from vc_name image_name
使用容器专门为其他容器提供volume。统一管理,实现了容器和host的解耦。但数据最后还是在host里。
data-packed volume container
创建镜像
FROM image:latest
ADD context_data container_path
VOLUME container_path
创建镜像,容器
# 创建镜像
docker build -t datapacked .
# 创建容器
docker create --name vc_data datapacked
比较适合静态数据