Docker 数据管理

1 本章背景知识

在生产环境中使用 Docker 的过程中,往往需要对数据进行持久化或者在多个容器之间进行数据共享,这涉及到容器的数据管理操作
容器中管理数据的两种方式:

本章首先介绍在容器内部创建数据卷,并且把本地目录或文件挂载到容器内的数据卷中。接着,会介绍如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。

1.1 什么是Docker 的数据卷?

数据卷是一个可供容器使用的特殊目录,他将宿主机操作系统目录映射进入容器内部,类似Linux的 mount 操作。
数据卷可以提供很多有用的特性,如下所示:

容器
容器
Kingbase
进程
Kingbase...
/data
/data
/home/kingbase/data
/home/kingbase/data
位于宿主机文件系统上的/data
位于宿主机文件系统上的/data
容器从宿主机文件系统的/data目录映射到容器/home/kingbaes/data
容器从宿主机文件系统的/data目录映射到容器/home/kingb...
kingbase 进程会影响同一目录的数据。
kingbase 进程会影响同一目录的数据。
Text is not SVG - cannot display

2 Docker 数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式使用数据卷容器。数据卷容器也是容器,主要目的是提供数据卷供其他容器挂载。

容器A容器B容器C
这个宿主机运行了3 个容器,每一个都通过-v 命令指向了宿主机上的/var/db/tables 目录,这里没有数据容器。
这个宿主机运行了3 个容器,每一个都通过-v 命令指向了宿主机上的/var/db/tables 目录,这里没有数据容器。
容器A容器B容器C
数据容器(dbdata)
/var/db/tables
数据容器(dbdata)...
这个宿主机现在运行了4个容器。前一个宿主机运行的3个容器通过--volumnes-from 标志均指向数据容器。
这个宿主机现在运行了4个容器。前一个宿主机运行的3个容器通过--volumnes-from 标志均指向数据容器。
/var/db/tables
/var/db/tables
每个容器单独挂载该目录,因此如果文件夹的位置有变动或者挂载需要挪动位置的话,每个容器都需要重新配置。
每个容器单独挂载该目录,因此如果文件夹的位置有变动或者挂载需要挪动位置的话,每个容器都需要重新配置。
Text is not SVG - cannot display

2.1 创建一个数据卷容器 dbdata

docker run -it -v /dbdata --name dbdata centos:7.2.1511 

2.2 创建其他容器

可以使用 --volumnes-from 挂载dbadata 容器中的数据卷。
例如,创建db1和db2 两个容器,并从 dbdata 容器挂载数据卷:

docker run -it --volumes-from dbdata --name db1 centos:7.2.1511  
docker run -it --volumes-from dbdata --name db2 centos:7.2.1511  

此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata 目录。

2.3 查看数据卷中的数据

  1. 在dbdata容器中创建一个 kingbase 文件
docker  start -i dbdata 
cd /dbdata
touch kingbase 
ls
  1. 在db1或db2 容器内查看文件是否存在。
docker start -i db1 
cd /dbdata
ls 

3 匿名和具名数据卷

Docker 匿名数据卷
Docker 实名数据卷
关于数据卷是否更多信息请参考 Docker 数据卷是否自动删除

4 Docker 保留容器的bash历史

在一个容器中进行实验室,用户退出bash 环境中,将会失去命令的历史记录。

docker run -e HIST_FILE=/root/.bash_history -v=$HOME/.bash_history:/root/.bash_history -ti centos7.2.1511  /bin/bash

将容器内部的root目录下的 bash 历史文件映射到宿主机上。

Note

docker run 命令中使用 -rm 命令时,匿名卷将会被一起删除。