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

posted @ 2020-02-08 13:50  邹邹很busy。  阅读(527)  评论(0编辑  收藏  举报