生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。
容器中管理数据主要有两种方式:
- 数据卷:容器内数据直接映射到本地主机环境
- 数据卷容器:使用特定容器维护数据卷
数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。
数据卷特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变的高效方便
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
- 对数据卷的更新不会影响镜像,解耦了应用和数据
- 卷会一直存在,直到没有容器使用,可以安全的卸载它
在容器内创建一个数据卷
1 | docker run -v /dir |



上图的目录即为挂载到容器的本地主机路径
挂载一个主机目录作为数据卷(推荐)
1 | docker run -it -P --name bu -v /opt/a:/b:ro ubuntu:latest /bin/bash |
将主机的/opt/a目录加载到容器的/b目录,权限为只读



本地路径需使用绝对路径,如果目录不存在,Docker会自动创建
Docker挂载的数据卷默认权限是读写(rw)
挂载一个本地主机文件作为数据卷(不推荐)
1 | docker run --rm -it -v ~/1.txt:/2.txt ubuntu /bin/bash |


数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
数据卷容器也是一个容器,它的目的是专门用来提供数据卷供其他容器挂载
1.创建数据卷容器data,并在其中创建一个数据卷挂载到/dbdata
1 | docker run -it -v /dbdata --name data ubuntu |

2.在其他容器中,挂载data容器中的数据卷
1 | docker run -it --volumes-from data --name db1 ubuntu |

3.可以从其他已挂载了数据卷的容器来挂载数据卷
1 | docker run -d --name db2 --volumes-from db1 ubuntu |

4.多次使用--volumes-from参数可从多个容器挂载多个数据卷



5.删除数据卷
数据卷只有在下列情况下才能被删除:
1.docker rm -v删除容器时添加了-v选项
2.docker run --rm运行容器时添加了--rm选项
否则,会在/var/lib/docker/volumes目录中遗留很多不明目录。

利用数据卷容器来迁移数据
可以利用数据卷容器对其中的数据卷进行备份,恢复,以实现数据的迁移。
备份
1 | docker run --privileged --rm --volumes-from data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata |
首先,利用ubuntu镜像创建了一个容器worker;其次,使用--volumes-from参数让worker容器挂载data容器的dbdata数据卷;再次,使用-v参数来挂载本地当前目录到worker容器的/backup目录;
最后,容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata目录下内容备份为容器内的/backup/backup.tar,即本地主机当前目录下的backup.tar



恢复
1.首先创建一个带有数据卷的容器data2
1 | docker run -it -v /dbdata2 --name data2 ubuntu /bin/bash |

2.创建一个新的容器,挂载data2容器的数据卷,并使用tar命令解压备份文件到所挂载的数据卷中
1 | docker run --privileged --volumes-from data2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar -C /dbdata2 |

