【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 我们为什么要持久化
- 数据保护
容器中的数据默认是非持久的,如果容器被删除,其中的数据将会丢失。数据持久化可以确保数据的长远保存和可恢复性
- 数据共享
通过数据持久化,可以实现容器之间与宿主机之间的数据共享,提高数据的使用率
- 灵活性
数据持久化提供了灵活的数据管理策略,可以根据需求选择不同的持久化方案
2、数据卷挂载
2.1数据卷
使用场景
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]# ls
CentOS-aliyun-lhr.repo epel-aliyun.repo[root@localhost data]# docker exec -it v1 bash -c "ls opt"
CentOS-aliyun-lhr.repo epel-aliyun.repo
[root@localhost data]#
2.2 匿名卷
#匿名卷,只指定容器内路径,没有指定宿主机路径信息,宿主机自动生成/var/lib/docker/volumes/<卷ID>/_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/_data
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
[root@localhost /]# docker exec -it nginx bash -c "ls etc/nginx"
conf.d fastcgi_params mime.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 g1
g1
[root@localhost /]# ls /var/lib/docker/volumes/
23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061 backingFsBlockDev g1 metadata.db
[root@localhost /]# #列出当前所有的卷
[root@localhost /]# docker volume list
DRIVER VOLUME NAME
local 23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061
local 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]# ls
23e56f50455bf97fae49039698051b80ab4cdb146eb78a20141d670edcb3a061 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]# ls
50x.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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1df93e81b625 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:32768->80/tcp, :::32768->80/tcp nginx01
9fc065d03682 nginx:latest "/docker-entrypoint.…" 17 minutes ago Up 17 minutes 80/tcp nginx
38831bec3f39 centos:7 "/bin/bash" 26 minutes ago Up 26 minutes v1
940b182e84be nginx:latest "/docker-entrypoint.…" 18 hours ago Exited (0) 18 hours ago gfy
f58fc14af255 nginx:latest "/docker-entrypoint.…" 18 hours ago Exited (137) 18 hours ago web2
364c9fd174dd nginx:latest "/docker-entrypoint.…" 18 hours ago Exited (137) 18 hours ago web1
[root@localhost _data]#
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 bash
4976432b33b3b8657b116372dcb49f35055e654fecdf85fe8311075028126099
[root@localhost _data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4976432b33b3 centos:7 "bash" 16 seconds ago Up 15 seconds web1#在 web1 容器内部,我们向这两个数据卷中分别写入了文件。
[root@localhost _data]# docker exec -it web1 bash
[root@4976432b33b3 /]# ls
anaconda-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 data2
ABC.txt
[root@4976432b33b3 /]# ls data1
abc.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 bash
1e34476e222133c5ea2e26e7814e4838e1a64b4c3cef511e40872db8673915ab#在 web2 容器内部,我们可以验证是否能够访问到 web2 中的数据卷内容。[root@localhost _data]# docker exec -it web2 bash
[root@1e34476e2221 /]# ls
anaconda-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 data1
abc.txt
[root@1e34476e2221 /]# ls data2
ABC.txt
[root@1e34476e2221 /]#
3.3 使用场景
- 使用场景
数据卷容器适用于需要在多个容器之间共享数据,或者需要持久化存储数据的场景。例如,在Web应用中,可以使用数据卷容器来存储用户的上传文件或数据库数据。
- 限制与注意事项
使用数据卷容器时需要注意以下几点:数据卷容器本身并不运行任何应用,只是作为数据存储使用;当数据卷容器被删除时,其上的所有数据也将被删除,因此需要谨慎操作;数据卷容器的性能和宿主机文件系统的性能密切相关,因此需要根据实际需求进行选择和优化。