Docker(五)

Posted by Run-dream Blog on December 4, 2018

Docker 存储

资源组成

  1. 由storage管理的镜像层和容器层。
  2. Data Volume

storage driver

Docker 的分层结构归功于 Docker storage driver。 Docker 支持多种 storage driver,可以优先使用linux发行版默认的 storage driver。

data volume

本质上是docker host文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。

特点:

  1. docker volume 是目录或文件,而非未格式化的磁盘。
  2. 容器可以读写volume中的数据。
  3. 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共享数据

  1. bind mount 直接将共享的目录mount到容器
  2. docker managed volume 需要在容器启动后,将数据复制到docker生成的目录
  3. docker cp 可以在容器和host之间复制数据

容器之间共享数据

  1. bind mount 将共享的数据mount到多个容器
  2. 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

比较适合静态数据