> 技术文档 > 【DOCKER】-3 数据持久化

【DOCKER】-3 数据持久化


文章目录

    • 1、持久化的简要介绍
      • 1.1 什么类型的数据需要持久化
      • 1.2 我们为什么要持久化
    • 2、数据卷挂载
      • 2.1数据卷
      • 2.2 匿名卷
      • 2.3 命名卷
      • 2.4 特点与优势
    • 3、 数据卷容器
      • 3.1 介绍
      • 3.2 数据卷容器的使用
      • 3.3 使用场景

1、持久化的简要介绍

1.1 什么类型的数据需要持久化

  1. 重要的数据
  2. 易丢失的数据
  3. 需要回溯的数据

1.2 我们为什么要持久化

  • 数据保护

容器中的数据默认是非持久的,如果容器被删除,其中的数据将会丢失。数据持久化可以确保数据的长远保存和可恢复性

  • 数据共享

通过数据持久化,可以实现容器之间与宿主机之间的数据共享,提高数据的使用率

  • 灵活性

数据持久化提供了灵活的数据管理策略,可以根据需求选择不同的持久化方案

2、数据卷挂载

2.1数据卷

使用场景

【DOCKER】-3 数据持久化

 docker run 命令的以下格式可以实现数据卷-v, --volume=[host-src:]container-dest[:<options>]<options>ro 从容器内对此数据卷是只读,不写此项默认为可读可写rw 从容器内对此数据卷可读可写,此为默认值#指定宿主机目录或文件格式: -v <宿主机绝对路径的目录或文件>:<容器目录或文件>[:ro] #将宿主机目录挂载容器目录,两个目录都可自动创建案例:[root@localhost ~]# docker run -itd --name v1 -v /data/:/opt centos:7 38831bec3f3983127d0782ab9fb07c9b0c44d28b2087042e8e808ae9ed586dc0[root@localhost ~]# ls /data/[root@localhost data]# lsCentOS-aliyun-lhr.repo epel-aliyun.repo[root@localhost data]# docker exec -it v1 bash -c \"ls opt\"CentOS-aliyun-lhr.repoepel-aliyun.repo[root@localhost data]# 

2.2 匿名卷

#匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes//_data目录,并挂载至容器指定路径-v <容器内路径>#示例:docker run --name nginx -v /etc/nginx nginx#使用inspect命令查看匿名卷的挂载位置[root@localhost /]# docker inspect 9fc065d03682...\"Mounts\": [ { \"Type\": \"volume\", \"Name\": \"23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061\", \"Source\": \"/var/lib/docker/volumes/23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061/_data\", \"Destination\": \"/etc/nginx\",...#查看挂载情况[root@localhost /]# ls var/lib/docker/volumes/23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061/_dataconf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params[root@localhost /]# docker exec -it nginx bash -c \"ls etc/nginx\"conf.dfastcgi_paramsmime.types modules nginx.conf scgi_params uwsgi_params[root@localhost /]# 

2.3 命名卷

#命名卷将固定的存放在/var/lib/docker/volumes//_data-v <卷名>:<容器目录路径>#可以通过以下命令事先创建,如可没有事先创建卷名,docker run时也会自动创建卷docker volume create <卷名>#示例[root@localhost /]# docker volume create g1g1[root@localhost /]# ls /var/lib/docker/volumes/23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061 backingFsBlockDev g1 metadata.db[root@localhost /]# #列出当前所有的卷[root@localhost /]# docker volume listDRIVER VOLUME NAMElocal 23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061local g1[root@localhost /]# #案例[root@localhost /]# docker run -itd -P --name nginx01 -v g1:/usr/share/nginx/html nginx:latest 1df93e81b625ccfd62c3f6b6ef62c050057687fd33458060dc64d12f8ea493a7[root@localhost /]# cd /var/lib/docker/volumes/[root@localhost volumes]# ls23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061 backingFsBlockDev g1 metadata.db[root@localhost volumes]# ls g1/_data[root@localhost volumes]# ls g1/_data/50x.html index.html[root@localhost volumes]# cd g1/_data/[root@localhost _data]# ls50x.html index.html[root@localhost _data]# vim index.html [root@localhost _data]# mv index.html index.html.bak[root@localhost _data]# vim index.html[root@localhost _data]# docker ps -aCONTAINER ID IMAGE COMMAND  CREATED  STATUSPORTS  NAMES1df93e81b625 nginx:latest \"/docker-entrypoint.…\" About a minute ago Up About a minute  0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx019fc065d03682 nginx:latest \"/docker-entrypoint.…\" 17 minutes ago Up 17 minutes  80/tcp  nginx38831bec3f39 centos:7 \"/bin/bash\"  26 minutes ago Up 26 minutes v1940b182e84be nginx:latest \"/docker-entrypoint.…\" 18 hours ago Exited (0) 18 hours ago gfyf58fc14af255 nginx:latest \"/docker-entrypoint.…\" 18 hours ago Exited (137) 18 hours ago web2364c9fd174dd nginx:latest \"/docker-entrypoint.…\" 18 hours ago Exited (137) 18 hours ago web1[root@localhost _data]# 

【DOCKER】-3 数据持久化

【DOCKER】-3 数据持久化

2.4 特点与优势

  • 特点

数据卷是Docker提供的一种持久化机制,它将数据存储在宿主机的文件系统中,并可以跨多个容器共享这些数据。数据卷的生命周期独立于容器,即使容器被删除,数据卷仍然存在。

  • 优势

首先,数据卷提供了一种将数据持久化的方法,使得在容器被删除或重新启动后,数据仍然可以被访问。其次,由于数据卷是绕过联合文件系统的,因此其性能要优于容器的文件系统。最后,数据卷可以被多个容器共享,这使得容器之间可以方便地共享数据。

3、 数据卷容器

3.1 介绍

  • 概念

数据卷容器是一个专门用于存储数据的Docker容器,它通过将数据保存在宿主机上的某个目录中,实现了数据的持久化和共享。

  • 用途

数据卷容器主要用于在Docker容器之间共享和持久化数据,解决了容器数据易失性的问题。它可以被多个容器同时挂载,从而实现容器间的数据共享。

3.2 数据卷容器的使用

#创建一个 web1 的数据卷容器,它有两个数据卷: /data1 和 /data2[root@localhost _data]# docker run -itd --name web1 -v /data1 -v /data2 centos:7 bash4976432b33b3b8657b116372dcb49f35055e654fecdf85fe8311075028126099[root@localhost _data]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4976432b33b3 centos:7 \"bash\" 16 seconds ago Up 15 seconds web1#在 web1 容器内部,我们向这两个数据卷中分别写入了文件。[root@localhost _data]# docker exec -it web1 bash[root@4976432b33b3 /]# lsanaconda-post.log bin data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var[root@4976432b33b3 /]# ls data1[root@4976432b33b3 /]# ls data2[root@4976432b33b3 /]# echo \"gfy\" >> data1/abc.txt[root@4976432b33b3 /]# echo \"GFY\" >> data2/ABC.txt[root@4976432b33b3 /]# ls data2ABC.txt[root@4976432b33b3 /]# ls data1abc.txt[root@4976432b33b3 /]# exit exit#创建新的容器 web2 ,并使用 --volumes-from 选项将 web1 容器中的数据卷挂载到web2 中。这样, web2 就可以访问 web1 中的数据卷了。[root@localhost _data]# docker run -itd --volumes-from web1 --name web2 centos:7 bash1e34476e222133c5ea2e26e7814e4838e1a64b4c3cef511e40872db8673915ab#在 web2 容器内部,我们可以验证是否能够访问到 web2 中的数据卷内容。[root@localhost _data]# docker exec -it web2 bash[root@1e34476e2221 /]# lsanaconda-post.log bin data1 data2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var[root@1e34476e2221 /]# ls data1abc.txt[root@1e34476e2221 /]# ls data2ABC.txt[root@1e34476e2221 /]# 

3.3 使用场景

  • 使用场景

数据卷容器适用于需要在多个容器之间共享数据,或者需要持久化存储数据的场景。例如,在Web应用中,可以使用数据卷容器来存储用户的上传文件或数据库数据。

  • 限制与注意事项

使用数据卷容器时需要注意以下几点:数据卷容器本身并不运行任何应用,只是作为数据存储使用;当数据卷容器被删除时,其上的所有数据也将被删除,因此需要谨慎操作;数据卷容器的性能和宿主机文件系统的性能密切相关,因此需要根据实际需求进行选择和优化。