Docker学习笔记第四篇-存储篇

这篇我们要学习Docker的持久化存储和数据共享。

我们知道相比于镜像而言,容器是可进行读写的。但是当我们删除了容器之后,之前的读写数据也会被清空。

Docker通过一种机制将数据写的时候mapDocker主机或者某个存储。这样即使Docker容器删了,数据源还会保留。

image-20181029172230225

Docker持久化数据的方案

  1. 基于本地文件系统的Volume。可以在执行Docker create或者Docker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。
  2. 基于pluginVolume,支持第三方的存储方案,比如NASaws

Volume的类型

  1. 受管理的data Volume,由docker后台自动创建。
  2. 绑定挂在的Volume,具体挂载位置可以由用户指定。
数据持久化:Data Volume

场景:想保存容器中的一些数据。

image-20181029174801504

我们再建个mysql2

image-20181029175506921

我们将容器删除看看卷组还在不:

1
2
3
4
5
6
7
8
9
10
[vagrant@docker-host ~]$ docker stop mysql1 mysql2
mysql1
mysql2
[vagrant@docker-host ~]$ docker rm mysql1 mysql2
mysql1
mysql2
[vagrant@docker-host ~]$ docker volume ls
DRIVER VOLUME NAME
local 716b55775a4cc3109f108500bd8788a89969096a890ce76d190a3b329cb2d372
local cee5e18509f45c7e9229bd2bab87bb9a0d0b9bda12c2eb3b480ab03cd034fd2a

上面的volume名字不是很友好,我们可以为volume指定一个好记得名字。

我们现在新建一个容器指定volume的名字。

1
2
3
4
5
6
7
8
9
[vagrant@docker-host ~]$ docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true  mysql

[vagrant@docker-host ~]$ docker volume ls
DRIVER VOLUME NAME
local mysql

# 强制删除正在运行的容器
[vagrant@docker-host ~]$ docker rm -f mysql1
mysql1

将第一个容器删除我们可以使用保留下来的容器。

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主机的目录文件即可修改。

知识就是财富
如果您觉得文章对您有帮助, 欢迎请我喝杯水!