docker数据的持久化一直用的是-v的方式,又叫Bind Mounts(目录绑定),偶然间发现还有一种通过卷轴来实现持久化的方式,翻了下资料,整理了一下两种方式使用的场景。
-v(Bind Mounts)
- 用法:该用法比较常见,用于直接执行docker run命令时,做目录映射来实现持久化,一般不用于Dockerfile中,因为Dockerfile
常常跨平台使用,而linux和windows目录结构不同。两个目录会实时同步 - 适合:用于如nginx,php-fpm等服务,源数据宿主机自定义目录,适合源数据需要经常查看修改的服务
- 说明:与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),比如容器目录内本来有数据,但宿主机目录为空,那么容器内也会空,所以配置文件映射需要提前准备好配置文件
docker -name nginx -v 宿主机/app/wwwroot:容器内/usr/share/nginx/html
验证绑定:
docker inspect nginx
-volume
- 用法:常用于Dockerfile文件中,如在其中声明volume /usr/share/zoninfo,那么在docker的安装目录volumes文件夹夹中会自动生成一个随机字符的文件夹来存储文件( /var/lib/docker/volumes/XXX),里面就是类似-v的映射文件。如不想随机字符,可以先声明一个卷,然后使用-v去挂载进去(就是将原宿主机目录改为卷名)
- 适合:用于如mysql,mongodb等数据库类服务,源数据均位于docker根目录的volumes中,适合单纯备份数据,且不对源数据做查看修改,适合Dockerfile文件中,用户忘记-v则自动持久化到卷。
dockerfile声明匿名卷
声明自定义名卷
ocker volume create nginx-vol // 创建一个自定义容器卷
docker volume ls // 查看所有容器卷
docker volume inspect nginx-vol // 查看指定容器卷详情信息
docker stop edc-nginx // 暂停容器实例
docker rm edc-nginx // 移除容器实例
docker volume rm edc-nginx-vol // 删除自定义数据卷
应用自定义卷
# docker run -d -it --name=nginx -p 80:80 -v nginx-vol:/usr/share/nginx/html nginx
ps.映射这边有个bug,比如你将windows的www目录映射到nginx内,然后通过-v映射到php-fpm容器内,这时通过laravel等框架访问会巨慢,因为框架往往需要加载很多文件, 然因为windows和linux系统的关系加载会很慢(常见于虚拟机跑linux开发的时候),解决方法是容器内不要使用windows映射进来的目录,linux复制一份映射进去。