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