这篇我们要学习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
主机的目录文件即可修改。