docker--持久化存储

前戏

假设我们启动了一个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还有一个好处,我们可以把宿主机的代码挂载到容器内部,当我们修改宿主机的代码之后,就可以看到效果了,方便我们调试代码

原文地址:https://www.cnblogs.com/zouzou-busy/p/12150204.html