存储管理

  • docker 为容器提供了两种存储资源

    • 数据层: 包括镜像层和容器层,由 storage driver管理。
    • Data Volume
  • Data Volume 有两种类型: bind mount 和 docker managed volume。

    • bind mount 可实现容器与 host之间,容器与容器之间共享数据。
    • volume container: 是一种具有更好移植性的容器间数据共享方案,特别是 data-packed volume container。
  • 容器中的数据管理方式:

    • 数据卷: 容器内数据直接映射到本地主机环境
    • 数据卷容器: 使用特定的容器维护数据

数据卷

  • 数据卷是一个可供一个或多个容器使用的特殊目录,他将主机操作系统目录直接映射到容器,类似mount

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 数据卷默认会一直存在,即使容器被删除
  • 创建数据卷,数据卷路径: /var/lib/docker/volumes/

    1
    [root@docker  ~]# docker volume create -d local test
  • 在用docker run命令时,使用-mount选项使用数据卷

    类型 说明
    volume 普通数据卷,在/var/lib/docker/volume下
    bind 绑定数据卷,映射到主机指定路径
    tmpfs 临时数据卷,只存在内存中
  • 挂载刚刚创建的数据卷到容器中--mount source=要挂载的数据卷,target=挂载到容器的路径 镜像名

    1
    [root@docker  ~]# docker run -d -P --name nginx --mount source=test,target=/webapp nginx
  • 默认挂载的镜像是读写权限,可以设置为只读

    1
    [root@docker  ~]# docker run -d -P --name nginx --mount source=test,target=/webapp:ro nginx
  • 直接挂载主机目录到容器

    1
    2
    3
    # docker run -it -v /宿主机绝对目录:/容器内目录 镜像名
    # 带权限的命令: docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
    [root@docker ~]# docker run -it -v /myDataVolume:/dataVolumerContainer centos

权限问题

  • Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied

  • 解决办法:在挂载目录后多加一个--privileged=true参数即可

  • 例如:docker run -t -i --privileged centos:latest bash

数据卷容器

  • 本身就是一个容器,专门提供数据卷给其他容器,用于多个容器数据共享。

  • 创建数据卷容器,并将一个数据卷挂载到此容器下

    1
    [root@docker ~]# docker run -it -d -v /dbdata --name dbdata ubuntu
  • 创建db1和db2都挂载到同一个数据卷/dbdata目录下

    1
    2
    [root@docker ~]# docker run -it --volumes-from dbdata --name db1 ubuntu
    [root@docker ~]# docker run -it --volumes-from dbdata --name db2 ubuntu
  • 向三个容器中任意一个/dbdata目录下写入,其他容器都可以看到

  • 可以使用--volumes-from参数来从多个容器挂载多个数据卷,也可以从其他已挂载的数据卷容器来挂载数据卷

    1
    [root@docker ~]# docker run -d --name db3 --volumes-from db1 training/postgres
  • 如果删除了挂载卷的容器,数据卷并不会自动删除,如果要删除数据卷,必须在删除最后一个挂载着他的容器时使用

    1
    2
    # 删除容器 nginx01, 并删除容器挂载的数据卷:
    docker rm -v nginx01

数据迁移

  • 备份

    1
    2
    3
    4
    5
    6
    [root@docker ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

    # --name worker ubuntu 使用ubuntu镜像创建名为worker的容器
    # --volumes-from dbdata 让worker容器挂载dbdata容器的数据卷
    # -v $(pwd):/backup 挂载本地的当前目录到worker容器的/backup目录
    # tar cvf /backup/backup.tar /dbdata 将/dbdata下内容备份为容器内的/backup/backup.tar
  • 恢复:

    1
    2
    3
    4
    # 创建一个带有数据卷的容器dbdata2
    [root@docker ~]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
    # 创建另一个新的容器,挂载dbdata2的容器,并解压备份文件到所挂载的容器卷中
    [root@docker ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

常用命令

volume create 创建数据卷
volume inspect 查看数据卷详情
volume ls 列出数据卷
volume prune 清理无用数据卷
volume rm 删除数据卷