当前位置: 代码迷 >> 综合 >> Docker数据存储方式:数据卷(Data Volume)
  详细解决方案

Docker数据存储方式:数据卷(Data Volume)

热度:76   发布时间:2023-10-28 10:07:36.0

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:

  • 既不想将数据存于主机,又不想存于容器中时(这可以是出于安全的考虑,或当应用需要写大量非持久性的状态数据时为了保护容器的性能)。
  相关解决方案