Docker(五)之数据卷

简介

  • 容器有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据;
  • 数据卷是一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性:
    1. 数据卷可以在容器之间共享和重用;
    2. 对数据卷的修改会立即生效;
    3. 对数据卷的更新,不会影响镜像;
    4. 数据卷默认会一直存在,即使容器已被删除;
  • 数据卷(Data Volumes):容器内数据直接映射到本地主机环境,你讲会学到如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内;
  • 数据卷容器(Data Volume Containers):使用特定的容器维护数据卷,你将学到如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复;

实验环境

  • 宿主机:Ubuntu-14.04_X64;
  • Docker1.12.6;

数据卷

拉取镜像

  • 从仓库拉取1busybox镜像:
1
$ docker pull busybox

方式一

  • 该操作会在容器内创建一个/data目录,并加载一个数据卷到容器的/data目录;
1
$ docker run -d -it --name busybox_1 -v /data/ busybox

获取挂载信息

  • 进入容器:
1
2
$ docker exec -it busybox_1 /bin/sh
$ ls -l /data
  • 获取目录映射:
1
2
# 形如:/var/lib/docker/volumes/<Container-ID>/_data
$ docker inspect -f '{{ .Mounts }}' busybox_1
  • 此时无论在映射目录还是在容器目录中操作数据,数据都是同步的;
  • 数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷;
  • 数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。
  • 若需要在删除容器的同时移除数据卷,可以在删除容器的时候使用docker rm -v命令;
1
2
$ docker stop CONTAINER
$ docker rm -v CONTAINER

方式二(推荐)

  • 使用-v选项也可以指定挂载一个本地主机的目录到容器中作为数据卷,相较方式一,这样更便于操作:
1
$ docker run -it --name busybox_2 -v /data:/data busybox /bin/sh
  • 该方法相当于在本机中指定了要映射的目录,将本地的数据卷/data目录加载到容器中的/data目录;

  • Docker挂载数据卷的默认权限是读写,用户也可以通过:ro指定为只读;

1
docker run --rm -it --name busybox_3 -v /data:/data:ro busybox sh

方式三

  • 使用-v选项也可以指定挂载一个本地文件到容器中作为数据卷;
1
$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
  • 如此就可以记录在容器中输入的命令历史了,如果直接挂载文件到容器中,当在容器中修改文件时,可能造成文件的inode改变,而导致报错;
  • 故不推荐挂载文件到容器中并修改文件,可以选择以只读方式挂载文件到容器中作为数据卷。

数据卷容器

使用方式

  • 若有一些持续更新的数据需要在容器之间共享,建议创建数据卷容器;
  • 创建数据卷容器:
1
$ docker run -d -it -v /data:/data/ --name busybox_data_1 busybox
  • 在其他容器中使用-volumes-from来挂载dbdata容器中的数据卷;
1
2
$ docker run -d -it --volumes-from busybox_data_1 --name busybox_4 busybox
$ docker run -d -it --volumes-from busybox_data_1 --name busybox_5 busybox
  • 此时容器busybox_4busybox_5都挂载了同一个数据卷,即/data目录,并且它们之间是同步的;
  • 同时还允许使用多个--volumes-from来挂载来自多个容器的多个数据卷;
  • 使用--volumes-from选项所挂载数据卷的容器,本身并不需要保持在运行状态;
  • 在数据卷容器在创建时,可以选择创建数据卷中三种方式的任意一种;

备份数据

  • 首先利用busybox镜像创建1个容器worker,使用--volumes-from选项挂载数据卷容器busybox_data
  • 使用-v选项挂载本地目录/backupworker容器目录/backup
  • 启动成功后,执行tar -cvf /backup/backup.tgz /data命令,将/data目录下的内容备份到/backup/backup.tgz,即宿主机的/backup/backup.tgz
1
2
# 忽略警告:tar: removing leading '/' from member names
$ docker run --rm --volumes-from busybox_data_1 -v /backup:/backup busybox tar -cvf /backup/backup.tgz /data

还原数据

  • 若还原数据到一个容器,首先创建一个带有空数据卷的容器busybox_data_2
1
$ docker run -d -it -v /data2:/data --name busybox_data_2 busybox
  • 创建新的容器,挂载busybox_data_2容器卷中的数据卷,并使用tar解压备份文件到挂载的容器卷中;
1
$ docker run --rm --volumes-from busybox_data_2 -v /backup:/backup busybox tar -xvf /backup/backup.tgz -C /
  • 为了查看/验证还原的数据,可以再启动一个容器挂载同样的容器卷来查看;
1
$ docker run --volumes-from busybox_data_2 --name busybox_6 busybox /bin/ls /data