这篇我们要学习Docker的持久化存储和数据共享。
我们知道相比于镜像而言,容器是可进行读写的。但是当我们删除了容器之后,之前的读写数据也会被清空。
Docker通过一种机制将数据写的时候map的Docker主机或者某个存储。这样即使Docker容器删了,数据源还会保留。

Docker持久化数据的方案
- 基于本地文件系统的
Volume。可以在执行Docker create或者Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。 - 基于
plugin的Volume,支持第三方的存储方案,比如NAS,aws。
Volume的类型
- 受管理的
data Volume,由docker后台自动创建。 - 绑定挂在的
Volume,具体挂载位置可以由用户指定。
数据持久化:Data Volume
场景:想保存容器中的一些数据。

我们再建个mysql2。

我们将容器删除看看卷组还在不:
1 | [vagrant@docker-host ~]$ docker stop mysql1 mysql2 |
上面的volume名字不是很友好,我们可以为volume指定一个好记得名字。
我们现在新建一个容器指定volume的名字。
1 | [vagrant@docker-host ~]$ docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql |
将第一个容器删除我们可以使用保留下来的容器。
1 | [vagrant@docker-host ~]$ docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql |
这种持久化是将容器的数据文件映射到volume,通过volume进行数据的存储。
需要持久化的文件在Dockerfile中指定:VOLUME /var/lib/mysql。
适用场景一般是容器本身是数据产生的地方。
数据持久化之Bind Mouting
这个小节我们学习目录映射方式持久化存储数据。
相比于volume方式的持久化Bind Mouting的持久化不需要再Dockerfile中指定volume对应的文件目录,只需要在运行容器的时候指定相互映射的文件或目录。
1 | docker run -v /home/aaa:/root/aaa |
这种方式相互映射的文件或者目录是同步修改的即当我们无论是修改容器内文件还是docker主机对应的文件,映射的文件都会改变。
这个方式对我们开发人员很实用,可以将对应的项目文件映射到容器,只需要修改docker主机的目录文件即可修改。