前戏
假设我们启动了一个mysql容器,我们添加的数据都是在容器里面的,当容器挂掉之后我们的数据也会丢失。我们可以把容器内部的数据存放到宿主机上,当容器挂掉之后也不影响我们的数据。
可以在执行Docker create或者docker run时,通过-v参数 将主机的目录作为容器的数据卷,这部分的功能是基于本地文件系统的volume管理。
数据持久化 Data Volume
如果你看过mysql的Dockerfile,里面有一行是这样的 VOLUME [/var/lib/mysql] ,意思就是启动一个mysql的容器时,会将容器里面的/var/lib/mysql里的文件挂载到宿主机上
启动mysql5.7的镜像
docker run -d --name mydb -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
-e MYSQL_ALLOW_EMPTY_PASSWORD=true 表示密码可以为空
查看 volume
docker volume ls
上面的VOLUME NAME对应的我们挂载的名字,那他的路径是在哪里?我们可以通过 docker volume inspect <VOLUME NAME>来查看
docker volume inspect 自己的VOLUME NAME
如果删除容器,volume是不会删除的
删除volume,通过docker volume rm <VOLUME NAME>
docker volume rm 6c6de0ab3191ee293b
这个默认的VOLUME NAME太不好记了,我们也可以在启动容器的时候,加个 -v参数自己指定
docker run -d --name mydb -v mysql:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
其中的mysql就是VOLUME NAME的值,:后面的是mysql容器里存放数据的地方
我们进入到容器内部创建一个zouzou的数据库
docker exec -it mydb /bin/bash
mysql -uroot -p
删除mydb容器,在创建一个新的mysql容器,指定-v参数,挂载到之前VOLUME NAME 为mysql的上面
进入到容器内部,查看刚才我们新建的zouzou数据库是否存在
可以看到,我们创建的zouzou数据库是存在的,这样的话,当我们的容器出现事故之后,只需要重新启动一个,挂载到之前的VOLUME NAME上就可以了
数据持久化 Bind Mouting
data volume 需要在 Dockerfile 定义 Volume
bind mounting 只需要 -v 指明 容器外部文件夹和容器映射文件夹的对应关系即可 将本地的文件映射到容器内
还是用mysql镜像举例,使用 bind mouting
docker run -d --name db -v /tmp/test:/var/lib/mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
进入到宿主机的/tmp/test目录下。ls
bind mouting还有一个好处,我们可以把宿主机的代码挂载到容器内部,当我们修改宿主机的代码之后,就可以看到效果了,方便我们调试代码