Docker - Docker数据存储方式:数据卷(Data Volume)
1.什么是数据卷
2.Docker支持的三种数据挂载方式
3.Volume(普通数据卷)
4.bind mounts(绑定数据卷)
5.tmpfs mounts(临时数据卷)
6.三种存储方式适用场景
---------------------------------------------------------------------------------------------------------------------------
1.什么是数据卷
我们都知道在Docker中,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。如果想实现数据的持久化,就需要将容器和宿主机建立联系(将数据从宿主机挂载到容器内),通俗的说,数据卷就是在容器和宿主机之间实现数据共享。
2.Docker支持的三种数据挂载方式
Docker提供了三种不同的方式将数据从宿主机挂载到容器中:volume、bind mounts、tmpfs mounts
volume:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
bind mounts:可以存储在宿主机系统的任意位置
tmpfs mounts:挂载存储在宿主机系统的内存中,不会写入宿主机的文件系统
盗一张官方的图:
3.Volume(普通数据卷)
创建volume数据卷:docker volume create for_nginx
查看当前所有数据卷信息:docker volume ls
上面一大堆名字为很长字符的数据卷为匿名数据卷,是因为之前创建容器的时候没有手动创建数据卷进行了文件挂载,Docker就会自动创建匿名数据卷。
启动容器并指定数据卷:docker run -itd -p 80:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx:1.10
可以查看下容器具体信息:docker inspect
我们在宿主机数据卷里新增一个a.html
进入容器内部查看是否也增加了a.html文件:docker exec -it f7ad0bee03c2 /bin/bash
浏览器IP/a.html可以直接访问到页面,证明数据卷挂载成功
如果强制删除容器后,数据卷不会被删除,还是会保存在宿主机docker/volumes路径下
4.bind mounts(绑定数据卷)
bind mounts可以将宿主机任意目录挂载到容器内
将宿主机/opt目录挂载到容器内:docker run -itd -p 80:80 --mount type=bind,source=/opt,target=/usr/share/nginx/html nginx:1.10
用docker inspect验证下挂在情况
进入容器查看nginx默认html页面:docker exec -it df4a184600b0 /bin/bash
发现并没有nginx默认的index.html和50.html页面,但浏览器可以正常显示Welcome to nginx!
注:如果你使用Bind mounts挂载宿主机目录到一个容器中的非空目录,那么此容器中的非空目录中的文件会被隐藏,容器访问这个目录时能够访问到的文件均来自于宿主机目录。
5.tmpfs mounts(临时数据卷)
运行容器并绑定临时卷:docker run -itd --mount type=tmpfs,target=/usr/share/nginx/html nginx:1.10
进入容器,创建文件并写入测试数据:
docker exec -it 03e36da4c4a2 /bin/bash
echo test > test.txt
删除容器重新创建容器后发现数据丢失
可见临时卷无法持久化数据
6.三种存储方式适用场景
volumes:
- 多个运行容器间共享数据
- 当Docker主机不确保具有给定的目录或文件
- 备份、恢复、或将数据从一个Docker主机迁移到另一个Docker主机时
bind mount:
- 主机与容器共享配置文件(Docker默认情况下通过这种方式为容器提供DNS解析,通过将/etc/resolv.conf挂载到容器中)
- 共享源代码或build artifacts(比如将Maven的target/目录挂载到容器中,每次在Docker主机中build Maven工程时,容器能够访问到那些rebuilt artifacts)
- 当 docker主机中的文件或目录结构和容器需要的一致时
tmpfs mount:
- 既不想将数据存于主机,又不想存于容器中时(这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能)。